Dies ist ein ziemlich kniffliger Ratschlag, aber er wird definitiv das tun, was Sie wollen, wenn Sie bereit sind, PHP zu modifizieren und neu zu kompilieren.
Schauen Sie sich den PHP-Quellcode unter https:// github.com/php/php-src/blob/master/Zend/zend_execute_API.c
(Die Datei ist Zend/zend_execute_API.c
), bei der Funktion zend_set_timeout
. Dies ist die Funktion, die das Zeitlimit implementiert. So funktioniert es auf verschiedenen Plattformen:
-
Erstellen Sie unter Windows einen neuen Thread, starten Sie einen Timer darauf und setzen Sie nach Beendigung eine globale Variable namens
timed_out
auf 1, prüft der PHP-Ausführungskern diese Variable für jede Anweisung und beendet sich dann (sehr vereinfacht) -
Verwenden Sie auf Cygwin itimer mit ITIMER_REAL, was real misst Zeit, einschließlich Schlaf, warten, was auch immer, dann ein Signal auslösen das wird alle unterbrechen Verarbeitung und Verarbeitung stoppen
-
Verwenden Sie auf anderen Unix-Systemen itimer mit ITIMER_PROF, das nur die vom aktuellen Prozess verbrauchte CPU-Zeit misst (aber sowohl im Benutzermodus als auch im Kernelmodus). Das bedeutet, dass das Warten auf andere Prozesse (wie MySQL) nicht dazu zählt.
Jetzt möchten Sie den Itimer auf Ihrem Linux von ITIMER_PROF auf ITIMER_REAL ändern, was Sie natürlich manuell tun müssen, neu kompilieren, installieren usw. Der andere Unterschied zwischen diesen beiden besteht darin, dass sie auch unterschiedliche Signale verwenden, wenn der Timer läuft aus. Mein Vorschlag ist also, die ifdef:
zu ändern# ifdef __CYGWIN__
in
# if 1
sodass Sie sowohl ITIMER_REAL als auch das Signal, auf das PHP wartet, auf SIGALRM setzen.
Wie auch immer, diese ganze Idee ist ungetestet (ich benutze sie für ein sehr spezifisches System, wo ITIMER_PROF kaputt ist, und es scheint funktionieren), nicht unterstützt usw. Verwenden Sie es auf eigene Gefahr. Es funktioniert vielleicht mit PHP selbst, aber es könnte andere Module in PHP und beschädigen in Apache, wenn sie aus irgendeinem Grund das SIGALRM-Signal oder einen anderen Timer verwenden.