2010-11-09 20 views
11

Necesito ejecutar los siguientes scripts.Sistema PHP() - el estado de retorno es siempre 0

// File: script_a.php 
<?php exit(1); ?> 

// File: script_b.php 
<?php 
    system('php script_a.php', $return); 
    var_dump($return); 
?> 

Ahora mi problema: En mi sistema Windows que se ejecuta script_b.php espectáculos int(1) como se esperaba. En nuestro servidor Unix siempre recibo int(0), lo que me impide verificar si ocurre una falla dentro del script_a.php.

¿Alguien sabe este problema y cómo solucionarlo?

+2

¿Qué contiene '$?' Cuando se ejecuta script_a.php desde la línea de comandos? –

+0

¿Qué versión de php está usando en el servidor Unix, comparando con Windows – RobertPitt

+0

? Si ejecuto script_b desde la línea de comandos, todo funciona bien. ¿Qué es $? –

Respuesta

0

¿Ha comprobado si Safe_mode está habilitado en el servidor Unix?

PHP Nota:

Nota: Cuando se activa el modo seguro, que sólo se puede ejecutar archivos dentro de la safe_mode_exec_dir. Por razones prácticas , actualmente no está permitido tener .. componentes en el camino a el ejecutable.

¿O tal vez está prohibida la ejecución de la función del sistema?

+0

safe_mode está desactivado. Y el sistema puede ser llamado. Si pongo algunas instrucciones echo en script_a antes de salir, normalmente puedo obtener esa salida, pero el estado de salida sigue siendo 0. –

+0

¿Has probado otros métodos de ejecución? tal vez exec() o passthru() funciona bien – Rodrigo

+0

Intenté ambos, exec() y passthru(). En la línea de comandos, el resultado es el esperado, pero la ejecución en el servidor web da como resultado que $ return sea 0. –

1

Es posible que desee comprobar si está llamando al ejecutable php correcto en la máquina Unix. En muchos sistemas UNIX necesitarás llamar al ejecutable de php-cli en lugar del php para usarlo en la línea de comando. Otra cosa que verificaría serían los permisos. ¿Tal vez el usuario que ejecuta el script script_b.php no tiene permisos para ejecutar script_a?

1

__halt_compiler() se llama en alguna parte, ¿puede verificarlo?

+3

... W h a t? –

+0

@Ignacio - puedo replicar el mismo resultado cuando incrusta '__halt_compiler(); exit (1); ', y posible el PHP en el alias de Unix a algo? – ajreal

+0

¿No fallaría en ambas plataformas en ese caso? –

1

Intente hacer la llamada a PHP system con la ruta absoluta tanto del archivo ejecutable de PHP como del nombre de archivo del script, por ejemplo: system('/usr/bin/php /path/to/script_a.php', $return);. Tal vez es un problema de ruta. (Puede encontrar la ruta absoluta de su ejecutable PHP con: which php).

Además, como alguien sugirió, intente depurar el valor de retorno real de script_a.php en su servidor UNIX ejecutando php script_a.php; echo $? en la línea de comandos. Ese echo generará el último valor devuelto, es decir, el valor devuelto por script_a.php.

De todos modos, sugiero hacer un include con una declaración return como se describe en el Ejemplo n. ° 5 del include() documentation. Si puede adaptar sus scripts de esta manera, es una forma más eficiente de comunicarlos.

// File: script_a.php 
<?php return 1; ?> 

// File: script_b.php 
<?php 
    $return = (include 'script_a.php'); 
    var_dump($return); 
?> 
0

No puedo reproducirlo tampoco (PHP 5.3.3, Ubuntu).

Cuando me puse la salida-valor a algo mejor grep-poder, como "666", trazando los guiones se devuelven también lo que se espera:

strace -f php5 script_b.php 2>&1 | grep EXITSTATUS 

[pid 18574] <... wait4 resumed> [{WIFEXITED(s) && WEXITSTATUS(s) == 666}], 0, NULL) = 18575 
waitpid(18574, [{WIFEXITED(s) && WEXITSTATUS(s) == 666}], 0) = 18574 

La "f" a strace de que siga niño deje procesos mientras usa la llamada del sistema. "2> & 1" redirige stderr a stdout para dejar todo grep. También puede canalizarlo a "| less" para pasar, pero la salida es larga y poco legible.

0

No puedo reproducir esto en mi sistema, Ubuntu Hardy.He aquí una muestra:

/tmp$ mkdir /tmp/sbuzz 
/tmp$ cd /tmp/sbuzz 
/tmp/sbuzz$ echo '<?php exit(1); ?>' >script_a.php 
/tmp/sbuzz$ cat >script_b.php 
<?php 
    system('php script_a.php', $return); 
    var_dump($return); 
?> 
/tmp/sbuzz$ php script_b.php 
int(1) 
/tmp/sbuzz$ echo '<?php exit(2); ?>' >script_a.php 
/tmp/sbuzz$ php script_b.php 
int(2) 
/tmp/sbuzz$ 

código de salida 0 significa que la ejecución con éxito del programa, por lo que tipo de sonidos como si estuviera quizás ejecutando el script_a.php mal o tal vez el ejecutable "php" no está haciendo lo que eres esperando? ¿Quizás tiene un script llamado "php" que está en su camino antes del intérprete? ¿Qué reporta "which php"? En mi sistema dice "/ usr/bin/php".

Si PHP no puede encontrar el script, sería salir con 1, por ejemplo:

/tmp/sbuzz$ cat script_b.php 
<?php 
    system('php doesnt_exist_script_a.php', $return); 
    var_dump($return); 
?> 
/tmp/sbuzz$ php script_b.php 
Could not open input file: doesnt_exist_script_a.php 
int(1) 
/tmp/sbuzz$ 

En este caso, he cambiado el script_b.php para tratar de ejecutar un script que no existe, y obtengo el código de salida 1 (debería ser 2 si se completó con éxito, porque cambié el script_a anterior), pero también muestra el error de que no pudo ejecutar el programa.

Es posible que desee para tratar de cambiar para que se ejecute específicamente la ruta completa al ejecutable PHP:

system('/usr/bin/php script_a.php') 

o también la ruta completa de la secuencia de comandos, así:

system('/usr/bin/php /tmp/sbuzz/script_a.php') 

También podría intente ejecutar específicamente un programa que devolverá 1, al igual que otro punto de datos, como:

system('false') 
system('bash -c "exit 69"') 

Es posible que desee probar un código de salida distinto de 1, que es una falla común. Es por eso que hice "salir 69" arriba. "Falsa" para salir con 1.

También, por supuesto, intente ejecutar el script_a.php directamente:

/tmp/sbuzz$ php script_a.php 
/tmp/sbuzz$ echo $? 
2 
/tmp/sbuzz$ 

El "$?" es el código de salida del último comando de ejecución, en el indicador del shell.

-3

Puede intentar pasar un valor octal para salir(). Vea lo que sucede entonces.

+0

La próxima vez publicaré esta respuesta como un comentario, luego no se puede rechazar. – xaav

0

Probar:

<?php 
    die(1); 
?> 

Si eso no funciona así, echa un vistazo a la salida estándar de:

strace php script_a.php 
-1

que necesita estar en ejecución como root o usando sudo para acceder a través de PHP.

intentar algo como esto: -

system('sudo /usr/bin/php -f script_a.php', $return); 

en su script_b.php

y editar/etc/sudoers para agregar la siguiente línea: -

apache ALL=(ALL) NOPASSWD: /usr/bin/php -f script_a.php 

si PHP no es en/usr/bin/php cambie esa referencia y también mencione la ruta completa del archivo script_a.php algo así como /var/www/html/script_a.php o la ruta donde está ubicado físicamente.

Gracias.

+0

¿Eso es seguro? – mattalxndr

+2

¿por qué necesitarías o querrías usar sudo para un caso como este? esta es una pesadilla de seguridad mala, mala, mala, mala, mala idea. – taxilian

+0

Lea este enlace para aclarar dudas http://www.linuxhomenetworking.com/wiki/index.php/Quick_HOWTO_:_Ch09_:_Linux_Users_and_Sudo –

0

No estoy seguro de si estos problemas están relacionados, pero puede echar un vistazo en exec always returns -1 (or 127) ya que tuve un problema similar en el pasado ... incluso si no lo solucioné de forma manual.

En su caso, podría ser otro problema, no estoy seguro de cómo sería reproducible, pero he visto los quesos donde la cadena de retorno para un comando desconocido sería la cadena de retorno de bash (bash: command not found). En la mayoría de los servidores, no hago nada. Usted puede tratar de comprobar la configuración de la cáscara para el usuario actual (supongo que sería www-data)

0

Tomando en consideración a su comentario de que el problema se está produciendo en el sistema UNIX cuando su script_b es algo así como

system ('php script_a.php | tee myLogFile', $ return);

Es posible utilizar esta sintaxis

sistema ("fiesta -c 'php script_a.php | camiseta registro.txt; finaliza \ {$ PIPESTATUS [0]}'", $ rendimiento);

Do man bash y busca PIPESTATUS para más detalles.

0

Sé que este es un hilo viejo, pero acabo de tener un problema similar.

El estado de salida estaba siendo puesto a 0 cuando tuve la secuencia de comandos ejecutada en el fondo, algo así como

system('php script_a.php &', $return); 

Podría haber estado haciendo eso, pero simplemente generalizar para facilitar la lectura?