Estoy investigando el tema de ejecutar procesos php en segundo plano mediante el uso de las funciones exec(), system() y similares.
Aunque ya me he leido todo lo que he encontrado por ahí, al hacer mis pruebas me encuentro con algunas cosillas que no funcionan como yo esperaba.
A ver si algún buen samaritano me puede ayudar con ellas :)
He creado dos archivos; index.php y exec.php (en el servidor remoto)
El primero solo sirve para lanzar el proceso exec.php en segundo plano al pulsar un link y el segundo es un proceso sin utilidad ninguna, solo para probar.
Aqui pongo los códigos
Index.php
Código PHP:
Hola soy el archivo de inicio de exec.
<br>
Exec es un directorio de pruebas en mi servidor destinado a estudiar la ejecución de procesos en segundo plano con PHP.
<br>
<br>
<a href=index.php?exec=1>Lanzar script en segundo plano</a>
<?php
//ATENCION!! Activar solo en entorno de desarrollo
ini_set('error_reporting', E_ALL | E_NOTICE | E_STRICT);
ini_set('display_errors', 1);
ini_set('track_errors', 'On');
$a=escapeshellcmd("Soy la variable A");
$b=escapeshellarg("Soy la variable B");
if (isset($_GET['exec'])){
//ejecutamos exec.php...
//y le pasamos las variables $a y $b
//y con & forzamos la ejecución en segundo plano.
system('php /var/www/vhosts/mi_servidor/httpdocs/exec/exec.php $a $b >/dev/null &');
echo "<br><br><br>";
echo "Hemos lanzado a ejecutarse el scritp exec.php";
echo "<br>";
echo "y le hemos pasado las variables \$a y \$b que contienen $a y $b respectivamente";
}
Código PHP:
<?php
//Este es un script que actualiza la hora cada 3 segundos durante 20 seg y la imprime.
//Si se ejecuta en primer plano, el navegador estará "recargando la página" durante los 20 segundos e imprimira los resultados en pantalla.
//Si se ejecuta en segundo plano el navegador estará disponible nada más lanzar el script
//y mandará la salida a donde se le indique en la función exec, system o similar empleada para lanzar el proceso
//$i representa la hora en que se lanza el script + 20 segundos
$i=time() + 20;
//Para controlar a que hora lanzamos el script y a que hora debe finalizar
echo date('H:i:s', time());
echo "<br>";
echo date('H:i:s', $i);
echo "<br>";
echo "<br>";
//Mientras que la hora actual sea menor que la hora de inicio del script + 20 seg...
while(time()<$i){
//Capturamos la hora.
$la_hora=time();
//Imprimimos la hora capturada con formato humano.
echo date('H:i:s', $la_hora);
echo "<br>";
//Pausamos el script 3 segundos.
sleep(3);
}
//Recogemos las variables que se han pasado con la función exec, system o similar.
//Para ello se usa el array $argv predefinido en php
$a=$argv[1];
$b=$argv[2];
//mandamos un mail, así verificamos que se ha ejecutado el proceso en segundo plano
mail("[email protected]", "Enviado en segundo plano", "\$a contiene: $a y \$b contiene: $b");
//Información de la ruta absoluta donde está colocado este script.
//necesaria para hacer la llamada al mismo con systme, exec o similar.
echo dirname(__FILE__);
Cuando lo ejecuto en segundo plano desde el index.php (al pulsar el enlace), el archivo se ejecuta. Tarda el tiempo esperado en hacerlo (20 segundos) y envía el mail de control correctamente, pero...
1.- Sigue sin recibir ningun valor en $a y en $b, como si estuvieran vacías
2.- Cuando intento pasar la salida a un fichero de texto con la siguiente variación de la función system, tampoco se graba nada en ese txt. (el fichero exec-output.txt está previamente creado en el servidor, aunque no contiene nada)
Código PHP:
system('php /var/www/vhosts/mi_servidor/httpdocs/exec/exec.php $a $b >/var/www/vhosts/mi_servidor/httpdocs/exec/exec-output.txt &');
¿Como hago para pasar variables desde el script que hace la llamada al que se ejecuta en segundo plano?
¿Como hago para capturar la salida de los echos del exec.php a un fichero?
Desde ya, muchisimas gracias y perdón por el testamento, jejeje.
Un saludo,
GMG