• Publicidad

Ayuda con PHP y mod_perl

¿Ya sabes lo que es una referencia? Has progresado, el nível básico es cosa del pasado y ahora estás listo para el siguiente nivel.

Ayuda con PHP y mod_perl

Notapor aLiSH » 2007-05-09 07:48 @367

Hola a todos,

Llevo una semanas intentando que me funcione el siguiente sistema: tengo una web realizada en PHP/Javascript/HTML y ahora debo añadir unos scripts en Perl. Quisiera que ambos, PHP y Perl, se interpretasen bajo Apache, para lo que instalé PHP como módulo de Apache y añadí mod_perl. Ambos funcionan correctamente por separado pero mi problema surge en el momento de llamar a Perl desde PHP o viceversa.

La arquitectura que más me convence es que desde PHP se llame a una función que permita ejecutar un script de Perl bajo mod_perl.

He probado con PHP::interpreter, PHP::include, HTML::Template desde Perl pero solo funcionan si PHP no está instalado como módulo de Apache. También he probado con embperl pero solo me interpreta el código Perl de un archivo en el que también incluyo PHP y Javascript. Por otro lado, tengo alguna duda con system() desde PHP, ya que en la documentación he leído que hay que especificar el comando antes del path del script y quiero que se ejecute bajo mod_perl. ¿Es esto posible de alguna forma? He probado con system() sin comando y no consigo que me funcione.

Os agradecería cualquier comentario y ayuda en cuanto a cómo debería enfocarlo para que me funcionen ambos y a cómo funciona exactamente system(), es decir, si puedo utilizar la función bajo mod_perl.

Un saludo y muchas gracias.
aLiSH
Perlero nuevo
Perlero nuevo
 
Mensajes: 18
Registrado: 2007-05-08 05:57 @290

Publicidad

Notapor explorer » 2007-05-09 09:54 @454

Los módulos de Perl que comentas son para ejecutar PHP dentro de Perl, pero has dicho que quieres ejecutar Perl desde una función PHP.

El caso es que la segunda opción siempre debería funcionar siempre que el system() de PHP sepa el path del comando Perl a ejecutar y si el usuario web que lo ejecuta tiene permisos para correrlo. Si no puede, el valor de retorno de system() debe indicar porqué no pudo hacerlo.

Hablas luego de ejecutar system() desde PHP pero que quieres ejecutarlo bajo mod_perl.

Ya me perdí.
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14480
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Notapor aLiSH » 2007-05-09 10:14 @468

En principio, mi intención era probar todas las opciones que encontré y en el caso de los módulos de Perl para ejecutar PHP dentro de Perl, resultó que no funcionaba bajo mod_perl. Entonces, he intentado ejecutar Perl desde dentro de PHP sin éxito. La única opción que me queda (antes de pasar todo lo que tengo hasta ahora en PHP a Perl, que prefiero no pensarlo...) es con la función system().

El código que tengo con esa función es el siguiente:
En php:
Sintáxis: [ Descargar ] [ Ocultar ]
  1. $result_search = system("../perl-cgi/prueba.pl",$result);  
  2. echo "<p>Este es el resultado : ".$result_search."</p>"; 
  3. echo "<p>Este es el resultado2: ".$result."</p>"; 


En prueba.pl:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
#!/usr/bin/perl
$prueba = 1;
$prueba_result = $prueba + 1;
$result = $prueba_result;
return ($result);
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4


Con esta prueba, lo que imprime en el navegador es:

Este es el resultado :

Este es el resultado2: 9

He realizado otras pruebas y el primer resultado seguía en blanco y el resultado2 me ha ido cambiando de número, 255 y 6 si no recuerdo mal.

En el archivo error.log de apache no me sale ningún error y no se interpretar ése número del resultado2.
aLiSH
Perlero nuevo
Perlero nuevo
 
Mensajes: 18
Registrado: 2007-05-08 05:57 @290

Notapor explorer » 2007-05-09 10:46 @490

En vez de return, yo usaría exit() para comunicar a PHP el resultado de la operación.

En $result_search no sale nada porque el programa Perl no saca nada a la salida estándar.

Prueba esto:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
#!/usr/bin/perl
$prueba = 1;
$prueba_result = $prueba + 1;
$result = $prueba_result;
print $prueba_result;
exit($result);
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14480
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Notapor aLiSH » 2007-05-09 11:04 @503

Lo he probado y me funciona perfectamente. Que alegría! ya no tengo que reescribir todo en Perl!

Muchas gracias por tu ayuda.
aLiSH
Perlero nuevo
Perlero nuevo
 
Mensajes: 18
Registrado: 2007-05-08 05:57 @290

Notapor aLiSH » 2007-05-10 05:33 @273

Hola,

Hay una cosa que no me ha quedado muy clara. En esta parte del código de PHP:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
$result_search = system("../perl-cgi/prueba.pl",$result);
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


¿La variable $result contiene lo mismo que se encuentra en la variable $result dentro del exit() en perl? Es que no entiendo muy bien cuándo saca como $result un número de error (por llamarlo de alguna forma) y cómo identificar ese error en Perl...

Un saludo.
aLiSH
Perlero nuevo
Perlero nuevo
 
Mensajes: 18
Registrado: 2007-05-08 05:57 @290

Notapor explorer » 2007-05-10 05:50 @285

Según la documentación de PHP, $result contendrá el resultado de la ejecución del comando lanzado por system(). Y el programa Perl lo intenta devolver con exit(), así que en teoría deberías poder pasar cualquier valor entero, pero en la práctica, podrías depender del sistema operativo que estés usando, que lo pueda reducir a un simple byte.

Para el tema de errores. Lo normal (en Unix) es que un programa que no ha tenido ningún error devuelva el valor '0'. Y cualquier otra cosa que devuelva son condiciones de error. Lo normal es que sea un '1'. Otras posibilidades es devolver valores negativos que indican qué error ocurrió.

Ejemplo, en el caso del comando 'grep' (sacado del manual de grep):
Código: Seleccionar todo
DIAGNOSTICS
       Normally, exit status is 0 if selected lines are found and 1 otherwise.
       But the exit status is 2 if an error occurred, unless the -q or --quiet
       or --silent option is used and a selected line is found.


Pero esos código de error los devuelve la propia aplicación, no el sistema operativo.

Así que si quieres indicar condiciones de error desde tu Perl, serán los códigos que tu mismo te inventes. Te inventes y que luego el PHP los entienda.

Ojo... el system() del Perl funciona de forma mucho más esotérica que el del PHP.
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14480
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Notapor aLiSH » 2007-05-15 05:14 @260

Hola,

Vuelvo por aquí porque no he conseguido que me funcione del todo. El resultado que me devuelve el script en Perl es un hash y me gustaría que PHP lo tomase completo. Con system() me devuelve únicamente la última linea y el valor 0 como que el script se ha ejecutado correctamente. ¿Hay alguna forma de que pueda recuperar todo el array?

Muchas gracias y un saludo.
aLiSH
Perlero nuevo
Perlero nuevo
 
Mensajes: 18
Registrado: 2007-05-08 05:57 @290

Notapor explorer » 2007-05-15 06:53 @329

La documentación de PHP es clara: system() sólo devuelve la última línea del comando.

La propia documentación te recomienda usar la función passthru() para conseguir toda la salida.

El hash supongo que se lo pasarás con un volcado del Data::Dumper, aunque lo más moderno es usar objetos JSON:
* JSON en Perl
* JSON en PHP

En Perl, además, existe el módulo PHP::Session para el intercambio de información de sesiones entre los dos lenguajes. Quizás también te sirva si usas el concepto de sesión.

Pero quizás tengas todo resuelto con el módulo PHP::Serialization (aunque es un poco antiguo) y la función unserialize() del PHP.
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14480
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España


Volver a Intermedio

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 1 invitado