2011-05-10 6 views
14

que tiene una secuencia de comandos realiza copias de seguridad de todos los archivos de un sitio web en un archivo zip (usando un script similar a la respuesta a this question). Sin embargo, para sitios grandes el script expira antes de que pueda completarse.PHP momento escritura de reserva a cabo

¿Hay alguna manera de extender el período de tiempo disponible para la secuencia de comandos para ejecutar? Los sitios web se ejecutan en servidores compartidos de Windows, por lo que no tengo acceso al archivo php.ini.

+0

Probablemente la mejor opción aquí sería usar [shell_exec()] (http://lv.php.net/manual/en/function.shell-exec.php) para ejecutarlo en segundo plano y también ignorar las configuraciones de tiempo de espera . – arma

+0

Plz no se olvide de aceptar una respuesta si se resolvió su problema. –

+1

Ejecutando PHP en Windows? Eso suena como una mala idea. Por otra parte, también estaba ejecutando IE en un Mac. – Xeoncross

Respuesta

11

En pocas palabras; no haga una solicitud HTTP para iniciar el script PHP. Los límites que está experimentando se establecen porque está utilizando una solicitud HTTP, lo que significa que puede tener un tiempo de espera. Una mejor solución sería implementar esto usando un "tarea programada", o lo que Microsoft llama "tareas programadas". La mayoría de los proveedores de alojamiento le permitirán ejecutar dicha tarea en horarios establecidos.Al invocar el script desde la línea de comandos, ya no tiene que preocuparse por los tiempos de espera, pero aún corre el riesgo de tener problemas de memoria.

Si tiene un proveedor de alojamiento decente, ¿por qué no proporciona copias de seguridad diarias para empezar? :)

+0

el proveedor de hosting realiza copias de seguridad diarias; este script es para que los clientes tomen sus propias copias de seguridad sin tener que jugar con FTP – whostolemyhat

+1

+1 mejor respuesta aquí. No cree una página web para hacer copias de respaldo. cron o tareas programadas. –

+0

@Qué, aún así, usar un navegador para solicitar un script de respaldo suele ser muy malo idea, es demasiado propenso a errores.Llame al proveedor de alojamiento y pídales las posibilidades de cronjobs o tareas programadas. –

14

Si se encuentra en un entorno de servidor compartido, y usted no tiene acceso al archivo php.ini, o si desea ajustar los parámetros de PHP en función de cada sitio, se puede utilizar la .htaccess archivo (cuando se ejecuta en un servidor web Apache).

Por ejemplo, con el fin de cambiar el valor max_execution_time, todo lo que tiene que hacer es editar .htaccess (que se encuentra en la raíz de su sitio web, por lo general accesible a través de FTP), y añadir esta línea:

php_value max_execution_time 300 

donde 300 es el número de segundos que desea establecer el tiempo máximo de ejecución para un script php.

También hay otra manera usando ini_set función en el archivo php

por ejemplo. Para establecer el tiempo de ejecución como 5 segundos, puede utilizar

ini_set('max_execution_time', 300); //300 seconds = 5 minutes 

Por favor, hágamelo saber si necesita más aclaraciones.

+0

Desafortunadamente, estos son servidores IIS para que los archivos htaccess no funcionen :( – whostolemyhat

+7

Está bien, no hay problemas ... Gracias por la respuesta. Espero que haya resuelto el problema mediante el método set_time_limit (0) .. si no, aún puede intentarlo Método ini_set() –

+1

Incluso si fuera posible utilizar .htaccess, no aconsejaría usarlo para establecer la configuración de una sola secuencia de comandos. El límite debe cambiarse solo para la secuencia de comandos de copia de seguridad en lugar de para toda la página. – binaryLV

6

Puede utilizar el siguiente en el inicio de la secuencia de comandos:

<?php 
if(!ini_get('safe_mode')){ 
     set_time_limit(0); //0 in seconds. So you set unlimited time 
} 
?> 

Y al final de la secuencia de comandos utilizar flush() función para contar PHP para enviar lo que ha generado.

Hope esto resuelve su problema.

2

Pruebe la función:

set_time_limit(300); 

En las ventanas, hay una ligera posibilidad de que su servicio de hosting que permite a más ajustes de paseo por la posibilidad de subir un archivo php.ini en el directorio raíz de su servidor web. Si es así, cargar un archivo php.ini contiene:

max_execution_time = 300 

para comprobar si las modificaciones tengan efecto, hacer un phpinfo() y comprobar el valor local para max_execution_time.

3

¿El script muestra el mensaje de error "Tiempo de ejecución máximo de xx segundos excedido" o muestra una página en blanco? Si es así, ignore_user_abort podría ser lo que estás buscando. Le dice a php que no detenga la ejecución del script si se pierde la comunicación con el navegador, lo que puede protegerlo de otros mecanismos de tiempo de espera involucrados en la comunicación.

Básicamente, me gustaría hacer esto al comienzo de su script:

set_time_limit(0); 
ignore_user_abort(true); 

Dicho esto, según lo aconsejado por Berry Langerak, no se debe utilizar una llamada HTTP para ejecutar la copia de seguridad. Un cronjob es lo que deberías estar usando. Junto con set_time_limit(0), puede ejecutarse para siempre.

En entornos de alojamiento compartido donde un cambio a la directiva max_execution_time puede ser desautorizado, y donde probablemente no tenga acceso a ningún tipo de línea de comando, me temo que no hay una solución simple (y limpia) para su problema, y ​​la solución más simple es muy a menudo utilizar la solución de respaldo provista por el hoster, si corresponde.

1

Opción 1: Pídale a la compañía de alojamiento que coloque las copias de seguridad en algún lugar accesible por php, para que el archivo php pueda redirigir la copia de seguridad.

Opción 2: divida la secuencia de comandos de copia de seguridad en varias partes, quizás utilice ajax para llamar al script varias veces seguidas, proporcione al usuario una barra de progreso agradable y combine el resultado de las llamadas de secuencia de comandos en un archivo zip con php y ofrecer eso como una descarga.

Cuestiones relacionadas