2010-08-30 34 views
8

Tengo un script php que maneja una entrada de formulario. Por razones de diseño que están un poco fuera de mi control, y que no deseo cambiar completamente, tengo que llamar a un script de Perl con los parámetros especificados en el formulario html.Llamando a Perl desde php?

Inutilicé todas las entradas y luego las eché a un archivo llamado entrada, que es leído por el script de Perl llamado, en aras de la brevedad en esta pregunta, script.pl. Script.pl debería hacer algunas cosas y luego escribir todas las salidas en un archivo llamado output.

que llamo el script de perl php de este modo:

system('perl script.pl 2>errors'); 

no es bueno, no pasa nada. La salida no se crea, los errores no se crean y el efecto secundario no ocurre.

Mi apache se ejecuta como www-data user and group id. Mi directorio está configurado con 775 configuraciones con propiedad como yo: www-data. (Mi nombre de usuario es reemplazado por "me" por el bien de la privacidad).

Mi pregunta es doble: 1) ¿Estoy haciendo esto mal? Si es así, ¿cómo debo mejorar el código? 2) ¿Existe alguna forma más sensata de detectar errores en la ejecución del sistema?

Después de programar en perl por un tiempo, php se siente como un dolor en el culo.

SO: Ubuntu server edition

+2

Para propósitos de prueba: ¿Recibe cualquier salida con 'tránsito ('script.pl Perl 2> &1');' – VolkerK

+0

de tránsito() hace todo según lo previsto ¿Qué está pasando ??? –

+0

Leer:?. Http://php.net/manual/en/function.passthru.php –

Respuesta

1

popen se puede utilizar para obtener la respuesta del shell. esa es tu mejor apuesta. Lo cual puede ayudarte a depurar por qué el sistema está enojado. también, si tu pl dice "hola" y "adiós", popen incluso puede leer eso.

Si no se pudo encontrar el comando que se va a ejecutar, se devuelve un recurso válido. Esto puede parecer extraño, pero tiene sentido; le permite acceder a cualquier mensaje de error devuelto por el shell

Idealmente, habría tomado datos de stdin y escrito en stdout. popen permitiría un acceso ordenado a ambos.

popen('pwd;perl script.pl 2>errors;echo done');

continuación se puede ver dónde estaba (directorio) cuando el sistema lo llamaron y lo hizo "hecho".

+0

En la misma línea, recientemente descubrí que 'proc_open' es tremendamente poderoso cuando se ejecutan otros procesos a través de php, y no es tan difícil de usar como parece al principio. – grossvogel

0

¿Está perl en el camino? Tal vez deba especificarlo por completo (por ejemplo,/usr/bin/perl). ¿El sistema() devuelve falso, lo que indica una falla? Si intenta algo más simple, como system('/usr/bin/true', $retval), ¿el $retval se establece en 1?

+0

ruta perl se establece, ejecuta el comando manualmente en la terminal funciona. Sin embargo, simplemente puse un cheque, y la llamada al sistema devuelve falso. –

+0

¿Quizás el comando perl está en la ruta para su inicio de sesión/shell interactivo pero no para el proceso del servidor web? – VolkerK

+0

Especifiqué la ruta absoluta y aún devuelve false, ¿hay alguna forma de verificar el error de system()? –

0

Eche un vistazo a PHP system() documentation. El siguiente es el prototipo de la función del sistema():

string system (string $command [, int &$return_var ]) 

Pass en un segundo argumento y luego imprimir la cadena de retorno, así como la segunda variable. Vea lo que dice el error.

1

En el pasado he usado shell_exec() o backticks para lograr esto.

La documentación de valor de retorno de shell_exec indica que es idéntica a la del operador de comillas invertidas: Valores

Volver

La salida del comando ejecutado.

Espero que ayude.

sistema() solo devuelve el código de estado.

$var = shell_exec ("ls"); 
print $var; 
$var = `ls -l`; 
print $var; 
Cuestiones relacionadas