sql >> Databáze >  >> RDS >> Mysql

Skutečný max_execution_time pro PHP na linuxu

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č.



  1. Nastavení Macports mysql5 pod Snow Leopard

  2. Vytáhněte sloupce z odvozené tabulky a shrňte je do jednoho příkazu MySQL SELECT

  3. Vytvoření prázdného řádku pro opakování řádku

  4. Postgres/JSON - aktualizujte všechny prvky pole