2012-06-29 11 views
5

Dies ist nicht eine der regulären Fragen, wenn Sleep für Timeout oder solche Sachen gezählt wird. Ok, hier ist das Problem: Ich habe die max_execution_time für PHP als 15 Sekunden eingestellt und im Idealfall sollte diese Zeit überschritten werden, wenn sie das festgelegte Limit überschreitet, tut dies aber nicht. Apache wurde nach der Änderung der php.ini-Datei neu gestartet und ein ini_get ('max_execution_time') ist in Ordnung. Manchmal läuft das Skript bis zu 200 Sekunden, was verrückt ist. Ich habe keinerlei Datenbankkommunikation. Das ganze Skript sucht nach Dateien auf dem Unix-Dateisystem und weist in einigen Fällen auf eine andere JSP-Seite um. Es gibt keinen Schlaf() für das Skript.PHP max_execution_time nicht Zeitüberschreitung

ich berechnen die Gesamtlaufzeit des PHP-Skript wie folgt aus:

Zu Beginn des Skripts I gesetzt:

$_mtime = microtime(); 
$_mtime = explode(" ",$_mtime); 
$_mtime = $_mtime[1] + $_mtime[0]; 
$_gStartTime = $_mtime; 

und die Endzeit ($ _ gEndTime) wird auf ähnliche Weise berechnet.
Die Gesamtzeit wird in einer Shutdown-Funktion berechnet, dass ich registriert habe:

register_shutdown_function('shutdown'); 
............. 
function shutdown() 
{ 
    .............. 
    .............. 
    $_total_time = $_gEndTime - $_gStartTime; 
    .............. 
    switch (connection_status()) 
    { 
    case CONNECTION_NORMAL: 
     .... 
     break; 
     .... 
    case CONNECTION_TIMEOUT: 
     .... 
     break; 
     ...... 
    } 
} 

Hinweis: ich nicht $ _SERVER verwenden kann [ 'REQUEST_TIME'], weil meine PHP-Version nicht kompatibel ist. Das ist scheiße - ich weiß.

1) Nun, meine erste Frage ist offensichtlich, warum läuft mein PHP-Skript auch nach dem eingestellten Timeout-Limit?
2) Apache hat die Timeout-Anweisung, die 300 Sekunden ist, aber die PHP-Binärdatei liest nicht die Apache-Konfiguration und dies sollte kein Problem sein.
3) Gibt es eine Möglichkeit, dass PHP PHP in einen Schlafmodus versetzt?
4) Berechne ich die Ausführungszeit falsch? Gibt es einen besseren Weg, dies zu tun?


Ich bin an dieser Stelle ratlos. PHP-Assistenten - bitte helfen.

Edit: Ich habe gerade herausgefunden, dass die Stream-Vorgänge sind nicht die Ursache mit ein paar Protokollen. Die Verzögerung ist innerhalb des Skripts nur zufällig, auch wenn keine Streaming-Vorgänge ausgeführt werden. Kontextwechsel kann nur der Grund sein. Aber ich habe immer noch keine klare Antwort. Ich schaute Real max_execution_time for PHP on linux auf, aber ich bin nicht sicher, dass ich das ausprobieren möchte. Irgendwelche anderen Vorschläge?

+0

Ich glaube, dass Dateisystem-Operationen auch nicht in Zeitlimit Berechnungen gezählt werden. – lonesomeday

+1

Wissen Sie, Sie können 'microtime (true)' verwenden, um einen 'float' direkt zurück zu bekommen ... – deceze

+0

@lonesomeday: Sind Sie sicher? –

Antwort

7

max_execution_time nur Grenzen Skript Ausführungszeit selbst - CPU-Zeit des Skripts. Wenn der Betriebssystemkontext zu einem anderen Prozess gewechselt ist und dort einige Zeit verbracht hat, wird er ebenfalls nicht gezählt. Das Messen der realen Zeit und das Erwarten eines Timeouts nach 30 Sekunden wird also zu keiner Zeit wahr sein. Und natürlich lässt sie außer Acht jede system, exec oder Netzwerk-Zeiten als auch

+2

In der Tat .. Auch warten auf DB-Abfragen oder die Behandlung von Datenströmen sind aus der Gleichung – Johan

+0

wahr, vergessen zu erwähnen db Sachen;) Danke! – poncha

+0

Ich habe kein System, exec ruft aber auch keinen externen Code an. Werden Dateisystemoperationen innerhalb der max_execution_time-Grenze gezählt? Say, ein fopen() –

0

Wenn Sie nach einer bestimmten Zeitspanne Timeout (nach Kommentaren), warum rufen Sie nicht

$startscript = microtime(); 

//do some stuff 

if (microtime() - $startscript > 1500) 
{ 
    dotimeout(); 
} 


    // do more stuff 

if (microtime() - $startscript > 1500) 
{ 
    dotimeout(); 
} 

    // do more stuff 

if (microtime() - $startscript > 1500) 
{ 
    dotimeout(); 
} 

Sie erhalten die jist. Nicht sehr hübsch, aber könnte funktionieren.

+0

Das könnte funktionieren, wenn ich weiß, wo die Verzögerung passieren wird. Aber in meinem Fall sind die Verzögerungen zufällig. Also zum Beispiel: wenn die erste Prüfung bestanden wird und die microtime() - $ startscript ein Wert ist, der <1500 ist und wenn die Verzögerung kurz vor dem zweiten Aufruf auftritt, ist es wieder dieselbe Geschichte. Danke trotzdem...! –

Verwandte Themen