Mysql
 sql >> Database >  >> RDS >> Mysql

Real max_execution_time per PHP su Linux

Questo è un consiglio piuttosto complicato, ma farà sicuramente quello che vuoi, se sei disposto a modificare e ricompilare PHP.

Dai un'occhiata al codice sorgente PHP su https:// github.com/php/php-src/blob/master/Zend/zend_execute_API.c (il file è Zend/zend_execute_API.c ), alla funzione zend_set_timeout . Questa è la funzione che implementa il limite di tempo. Ecco come funziona su diverse piattaforme:

  • su Windows, crea un nuovo thread, avvia un timer su di esso e, al termine, imposta una variabile globale chiamata timed_out a 1, il core di esecuzione di PHP controlla questa variabile per ogni istruzione, quindi esce (molto semplificato)

  • su Cygwin, usa timer con ITIMER_REAL, che misura reale tempo, incluso qualsiasi sonno, aspettare, qualunque cosa, quindi alzare un segnale che interromperà qualsiasi elaborazione e interrompere l'elaborazione

  • su altri sistemi Unix, usa timer con ITIMER_PROF, che misura solo il tempo CPU impiegato dal processo corrente (ma sia in modalità utente che in modalità kernel). Ciò significa che l'attesa per altri processi (come MySQL) non conta in questo.

Ora quello che vuoi fare è cambiare l'itimer sul tuo Linux da ITIMER_PROF a ITIMER_REAL, cosa che ovviamente devi fare manualmente, ricompilare, installare ecc. L'altra differenza tra questi due è che usano anche un segnale diverso quando il timer scorre fuori. Quindi il mio suggerimento è di cambiare l'ifdef:

#   ifdef __CYGWIN__

in

#   if 1

in modo da impostare sia ITIMER_REAL che il segnale che PHP attende su SIGALRM.

Comunque l'intera idea non è stata testata (la uso per un sistema molto specifico, dove ITIMER_PROF è rotto, e sembra al lavoro), non supportato, ecc. Usalo a tuo rischio. Potrebbe funzionare con PHP stesso, ma potrebbe rompere altri moduli, in PHP e in Apache, se per qualsiasi motivo, usano il segnale SIGALRM o un altro timer.