Hola :
Necesito ejecutar un php que dura más de 60 segundos y para evitar el timeout del navegador lo que hago es establecer una conexión ssh con mi servidor compartido y ejecutar nohup php <nombre fichero.php> &
El codigo es el siguiente :
prueba.php
include('Net/SSH2.php');
$server = "miservidor.es";
$username = "xxx";
$password = "xxx";
$ssh = new Net_SSH2($server);
if (!$ssh->login($username, $password)) {
exit('Login Failed');
}
$ssh->exec("nohup php carpetaprueba/prueba/wait.php &");
y el wait.php es el fichero "tocho" que tarda mucho en procesar. De momento le tengo puesto un sleep y simplifico el código de forma que lo pueda hacer funcionar.
<?php
print "<p>Comienzo</p>\n";
for ($i = 0; $i < 2; $i++) {
print "<p>$i</p>\n";
sleep(15);
}
print "<p>Final</p>\n";
// El mensaje
$mensaje = "Línea 1\r\nLínea 2\r\nLínea 3";
// Si cualquier línea es más larga de 70 caracteres, se debería usar wordwrap()
$mensaje = wordwrap($mensaje, 70, "\r\n");
// Enviarlo
mail('mail@dominio.es', 'Mi título', $mensaje.'...'.$i);
?>
cuando ejecuto el prueba.php desde el navegador deja la pantalla en blanco (no hay errores) y no envia el email que es la ultima instrucción que hace el php.
En cambio si cambio el sleep(3) en wait.php si que lo ejecuta y envia el correo.
¿Cómo lo hago para que se ejecute en segundo plano y cuando termine de procesar todo el wait.php envie el correo aunque haya cerrado la ventana del navegador?
Muchas gracias.
Utiliza
set_time_limit(0);
http://php.net/manual/es/function.set-time-limit.php
el set_time_limit no puedo modificar en servidores compartidos. En este caso en concreto 1and1.es
Si funcionase el timeout no necesaria hacer una conexion ssh y acceder al CLI php.
De todas formas gracias.
para ver si podemos hacer algo más simple...
que operación haces que dura tanto?
¿Porque tienes un sleep en primer lugar?
Tengo el sleep(x) para simular como si el php durase mucho tiempo en terminar su proceso.
Es decir, el fichero wait.php tendrá otras lineas de código que no tienen nada que ver con el actual, en concreto lo usare para generar un pdf. Esta generación del fichero pdf lleva mucho tiempo de procesamiento, por eso toda la "historia" que quiero montarme.
Espero haberme explicado bien.
REsumiendo, básicamente lo que quiero es ejecutar un fichero php en segundo plano de forma que si cierro la ventana del navegador se siga ejecutando.
Gracias
por qué no generas el pdf por partes... así con ajax vas llamando cada sección, tal que nunca supere 30 segundos
Porque si lo hago así, luego me toca montar todas las partes en un único pdf. Se que hay librerias que lo hacen http://pdfmerger.codeplex.com/ pero no lo veo práctico.
Y porque también al tardar tanto tiempo en crear el pdf (aprox 3 - 5 min) es un coñazo tener al usuario esperando todo ese tiempo sin que se pueda cerrar el navegador.
Veo más práctico que introduzca su email y cuando termine de generarlo enviarselo.
son 3 a 5 minutos -.- no 8 horas... con un progress bar, no es gran cosa... puede tranquilamente usar otras pestañas porque no está usando banda
Cita de: OssoH en 21 Septiembre 2015, 18:10 PM
Tengo el sleep(x) para simular como si el php durase mucho tiempo en terminar su proceso.
Es decir, el fichero wait.php tendrá otras lineas de código que no tienen nada que ver con el actual, en concreto lo usare para generar un pdf. Esta generación del fichero pdf lleva mucho tiempo de procesamiento, por eso toda la "historia" que quiero montarme.
Espero haberme explicado bien.
REsumiendo, básicamente lo que quiero es ejecutar un fichero php en segundo plano de forma que si cierro la ventana del navegador se siga ejecutando.
Gracias
¿Pero porque quieres simular que dure mucho tiempo asi? Si estas preocupado por el max_execution_time de nada te sirve sleep porque no cuenta para max_execution_time. Desde consola PHP no tiene max_exeuction_time a menos que tu proveedor (el del ssh) haya puesto una regla para eso. Y si tienes acceso ssh, estas tan limitado que no puedes cambiar la configuracion de php? Desde consola no deberías tener este tipo de problemas. Cuando ejecutas el interprete de PHP tienes opcion inclusive de negar la configuración del php.ini.
Entonces para que el script duré por ejemplo 3 minutos, haré un bucle grande.
Pensaba que con un sleep era suficiente.
Mañana lo pruebo y os cuento.
Gracias
He cambiado el wait.php quitando el sleep y ahora me sale el siguiente error en el navegador :
Gateway Time-out
The gateway did not receive a timely response from the upstream server or application.
el wait.php ahora es
[code]
<?php
$fecha = date('Y-m-j H:i:s');
echo '<br>'.$fecha;
// $nuevafecha = strtotime ( '+1 hour' , strtotime ( $fecha ) ) ;
$nuevafecha = strtotime ( '+13 minute' , strtotime ( $fecha ) ) ;
//$nuevafecha = strtotime ( '+60 second' , strtotime ( $fecha ) ) ;
$nuevafecha = date ('Y-m-j H:i:s' , $nuevafecha );
echo '<br>'.$nuevafecha;
echo '<br>';
$continuar=true;
$i=0;
while ($continuar) {
// echo '<br>'.$i++;
// echo ob_flush();
if (strtotime(date('Y-m-j H:i:s'))>strtotime($nuevafecha)) $continuar=false;
}
echo 'fin';
// El mensaje
$mensaje = "Fecha inicio:".$fecha.'---Fecha fin:'.$nuevafecha;
$mensaje = wordwrap($mensaje, 70, "\r\n");
mail('micorreo@dominio.es', 'Mi título', $mensaje.'...'.$i);
?>
¿Como puedo hacerlo? Gracias[/code]
Ten en cuenta que el codigo PHP se "compila", ejecuta y ya luego muestra la salida. Es decir, te da timeout porque el script tarda demasiado en responder y el navegador dice que nanai.
Saludos