Ver Mensaje Individual
  #1 (permalink)  
Antiguo 10/07/2013, 04:58
gmonterog
 
Fecha de Ingreso: mayo-2012
Ubicación: Palma de Mallorca
Mensajes: 71
Antigüedad: 11 años, 11 meses
Puntos: 1
Problemilla al capturar variables lanzadas con exec()

Hola a todos,

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";
        
    }
exec.php

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__);
El archivo exec.php se ejecuta perfectamente en primer plano cuando lo llamo por url devolviendo el resultado esperado y mandándo el mail de control. Como es lógico, cuando se ejecuta en primer plano, no recibe $a y $b.

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 &'); 
Bueno, si alguien ha llegado hasta aquí, ahí van las preguntas, por orden de importancia para mis necesidades:

¿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