Je to docela ošemetná rada, ale určitě udělá, co chcete, pokud jste ochotni upravit a překompilovat PHP.
Podívejte se na zdrojový kód PHP na https:// github.com/php/php-src/blob/master/Zend/zend_execute_API.c
(soubor je Zend/zend_execute_API.c
), ve funkci zend_set_timeout
. Toto je funkce, která implementuje časový limit. Zde je návod, jak to funguje na různých platformách:
-
v systému Windows vytvořte nové vlákno, spusťte v něm časovač, a když skončí, nastavte globální proměnnou s názvem
timed_out
na 1, jádro provádění PHP zkontroluje tuto proměnnou pro každou instrukci a poté skončí (velmi zjednodušeno) -
na Cygwin použijte itimer s ITIMER_REAL, který měří skutečné čas, včetně jakéhokoli spánku, čekejte, cokoli, a poté zvedněte signál to přeruší jakékoli zpracování a zastavení zpracování
-
na jiných unixových systémech použijte itimer s ITIMER_PROF, který měří pouze čas CPU strávený aktuálním procesem (ale jak v uživatelském režimu, tak v režimu jádra). To znamená, že čekání na další procesy (jako MySQL) se do toho nepočítá.
Nyní chcete změnit itimer na vašem Linuxu z ITIMER_PROF na ITIMER_REAL, což samozřejmě musíte udělat ručně, překompilovat, nainstalovat atd. Dalším rozdílem mezi těmito dvěma je, že také používají jiný signál, když běží časovač ven. Takže můj návrh je změnit ifdef:
# ifdef __CYGWIN__
do
# if 1
takže nastavíte ITIMER_REAL i signál, na který PHP čeká, na SIGALRM.
Každopádně celý tento nápad je netestovaný (používám ho pro nějaký velmi specifický systém, kde je ITIMER_PROF nefunkční a zdá se do práce), nepodporované atd. Používejte jej na vlastní nebezpečí. Může to fungovat se samotným PHP, ale mohlo by to rozbít další moduly v PHP a v Apache, pokud z jakéhokoli důvodu, použijí signál SIGALRM nebo jiný časovač.