2010-04-23 14 views
5

Estoy ejecutando una gran importación a mi base de datos (aproximadamente 200k registros) y estoy teniendo un problema serio con el tiempo de espera de mi script de importación. Utilicé mi teléfono celular como cronómetro y descubrí que agota el tiempo exactamente 45 segundos por cada pasada (error interno del servidor) ... solo hace unos 200 registros a la vez, a veces menos. Escaneé mi phpinfo() y nada está configurado en 45 segundos; entonces, no tengo ni idea de por qué estaría haciendo esto.PHP Script Veces después de 45 segundos

Mi max_execution_time está establecido en 5 minutos y mi max_input_time está establecido en 60 segundos. También intenté establecer set_time_limit (0); ignore_user_abort (1); en la parte superior de mi página, pero no funcionó.

También puede ser útil tener en cuenta que mi archivo de error dice: "Fin de encabezados de script prematuros" como el error de ejecución.

Cualquier ayuda es muy apreciada.

+0

¿Algún mensaje de error? tienes error_reporting (-1) habilitado, ¿verdad? – Gordon

+0

Acabo de agregar eso como una edición cuando publicaste esto :) Un mensaje de error: "Final prematuro de los encabezados de script" –

+0

Posible duplicado de [Cabeceras prematuras del script: index.php, mod \ _fcgid: leer el tiempo de espera de datos en 61 segundos] (http://stackoverflow.com/questions/14488567/premature-end-of-script-headers-index-php-mod-fcgid-read-data-timeout-in-61-s) – kenorb

Respuesta

0

Es muy posible que esté llegando a un límite de recursos impuestos en su servidor, especialmente si el servidor no está completamente bajo su control.

Suponiendo que se trata de algún tipo de servidor Linux, puede ver los límites de recursos con ulimit -a en la línea de comandos. ulimit -t también le mostrará los límites en el tiempo de la CPU.

Si su CPU es limitada, es posible que deba procesar la importación en lotes.

+0

No lo creo es un límite de recursos ... el script está agotando el tiempo en exactamente 45 segundos .... si fuera algo del tipo de memoria, ¿no sería el tiempo muy inconsistente? –

+0

Puede establecer límites en otras cosas que no sean la memoria, y los hosts del servidor a menudo limitarán el tiempo de CPU para evitar procesos fuera de control. En tal caso, se agotaría el tiempo de espera bastante cerca del límite. Prueba 'ulimit -t' y mira lo que obtienes. – zombat

+0

@Dave: También está RLimitCPU de Apache: http://httpd.apache.org/docs/2.2/mod/core.html#rlimitcpu –

0

En primer lugar, debe ejecutar el script desde la línea de comandos si va a llevar un tiempo. Como mínimo, el navegador agotaría el tiempo de espera después de 2 minutos si no recibe contenido.

php -f filename.php 

Pero si tiene que ejecutar desde el navegador, intente añadir header ("Content-type: text/html") antes de las patadas de importación.

Si está en un host compartido, es posible que haya restricciones en el sistema cuando las consultas y/o scripts de larga ejecución se eliminan automáticamente después de un cierto período de tiempo. Estas restricciones generalmente se liberan para scripts que no se ejecutan en la web. Por lo tanto, ejecutarlo desde la línea de comando ayudaría.

0

Las 45 segundos podría ser una coincidencia - que podría ser el tiempo que toma para que usted alcance el límite de memoria .. aumentar el límite de memoria sería como:

ini_set('memory_limit', '256M'); 

También podría ser la conexión real de db que se está agotando ... ¿qué servidor db estás usando? Para mí, mssql agota el tiempo con un error extremadamente inútil, "El contexto de la base de datos ha cambiado", después de 60 segundos de forma predeterminada. Para evitar esto, lo hace:

ini_set('mssql.timeout', 60 * 10); // 10 min 
15

Probé todas las soluciones en esta página y, por supuesto, que va desde la línea de comandos:

php -f filename.php 

como dice Brent es la manera sensata alrededor de ella .

Pero si realmente desea ejecutar un script desde el navegador que mantiene el tiempo de espera después de 45 segundos con un error de servidor interno 500 (como descubrí cuando la reconstrucción de mi índice de búsqueda phpBB), entonces hay una buena probabilidad de que es causado por mod_fcgid.

I tienen una Plesk VPS y me fijo mediante la edición del archivo de

/etc/httpd/conf.d/fcgid.conf 

Específicamente, cambiado

FcgidIOTimeout 45 

a

FcgidIOTimeout 3600 

3600 segundos = 1 hora. Debe ser lo suficientemente largo para la mayoría, pero ajustar hacia arriba si es necesario. Vi un ejemplo citando 7200 segundos allí.

Finalmente, reinicie Apache para activar la nueva configuración.

apachectl graceful 

HTH alguien. ¡Me ha estado molestando por 6 meses!

Saludos,

ricos

+0

Lo necesitaba tanto, muchas gracias. – DaveE

+3

HTH = "Espero que esto ayude" – AVProgrammer

0

En primer lugar

max_input_time y set_time_limit (0)

sólo funcionará con VPS o servidores dedicados. En lugar de eso, puede seguir algunas reglas para su implementación, como debajo de

  1. Primero lea todo el archivo CSV.
  2. A continuación, obtenga solo 10 entradas (filas) o menos y realice una llamada ajax para importar en DB
  3. Intente llamar a ajax cada vez con 10 entradas y luego resuma algo en el navegador. En este método, su secuencia de comandos nunca tendrá tiempo de espera.
  4. Siga el mismo método hasta que las filas CSV hayan finalizado.
Cuestiones relacionadas