Foros del Web » Programando para Internet » PHP »

[SOLUCIONADO] Problemilla al capturar variables lanzadas con exec()

Estas en el tema de Problemilla al capturar variables lanzadas con exec() en el foro de PHP en Foros del Web. 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 ...
  #1 (permalink)  
Antiguo 10/07/2013, 04:58
 
Fecha de Ingreso: mayo-2012
Ubicación: Palma de Mallorca
Mensajes: 71
Antigüedad: 11 años, 10 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
  #2 (permalink)  
Antiguo 10/07/2013, 05:31
Avatar de Triby
Mod on free time
 
Fecha de Ingreso: agosto-2008
Ubicación: $MX->Gto['León'];
Mensajes: 10.106
Antigüedad: 15 años, 7 meses
Puntos: 2237
Respuesta: Problemilla al capturar variables lanzadas con exec()

El primer parámetro para el script debe ser -- o los siguientes parámetros serán considerados directivas de configuración.

Más info: http://www.php.net/manual/es/feature...ne.options.php
__________________
- León, Guanajuato
- GV-Foto
  #3 (permalink)  
Antiguo 10/07/2013, 06:03
 
Fecha de Ingreso: mayo-2012
Ubicación: Palma de Mallorca
Mensajes: 71
Antigüedad: 11 años, 10 meses
Puntos: 1
Respuesta: Problemilla al capturar variables lanzadas con exec()

Cita:
Iniciado por Triby Ver Mensaje
El primer parámetro para el script debe ser -- o los siguientes parámetros serán considerados directivas de configuración.

Más info: http://www.php.net/manual/es/feature...ne.options.php
Gracias Triby,

No estoy seguro de que sea eso que comentas, he probado a lanzar el proceso asi:

Código PHP:

system
('php /var/www/vhosts/mi_servidor/httpdocs/exec/exec.php -- $a $b >/dev/null &'); 
y la cosa no funciona. Recoge "--" en la varible $a en exec.php, pero nada más.

En el manual de PHP he podido leer que es necesario tener activada la directiva register_argc_argv en el php.ini para que esté disponible el array $argv...

He comprobado como está con ini_get("register_argc_argv"), y está desactivada.

Ahora estaba investigando si se puede modificar esta directiva en tiempo de ejecución.

Con ini_set() no funciona y con la opción -d en la linea de comandos...

Código PHP:
system('php -d register_argc_argv=1 /var/www/vhosts/mi_servidor/httpdocs/exec/exec.php $a $b >/dev/null &'); 
...parece que tampoco, aunque no estoy seguro de estar pasando bien la opción (nunca he usado php por consola).

Alguna otra idea?

Gracias,

GMG
  #4 (permalink)  
Antiguo 10/07/2013, 07:25
Avatar de Triby
Mod on free time
 
Fecha de Ingreso: agosto-2008
Ubicación: $MX->Gto['León'];
Mensajes: 10.106
Antigüedad: 15 años, 7 meses
Puntos: 2237
Respuesta: Problemilla al capturar variables lanzadas con exec()

Cita:
Iniciado por Manual de PHP
-f --file
Analiza y ejecuta el fichero proporcionado. El modificador -f es opcional y puede ser omitido - es suficiente con solo poner el nombre del fichero a ejecutar.

Nota: Para pasar argumentos a un script, el primer argumento debe ser --, sino PHP los interpretará como opciones de PHP.
Supongo entonces que al leer los argumentos, el primero sería algo como $trash, seguido por $a y $b
__________________
- León, Guanajuato
- GV-Foto
  #5 (permalink)  
Antiguo 10/07/2013, 09:02
 
Fecha de Ingreso: mayo-2012
Ubicación: Palma de Mallorca
Mensajes: 71
Antigüedad: 11 años, 10 meses
Puntos: 1
Respuesta: Problemilla al capturar variables lanzadas con exec()

Mira Triby,

Ya me han habilitado la directiva register_argc_argv en el php.ini y ya puedo recoger el array $argv, pero ahora me pasa una cosa rarisima (al menos para mí) y es la siguiente:

Esta es la llamada al script

Código PHP:
 $a="soy un string con comilla simple";
 
$b=35;
               

system("php -f /var/www/vhosts/mi_host.com/httpdocs/exec/exec.php -- $a $b >/dev/null &"); 
Esta la parte de exec.php que manda un mail de control

Código PHP:
$a=$argv[0];
$b=$argv[1];
$c=$argv[2];
    
mail("[email protected]""Enviado en segundo plano"" El script es $a y los argumentos son \$a, que contiene: $b y \$b que contiene: $c"); 
Y esta el mail recibido:

El script es /var/www/vhosts/mi_host.com/httpdocs/exec/exec.php y los argumentos son $a, que contiene: soy y $b que contiene: un

Si te fijas en el array $argv se van recogiendo cada una de las palabras del primer argumento de texto como si fueran argumentos diferentes... ¿no te parece rarísimo?

He probado con argumentos numéricos y funciona bien pero con los string se lía.

¿Se te ocurre por que puede ser?

Un saludo,

GMG
  #6 (permalink)  
Antiguo 10/07/2013, 09:25
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 17 años, 10 meses
Puntos: 2135
Respuesta: Problemilla al capturar variables lanzadas con exec()

El problema es que pasas el argumento con espacios, realmente la llamada es:
Código:
archivo.php soy una variable con comillas 35
O sea le estas pasando varias variables, debes de pasarlas con comillas si quieres que sea solo un argumento...

Saludos.
  #7 (permalink)  
Antiguo 10/07/2013, 09:50
 
Fecha de Ingreso: mayo-2012
Ubicación: Palma de Mallorca
Mensajes: 71
Antigüedad: 11 años, 10 meses
Puntos: 1
Respuesta: Problemilla al capturar variables lanzadas con exec()

Cita:
Iniciado por GatorV Ver Mensaje
El problema es que pasas el argumento con espacios, realmente la llamada es:
Código:
archivo.php soy una variable con comillas 35
O sea le estas pasando varias variables, debes de pasarlas con comillas si quieres que sea solo un argumento...

Saludos.
Estupendo GatorV, solucionado!!

Al final la llamada queda así:

Código PHP:
$a="'soy un string con comilla simple'";
$b=35;

exec("php -f /var/www/vhosts/e-funciona.com/httpdocs/exec/exec.php -- $a $b $>/dev/null &"); 
Es decir, pasando a $a el string con comillas simples dentro de las comillas dobles.

Gracias a todos, me habéis sido de gran ayuda.

Saludos, GMG

Etiquetas: variable, variables
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 19:47.