Foro de elhacker.net

Programación => PHP => Mensaje iniciado por: OssoH en 21 Septiembre 2015, 13:15 pm



Título: conexión ssh ejecutar un php
Publicado por: OssoH en 21 Septiembre 2015, 13:15 pm
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

Código
  1. include('Net/SSH2.php');
  2.    $server = "miservidor.es";
  3.    $username = "xxx";
  4.    $password = "xxx";
  5.    $ssh = new Net_SSH2($server);
  6.    if (!$ssh->login($username, $password)) {
  7.        exit('Login Failed');
  8.    }
  9.   $ssh->exec("nohup php carpetaprueba/prueba/wait.php &");
  10.  

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.

Código
  1. <?php
  2. print "<p>Comienzo</p>\n";
  3. for ($i = 0; $i < 2; $i++) {
  4.    print "<p>$i</p>\n";
  5. sleep(15);
  6. }
  7. print "<p>Final</p>\n";
  8.  
  9.  
  10. // El mensaje
  11. $mensaje = "Línea 1\r\nLínea 2\r\nLínea 3";
  12. // Si cualquier línea es más larga de 70 caracteres, se debería usar wordwrap()
  13. $mensaje = wordwrap($mensaje, 70, "\r\n");
  14. // Enviarlo
  15. mail('mail@dominio.es', 'Mi título', $mensaje.'...'.$i);
  16. ?>
  17.  

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.



Título: Re: conexión ssh ejecutar un php
Publicado por: 0roch1 en 21 Septiembre 2015, 17:17 pm
Utiliza

Código
  1.  

http://php.net/manual/es/function.set-time-limit.php


Título: Re: conexión ssh ejecutar un php
Publicado por: OssoH en 21 Septiembre 2015, 17:42 pm
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.


Título: Re: conexión ssh ejecutar un php
Publicado por: engel lex en 21 Septiembre 2015, 17:45 pm
para ver si podemos hacer algo más simple...

que operación haces que dura tanto?


Título: Re: conexión ssh ejecutar un php
Publicado por: MinusFour en 21 Septiembre 2015, 18:00 pm
¿Porque tienes un sleep en primer lugar?


Título: Re: conexión ssh ejecutar un php
Publicado por: 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


Título: Re: conexión ssh ejecutar un php
Publicado por: engel lex en 21 Septiembre 2015, 18:12 pm
por qué no generas el pdf por partes... así con ajax vas llamando cada sección, tal que nunca supere 30 segundos


Título: Re: conexión ssh ejecutar un php
Publicado por: OssoH en 21 Septiembre 2015, 18:22 pm
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.


Título: Re: conexión ssh ejecutar un php
Publicado por: engel lex en 21 Septiembre 2015, 18:40 pm
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


Título: Re: conexión ssh ejecutar un php
Publicado por: MinusFour en 21 Septiembre 2015, 18:41 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.


Título: Re: conexión ssh ejecutar un php
Publicado por: OssoH en 21 Septiembre 2015, 19:34 pm
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


Título: Re: conexión ssh ejecutar un php
Publicado por: OssoH en 22 Septiembre 2015, 14:06 pm
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
Código:

[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]


Título: Re: conexión ssh ejecutar un php
Publicado por: #!drvy en 29 Septiembre 2015, 13:55 pm
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