Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> Duże zużycie ram przy skrypcie wywołanym w konsoli
athabus
post
Post #1





Grupa: Zarejestrowani
Postów: 898
Pomógł: 48
Dołączył: 2.11.2005
Skąd: Poznań

Ostrzeżenie: (0%)
-----


Mam taki problem z pogranicza php.

W skrócie na serwerze stoi aplikacja webowa z API. Na tym samym serwerze wywołuję skrypt php w konsoli, który używa tego api do aktualizacji pewnych rzeczy.

Cała filozofia skryptu wygląda tak:
  1. $items=pobierzDane();
  2.  
  3. foreach ($items as item){
  4. $api->updateItem($item)
  5. }


Wszystko działa ładnie, ale... problem pojawia się, gdy jest bardzo dużo elementów do aktualizacji (kilkadziesiąt tysięcy wywołań api w pętli). Po prostu z czasem rośnie zużycie ram i wszystko zaczyna działać coraz wolniej i wolniej. Np. przez pierwsze 2-4 minuty mam aktualizacje 2-5 elementów na sekundę, a np. w 20 minucie działania skryptu jest to 1 element na 2 sekundy.

Jest jakiś sposób aby tą pamięć jakoś uwolnić z poziomu skryptu konsolowego? Nie wiem ogólnie nawet o co dokładnie pytam - chodzi mi o coś takiego aby zwolnić wszystkie zasoby i iść dalej. Ogólnie myślicie, że problemem jest coś w skrypcie konsolowym czy jednak po prostu bardzo duża ilość zapytań do API powoduje taki efekt? Wydaje mi się, że problem leży raczej w skrypcie konsolowym, bo api za każdym razem jest wywoływane i po wywołaniu w teorii pamięć powinna się zwalniać.

Jeśli w czymś może to pomóc to samo api pochodzi ze skryptu Prestashop i chodzi o aktualizację danych produktów, kombinacji etc.
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi
athabus
post
Post #2





Grupa: Zarejestrowani
Postów: 898
Pomógł: 48
Dołączył: 2.11.2005
Skąd: Poznań

Ostrzeżenie: (0%)
-----


Cytat(Crozin @ 25.04.2017, 13:13:27 ) *
Zapewne w pobierzDane bądź updateItem (tak na 90% to właśnie tu jest problem) dochodzi do jakiegoś wycieku pamięci. Jednak bez podglądu kodu możemy sobie jedynie gdybać.


Też to podejrzewam, ale zastanawiałem się czy nie ma jakiegoś fixa typu wywołanie "freeMemory()", który by to naprawił. Ale coś czuję, że nie ma.

Kodu nie wklejam, bo oczywiście w rzeczywistości jest bardziej skomplikowany i trudno byłoby dojść bez testów co jest nie tak.


Cytat(Pyton_000 @ 25.04.2017, 13:34:30 ) *
A nie możesz sobie napisać raw sql które zrobią to co chcesz?


Tak mogę, ale to też się wiąże z pewną niedogodnością. Taki raw SQL po aktualizacji może dać nieoczekiwane efekty uboczne. Np. zmiana pewnej cechy obiektu wywołuje efekt w postaci zmian w kilku innych miejscach - np. zmieniasz nazwę produktu co powoduje update cache atrybutów dla wyszukiwarki itp. Po aktualizacji to się może zmienić i coś tam jeszcze dojść. Używając API wiem, że dany obiekt zostanie zmodyfikowany wraz z "przyległościami" nawet jeśli w międzyczasie coś się zmieni po aktualizacji, a tak po każdej aktualizacji trzeba by przeglądać kod i szukać różnic.
Go to the top of the page
+Quote Post

Posty w temacie


Reply to this topicStart new topic
2 Użytkowników czyta ten temat (2 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 31.12.2025 - 18:36