2010-01-27 12 views
6

Necesito crear un script en lenguaje PHP que realice la permutación de números. Pero PHP tiene un límite de tiempo de ejecución establecido en 60 segundos. ¿Cómo puedo ejecutar el script de modo que si necesita ejecutar más de 60 sesunde, el servidor no lo interrumpa? Sé que puedo cambiar el límite máximo de tiempo de ejecución en php, pero quiero escuchar otra versión que no requiera saber con anticipación el tiempo de ejecución de un script.Evite el límite de tiempo de ejecución de PHP

Un amigo me sugirió que inicie sesión y cierre sesión frecuentemente desde el servidor, pero no tengo ni idea de cómo hacerlo.

Cualquier consejo es bienvenido. Un código de ejemplo sería útil.

Gracias.

Primero necesito ingresar un número, digamos 25. Después de esto, el script se inicia y debe hacer lo siguiente: para cada número < = de 25 creará un archivo con los números generados en el actual escenario; para el próximo número, abrirá el archivo creado anteriormente y creará otra base de archivos en las líneas del archivo abierto, y así sucesivamente. Debido a que esto lleva mucho tiempo, necesito evitar que el servidor emita la secuencia de comandos.

Respuesta

2

@emanuel:

supongo que cuando su amigo le ha hablado "Un amigo me sugirió para firmar y cerrar la sesión con frecuencia desde el servidor, pero no tengo ni idea de cómo hacer esto", él/ella debe han significado "dividir el cálculo de su script en x piezas de trabajo y ejecutarlo por separado"

Por ejemplo, con este script puede ejecutarlo 150 veces para lograr 150! (Factorización) y mostrar el resultado:

// guión nombre: calc.php

<?php 

session_start(); 

if(!isset($_SESSION['times'])){ 

    $_SESSION['times'] = 1; 

    $_SESSION['result'] = 0; 

}elseif($_SESSION['times'] < 150){ 

    $_SESSION['times']++; 

    $_SESSION['result'] = $_SESSION['result'] * $_SESSION['times']; 

    header('Location: calc.php'); 

}elseif($_SESSION['times'] == 150){ 

    echo "The Result is: " . $_SESSION['result']; 

    die(); 

} 

?> 

BTW (@Davmuz), sólo se puede utilizar la función set_time_limit() en servidores Apache, que no es una función válida en servidores Microsoft IIS.

+0

+1 Eso es esencialmente la implementación del lado del cliente de mi respuesta: ponerlo en bits y ejecutarlos uno por uno. Sin embargo, en esta solución, si el navegador está cerrado, el proceso finaliza. –

+1

@turik Como se comenta a continuación: '$ _SESSION ['result'] = 1;' en la línea 5. –

0
set_time_limit(0) 
+0

¿Te das cuenta que dijo específicamente que NO quería esto? –

+0

Aunque esto es exactamente lo que la pregunta requiere, creo que sería mejor, por ejemplo, usar set_time_limit (20) en cada iteración de un ciclo. – svens

+0

@svens Mientras el OP dice específicamente que no quiere cambiar el límite de tiempo, estoy de acuerdo en que probablemente sea la mejor manera de hacerlo. –

0

Se podría tratar de retener las llamadas que desea hacer en una cola, que serializa en un archivo (o la memoria caché?) Cuando se realiza una operación. Entonces podría usar un CRON-daemon para ejecutar esta cola cada sesenta segundos, por lo que continúa haciendo el trabajo y finaliza la tarea.

Los inconvenientes de este enfoque son los problemas de agregar a la cola, con bloqueo de archivos y tal, y si necesita los resultados inmediatamente, esto puede resultar problemático. Si está agregando cosas a un Db, podría funcionar. Además, no es muy eficiente.

0

Uso set_time_limit (0) pero hay que desactivar el safe_mode: http://php.net/manual/en/function.set-time-limit.php Es mejor utilizar un tiempo fijo (set_time_limit (300)) ya que si hay un problema en el guión (bucles sin fin o pérdidas de memoria) esta no puede ser una fuente de problemas.

El servidor web, como Apache, también tiene un límite de tiempo máximo de 300 segundos, por lo que debe cambiarlo. Si desea hacer una aplicación Comet, puede ser mejor elegir otro servidor web que Apache que pueda tener solicitudes largas.

Si necesita un tiempo de ejecución prolongado para un algoritmo pesado, también puede implementar un procesamiento paralelo: http://www.google.com/#q=php+parallel+processing O almacene los datos de entrada y la computadora con otra secuencia de comandos externa con cron o lo que sea.

+0

Por favor, especifique lo que tiene que hacer, las respuestas pueden ser más precisas. – Davmuz

Cuestiones relacionadas