sql >> Base de Datos >  >> RDS >> Mysql

Real max_execution_time para PHP en Linux

Este es un consejo bastante engañoso, pero definitivamente hará lo que quieras, si estás dispuesto a modificar y recompilar PHP.

Eche un vistazo al código fuente de PHP en https:// github.com/php/php-src/blob/master/Zend/zend_execute_API.c (el archivo es Zend/zend_execute_API.c ), en la función zend_set_timeout . Esta es la función que implementa el límite de tiempo. Así es como funciona en diferentes plataformas:

  • en Windows, cree un nuevo hilo, inicie un temporizador y, cuando finalice, configure una variable global llamada timed_out a 1, el núcleo de ejecución de PHP verifica esta variable para cada instrucción, luego sale (muy simplificado)

  • en Cygwin, use iter con ITIMER_REAL, que mide real tiempo, incluido cualquier sueño, espera, lo que sea, luego emite una señal que interrumpirá cualquier procesar y detener el procesamiento

  • en otros sistemas Unix, use iter con ITIMER_PROF, que solo mide el tiempo de CPU empleado por el proceso actual (pero tanto en modo usuario como en modo kernel). Esto significa que esperar otros procesos (como MySQL) no cuenta en esto.

Ahora lo que quiere hacer es cambiar el temporizador en su Linux de ITIMER_PROF a ITIMER_REAL, lo que por supuesto debe hacer manualmente, recompilar, instalar, etc. La otra diferencia entre estos dos es que también usan una señal diferente cuando se ejecuta el temporizador. afuera. Así que mi sugerencia es cambiar el ifdef:

#   ifdef __CYGWIN__

en

#   if 1

para que establezca tanto ITIMER_REAL como la señal que PHP espera para SIGALRM.

De todos modos, toda esta idea no está probada (la uso para un sistema muy específico, donde ITIMER_PROF está roto, y parece para trabajar), sin soporte, etc. Úselo bajo su propio riesgo. Puede funcionar con PHP en sí mismo, pero podría romper otros módulos, en PHP y en Apache, si por alguna razón, usan la señal SIGALRM u otro temporizador.