2010-05-14 15 views
7

Los servidores FastCGI, por ejemplo, imponen un límite de tiempo de ejecución en scripts PHP que no pueden modificarse usando set_time_limit() en PHP. IIS también lo cree.PHP: Codificación de secuencias de comandos de larga ejecución cuando los servidores imponen un límite de tiempo de ejecución

Escribí un script de importación para una aplicación PHP que funciona bien bajo mod_php pero falla bajo FastCGI (mod_fcgid) porque el script se cancela después de un cierto número de segundos. Todavía no conozco una forma de detectar cuál es tu límite de tiempo en este caso, y aún no he decidido cómo voy a solucionarlo. Hacerlo en pequeños trozos con redirecciones parece una maldición, pero ¿cómo?

¿Qué técnicas usarías al codificar una tarea de larga duración, como una tarea de importación o exportación, donde el servidor puede finalizar una secuencia de comandos individual después de un determinado número de segundos?

Supongamos que está creando una secuencia de comandos portátil, por lo que no necesariamente sabe si PHP se ejecutará finalmente en mod_php, FastCGI o IIS o si se aplicará un tiempo de ejecución máximo en el nivel del servidor. Probablemente también descarte shell-scripts, etc.

Respuesta

4

Utilice PHP command line interface que no está sujeto a los límites de tiempo de scripts impuestos por los servidores web. Si necesita automatizar la ejecución de su script, puede programarlo con cron.

+4

+1 para usar un cron. Las tareas de ejecución prolongada no se deben ejecutar con un script web –

+0

No entiendo cómo puede esto retrasar el límite de tiempo declarado en php.ini, ¿podría ser más específico? gracias – Benoit

+0

@Benoit Me refería a los límites de tiempo impuestos por el servidor (Apache, IIS, etc.) o el módulo de servidor (FastCGI/fcgid).Cuando se ejecuta desde la línea de comandos, no tendría esos límites particulares, y los únicos límites serían sobre los que PHP tiene control. La desventaja de ejecutar desde la línea de comandos es que no es tan portátil: tendrías que configurarlo de forma diferente para los servidores de Windows o modificarlo de acuerdo con la ruta a tu ejecutable de PHP, etc. Aún así, es una opción. – thomasrutter

-1

De lo que realmente está hablando es de hacer cola de trabajos. Esa es la práctica de ejecutar código PHP de forma asincrónica desde la solicitud de front-end. Hay dos formas principales de hacerlo en PHP. Una es usar un programa llamado Gearman; el otro es usar Zend Server Job Queue, con el que personalmente estoy más familiarizado. Tengo una publicación de blog sobre cómo se puede hacer llamando al Do you Queue. Descubrí que la implementación que tengo allí es inmensamente fácil de usar.

Lo que también puede probar es establecer max_execution_time en 0 antes de ejecutar su lógica.

-1

Hacerlo en trozos pequeños con redireccionamientos parece un kludge, pero ¿cómo?

Así es exactamente como manejé una copia de seguridad completa de la base de datos del foro (phpBB) cuando el mecanismo de exportación incorporado comenzó a alcanzar el límite de max_execution_time.

Lo hice una tabla a la vez, y para las tablas grandes en trozos de 5000 filas. (Resultó que el factor limitante en todo el proceso no era el tiempo de ejecución en la exportación, sino el tamaño de archivo que phpmyadmin podía manejar en la importación).

Después de cada fragmento de exportación, devolví una página con una etiqueta de actualización de meta en el encabezado, redirigiendo la secuencia de comandos a sí misma con el número de tabla del siguiente bloque y la fila de inicio en la cadena de consulta.

<?php if(!$all_done){ 
    $new_url=$_SERVER['PHP_SELF'].'?tablecount='.$count; 
    if(!$tabledone && ""!=$start_row && null!=$start_row){ 
     $new_url.="&startrow=".$start_row; 
    } else { 
     $new_url.="&startrow=0"; 
    } 
    echo('<meta http-equiv="refresh" content="0.5;url='.$new_url.'" />'); 
} ?> 

Los contadores fueron por lo que podrían recorrer una matriz de nombres de tabla que había recuperar con VER TABLAS.

Antes de tener el ingenio para sacrificar la gigantesca tabla de coincidencias de palabras (que phpBB puede reconstruir por sí misma) de la exportación, este script de copia de seguridad tardaría más de media hora en completarse.

Cuestiones relacionadas