Skocz do zawartości

php cli


Gucci

Rekomendowane odpowiedzi

Mam problem z działaniem jednego ze skryptów, który uruchamiam bezpośrednio z command line na dedyku. Skrypt pobiera pewną ilość danych i je obrabia i po zakończeniu uruchamia się ponownie. Po kilku minutach działania skryptu powstaje problem z cpu iowait i zwiecha.

Moje pytanie czy lepiej wczytać jednorazowo więcej danych z mysql i je obrabiać i zakończyć skryp czy mniejsza ilość danych ale więcej ponownych automatycznych uruchomień skryptu? Jeszcze jedno skrypt uruchamiany z poziomu php poleceniem system() uruchamia się jako kolejny a obecnie działający się kończy czy uruchamiany kolejny jest przedłużeniem obecnie działającego?

Odnośnik do komentarza
Udostępnij na innych stronach

Niezależnie od trybu uruchomiania należy przetwarzać tyle danych na ile zasobów przydzielonych PHP wystarczy. Można to zmienić w PHP.ini.

HTTP 200 usługi IT -> Dariusz Janicki | Realizacja serwisów www oraz oprogramowania w PHP / C# / Golang / Node.js / MySQL/ Laravel
Komory normobaryczne - normobaria.tech Wykonawca montażu i instalacji komory normobarii

Odnośnik do komentarza
Udostępnij na innych stronach

Co do pytania o to czy bardziej się opłaca uruchamiać raz z większą ilością danych/czy wiele razy. Generalnie nie ma złotego środka, trzeba po prostu testować. Mamy różne ograniczenia typu czas oczekiwania do bazy danych, IO, czy np w curlu timeouty. Tak więc trzeba wy kalibrować dany skrypt by miał jak najlepszą wydajność względem wykorzystywanych zasobów (cpu/ram). Jak Mion wspominał pewne ograniczenia są nałożone z poziomu phpa inne mogą być np ze strony serwera http czy też serwera baz danych, ale to można konfigurować.

Jeżeli chodzi o działanie System() to zależy jak konkretnie użyjesz.

System("wget https://google.pl > /dev/null");

To sprawi, że zostanie pobrana strona google.pl a skrypt php zakończy działanie PO pobraniu strony.

System("wget https://google.pl > /dev/null &");

To sprawi, że zostanie pobrana strona google.pl a skrypt php zakończy się PO wywołaniu komendy wget, ale nie będzie czekał na jej wyniki.

Podsumowując, jeżeli nie używałeś &, to skrypt czekał na zakończenie wywołanego polecenia, czyli w sumie trwał w nieskończoność... czyli w końcu brakowało jakiś zasobów.

Odnośnik do komentarza
Udostępnij na innych stronach

Poleceniem system wywołuje ponownie ten sam skrypt co jest uruchomiony tzn najpierw z poziomu command line: php /home/costam.php i ostatnia linia tego pliku zawiera system("php /home/costam.php") po kilku minutach działania powstaje problem iowait. Poszukałem w sieci i to może być problem z prędkością dysku że niby nie wyrabia.

A jak wpływa sleep() w php na pamięć i cpu?

Odnośnik do komentarza
Udostępnij na innych stronach

Generalnie & sprawia, że zadanie które wywołujesz wykonuje się w tle. A skrypt który je uruchomił nie czeka na zakończenie. CZYLI skrypt skrypt costam.php uruchomi skrypt costam.php a sam się zamknie.

W tej chwili masz coś takiego:

<?php

system('uruchom cos....');

czeka... czeka.... czeka...

?>

I to wywołuje kolejne wywołania 'costam.php', masz coraz więcej działających kopii 'coś tam' ale żadna się nie zamyka. Przez co w końcu skrypt natrafia na jakieś limity i się wywala.

Odnośnik do komentarza
Udostępnij na innych stronach

Źle do tego podchodzisz. Bieżący status operacji możesz przechowywać w pamięci współdzielonej np mecache lub w bazie danych, a nawet w pliku i przed uruchomieniem kolejnej operacji status ten odczytać i w zależności od tego podjąć odpowiednią decyzję if / else.

Zobacz też: https://php.net/manual/en/function.proc-open.php

HTTP 200 usługi IT -> Dariusz Janicki | Realizacja serwisów www oraz oprogramowania w PHP / C# / Golang / Node.js / MySQL/ Laravel
Komory normobaryczne - normobaria.tech Wykonawca montażu i instalacji komory normobarii

Odnośnik do komentarza
Udostępnij na innych stronach

dodałem & na końcu polecenia system() i jest nieco lepiej ale nie wiele, zmniejszyłem ilość pobieranych danych ale po 30-40 minutach brakuje ramu i cpu iowait pada..

serwer to:

- procesor xeon e3-1230 v2

- ram: 4 gb ddr3

system: debian

Odnośnik do komentarza
Udostępnij na innych stronach

ale po 30-40 minutach brakuje ramu i cpu iowait pada..

Wiec masz błąd w logice aplikacji i "procesy" ulegają "zapętleniu" jedne się nie kończą i uruchamiasz kojne najprawdopodobniej na tych samych danych przez co dochodzi do takich sytuacji.... Do najbardziej zasobożernych operacji zalicza się: kodowanie video, obróbka dużych plików graficznych, zaawansowane szyfrowanie danych na dużych blokach itd. Jeśli nawet wykonujesz takie operacja to i tak masz błąd aplikacji o jakim pisałem wyżej ... Możesz obserwować wyniki polecania top lub nakładki htop podczas działania twoich skryptów cli możne ci coś to powie w kwestii wąskiego gardła ...

HTTP 200 usługi IT -> Dariusz Janicki | Realizacja serwisów www oraz oprogramowania w PHP / C# / Golang / Node.js / MySQL/ Laravel
Komory normobaryczne - normobaria.tech Wykonawca montażu i instalacji komory normobarii

Odnośnik do komentarza
Udostępnij na innych stronach

zrezygnowałem z pobierania mniejszej ilości danych i pętli uruchomień tego samego skryptu na rzecz 1000 wierszy pobranych za jednym razem i dłuższego działania skryptu i jak narazie nie ma problemu ani z cpu ani ramem. Jak do końca dnia będzie okey to wówczas pomyślę o większej liczbie wierszy.

Odnośnik do komentarza
Udostępnij na innych stronach

Zarchiwizowany

Ten temat przebywa obecnie w archiwum. Dodawanie nowych odpowiedzi zostało zablokowane.

  • Ostatnio przeglądający   0 użytkowników

    • Brak zarejestrowanych użytkowników przeglądających tę stronę.
×
×
  • Dodaj nową pozycję...

Powiadomienie o plikach cookie

Umieściliśmy na Twoim urządzeniu pliki cookie, aby pomóc Ci usprawnić przeglądanie strony. Możesz dostosować ustawienia plików cookie, w przeciwnym wypadku zakładamy, że wyrażasz na to zgodę. Warunki użytkowania Polityka prywatności