2013-12-10 8 views
5

Wyrażenie "maksymalny czas wykonania" jest niejednoznaczne: może to oznaczać (a) czas, jaki upłynął od rozpoczęcia skryptu, lub (b) całkowity czas wykonania operacji wykonywany przez skrypt (włączając lub wyłączając pobrane czasy) przez wywołania systemowe).Dokładne znaczenie PHP max_execution_time

Bardzo interesujący post kuba tutaj Real max_execution_time for PHP on linux, stwierdza, że ​​zależy to od tego, czy PHP działa na systemie Unix czy Windows. W istocie stwierdza, że ​​na Unixie jest (b) i na Windowsie lub Cygwin jest (a).

Ale moim serwerem jest Linux 2.6.32-358.18.1.el6.x86_64 # 1 SMP x86_64 x86_64 x86_64 GNU/Linux, a ja mam zadanie cron, które zostaje zgrane po dokładnie 30 sekundach czasu, pomimo jego procesora czas krótszy niż 16 sekund:

[Tuesday, 10-Dec-2013 10:22:33 GMT] Begin, cputime=0 secs. 
[Tuesday, 10-Dec-2013 10:22:58 GMT] starting zip_close, cputime=10.12946 secs. 
[10-Dec-2013 10:23:03 UTC] PHP Fatal error: Maximum execution time of 30 seconds exceeded in xxx.php on line 149 

To zaprzecza odkryciu Kuby. Mój jest PHP 5.3.26 i IU'm mierzy czas procesora z:

function cputime() { 
    $data = getrusage(); 
    return $data['ru_utime.tv_sec'] + $data['ru_utime.tv_usec']/1000000; 

Czy ktoś może wyjaśnić dalej?

Odpowiedz

0

przyjrzeć się dokumentacji:

http://www.php.net/manual/en/info.configuration.php#ini.max-execution-time

jak programiści postanowili wdrożyć wymóg jest to oczywiście inna historia :) to jedne z tych przypadków, w których podstawowa OS wiele spraw. Dostępne interfejsy API dotyczące czasu procesora w danym systemie operacyjnym wyraźnie rzucają światło na problem.

to wymaganie wysokiego poziomu (czas działania skryptu) jest niejednoznaczne i może być interpretowane przez system operacyjny na wiele różnych sposobów. Dowodem są różne czasy, jakie otrzymujesz.

więc istnieje wiele „prawy”, odpowiada dokładnie jeden na OS ...

0

AFAIK jest ona zależna od systemu operacyjnego. W zależności od systemu operacyjnego czas wykonania exec exec lub zapytania na przykład będzie (np. Windows) lub wont (np. Linux) włączony do take for max_execution_time.

+0

Ale chodzi mi o to, że jestem pod Linuksem i wydaje mi się, że używałem miarki czasu, która upłynęła. – user3000292

5

Wszystko zależy od skryptu. getrusage nie jest niezawodnym sposobem pomiaru. Jesteś mylić między 3 metod pomiarowych, a nie 2:

  1. Absolutny czas od uruchomienia skryptu
  2. Środowisko wykonawcze skryptu, tak nazywa 1. System minus
  3. rzeczywisty czas CPU jest zajęty, więc 2. minus inne czasy bezczynności z powodu stanów oczekiwania i tym podobne:

getrusage mierzy 3 i nie jest tym, co jest udokumentowane. W związku z tym widzisz sprzeczne wyniki - najwyraźniej Twój skrypt ma 14 sekund ogólnych stanów oczekiwania i innych nieaktywnych okresów, bez w rzeczywistości przynosi kompletnie podobny do tego z operacji system lub przesyłania strumieniowego.

Jako stan dokumentacji doktora Windows używa metody 1, a systemy * nix używają metody 2. Nikt nie używa 3, ponieważ nie ma to sensu jako limitu czasu - oznaczałoby to, że limity czasu stają się niezwykle agresywne, gdy obciążenie systemu jest wysokie i stany oczekiwania wzrastają.

+0

"To zależy całkowicie od twojego skryptu" - Nie, to zależy całkowicie od kodu PHP i systemu operacyjnego. "Jesteś zdezorientowany" - Nie, nie jestem, Zidentyfikowaliśmy przypadek, w którym zachowanie wyraźnie nie jest tym, co sugeruje kod Kuba, i pytam dlaczego. – user3000292

+0

Tak, to zależy całkowicie od twojego skryptu - 'getrusage' będzie bardzo różnił się w zależności od tego, co faktycznie robisz w skrypcie. Nie zidentyfikowałeś przypadku skrajnego, po prostu źle to oceniasz. Kuba mówi, że skrypt powinien działać przez "30 sekund plus dowolny czas poza PHP". Twój dziennik mówi, że twój skrypt działał od 10:22:33 do 10:23:03, dokładnie 30 sekund. Zakładając, że nie wykonałeś żadnych "systemowych" lub strumieniowych połączeń, jego wypowiedź jest w 100% poprawna. –

Powiązane problemy