2010-01-18 10 views
7

Tengo un script PHP que parecía detenerse después de unos 20 minutos.La secuencia de comandos PHP deja de ejecutarse de forma arbitraria sin errores

Para intentar averiguar por qué, hice un script muy simple para ver cuánto tiempo funcionaría sin ningún código complejo para confundirme.

Descubrí que sucedía lo mismo con este bucle infinito simple. En algún momento entre 15 y 25 minutos de funcionamiento, se detiene sin ningún mensaje o error. El navegador dice "Hecho".

He estado en todas las bestias posible única que podía pensar:

set_time_limit (session.gc_maxlifetime in the php.ini) 
memory_limit 
max_execution_time 

El punto que se detiene la secuencia de comandos no es consistente. Algunas veces se detendrá a los 15 minutos, a veces a los 22 minutos.

Por favor, cualquier ayuda sería muy apreciada.

Está alojado en un servidor 1and1. Los contacté y no brindan soporte para los errores causados ​​por los desarrolladores.

+0

Usted puede ser capaz de generar un proceso separado usando 'exec()'. Tratar de mantener un script en ejecución durante más de 30 minutos mediante la invocación directa del navegador es una locura. –

+0

¿Tiene acceso al error y accede a los registros del servidor? Es probable que le den más información sobre lo que está sucediendo en este caso. Además, ¿puede reproducir el problema localmente? Eso podría darte más opciones en cuanto a la depuración. – objectified

+0

Nah, no tengo acceso a los registros. Eso es una cosa que realmente me enoja. Hice un archivo de registro de error de PHP personalizado csv, pero no hay errores PHP útiles: -/ No lo he probado localmente, ya que lleva tanto tiempo averiguarlo. Me imagino que si funciona correctamente, entonces no tengo ni idea de la configuración oscura de un servidor, o si se detiene, entonces no tengo ni idea acerca de un oscuro problema del navegador. De cualquier manera, no ayuda mucho. Sin embargo, estoy a punto de probar el consejo de James, que parece útil. ¿Alguna otra idea, mientras tanto? – RobHardgood

Respuesta

0

Agradezco los comentarios de todos. Especialmente James Hartig, fuiste muy útil y me enviaste por el camino correcto. Todavía no sé cuál era el problema. Lo tengo para ejecutar en el servidor con SSH, simplemente usando el comando exec() así como el ignore_user_abort(). Pero aún así se agotaría el tiempo de espera. Por lo tanto, solo tuve que dividirlo en pedazos pequeños que durarán solo 2 minutos cada uno, y usar variables de sesión/matrices para almacenar donde lo dejé. Estoy contento de haber terminado con este proyecto bastante simple ahora, y estoy supremamente enojado con 1and1. Oh, bueno ...

+1

Bueno, obtienes lo que pagas. 1 y 1 es barato porque apesta. –

3

En determinado momento, el navegador agota el tiempo de espera y detiene la carga de la página. Si desea probar, abra la línea de comando y ejecute el código allí. La secuencia de comandos debe ejecutarse indefinidamente.

+0

¡Eso es lo que estaba pensando! ¿No hay alguna forma de evitar que el navegador haga eso? Y colorearme como novato, pero mi paquete de hosting 1and1 es el más barato que no admite SSH ... y, hasta donde yo sé, esa es la única forma de acceder a la línea de comandos php, ¿no? – RobHardgood

+0

Sí, esa es básicamente la única forma. ¿Puedo preguntar por qué quieres cargar de forma indefinida? La mayoría de los navegadores (además de los dispositivos móviles) deberían estar bien siempre que los envíe constantemente. –

+0

Bueno, mi ciclo infinito fue solo para probar. La secuencia de comandos que estoy tratando de corregir debe ejecutarse durante unos 30 o 40 minutos, pero sigue deteniéndose después de las 20. Intenté averiguar por qué con esta. Hace eco un poco de texto cada pocos segundos. ¿No es ese el tipo de datos que el navegador necesita para mantener abierta la sesión? – RobHardgood

3

¿ha considerado simplemente ejecuta el script desde la línea de comandos, por ejemplo:

php script.php 

y tienen el guión eliminar un mensaje de vez en cuando que su todavía en marcha:

<?php 

while (true) { 
    doWork(); 
    echo "still alive..."; 
    flush(); 
} 
+0

Estoy intentando esto ahora ... Gracias – RobHardgood

+0

Sí, esto tampoco funcionó – RobHardgood

+0

Intente aumentar el tiempo máximo de ejecución con ini_set ini_set ('max_execution_time', 300); // 5min – AndrewMurphy

1

pienso lo que necesita saber es la hora exacta en que se detiene (puede establecer una hora inicial y seguir eliminando la hora actual menos la inicial). Hay algo en el servidor que detiene el archivo. Además, considere hacer un ini_get para verificar que el tiempo de ejecución sea realmente 0. Si lo desea, establezca el límite de tiempo en 30 y luego CADA ciclo que realice, continúe estableciendo en 30. Cada vez que llame a set_time_limit, el contador se restablece y esto podría permitirle eludir los límites reales. Si esto todavía no funciona, hay algo en los servidores de 1 y 1 que podría matar al script.

Además, ¿has probado el ignore_user_abort?

0

Creo que esto es causado por algún monitor de procesos que mata los "procesos zombis" para permitir recursos a otros usuarios.

Ejecute el ejecutor usando "2> & 1" para registrar cualquier cosa, incluido stderr.

En mi salida me las arreglé para atrapar a este:

... 
script.sh: line 4: 15932 Killed     php5-cli -d max_execution_time=0 -d memory_limit=128M myscript.php 

Así algo (una fuerza externa, no PHP sí mismo) está matando mi proceso!

Yo uso IdWebSpace que es excelente por cierto, pero creo que la mayoría de los proveedores de alojamiento compartido imponen este mecanismo de control de recursos/procesos solo para estar cuerdo.

2

En tales casos, enciendo todas las configuraciones de desarrollo en php.ini, por supuesto en un servidor de desarrollo. Esto muestra muchos más mensajes, incluidas las advertencias de desaprobación.

En mi experiencia de depuración de larga duración scripts php, la causa más común era la falta de asignación de memoria (Fatal error: Permitido el tamaño de la memoria de bytes xxxx agotado ...)

Cuestiones relacionadas