• Publicidad

Problema de cómo pasar variables de PHP a Perl

¿Apenas comienzas con Perl? En este foro podrás encontrar y hacer preguntas básicas de Perl con respuestas aptas a tu nivel.

Problema de cómo pasar variables de PHP a Perl

Notapor Iquei » 2009-12-08 11:06 @504

¡Hola!

Soy nuevo en Perl, es la primera vez que tengo algo que ver con Perl, como consecuencia de que en mi servidor no puedo utilizar exec() ni system(), porque están desactivados por seguridad; ya que el servidor ejecuta PHP bajo Windows, he tenido que utilizar curl_exec(), esto es para calcular una firma para el pago con tarjeta de crédito, lo hago con esto:

Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
$ch = curl_init();
          curl_setopt($ch, CURLOPT_URL, 'http://www.mipagina.com/cgi-bin/calculo.pl "$Num_operacion" "$Importe"');
          curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
          $resultado = curl_exec($ch);
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4


Mandar a un archivo Perl las variables de "$Num_operacion" "$Importe" y junto con otros datos que están el archivo Perl que me calcule la firma y me devuelva los datos.

Esto es lo que tengo en el archivo calculo.pl
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/perl
  2. #
  3. use CGI;
  4. $cgi = new CGI;
  5. $NO = $cgi->param ('$Num_operacion');
  6. $I = $cgi->param ('$Importe');
  7. $TM = "978";
  8. $E = "2";
  9. # Descripción del Comercio.
  10. $PWD = "00000000"; #Password o clave de encriptación
  11. $MID = "000000000"; #identificación comercio MerchantID
  12. $ABIN = "0000000000"; #identificación de la caja AquirerBIN
  13. $TID = "00000000"; #identificación del terminal TerminalID
  14. $calculo = './calculo.exe'; # Localización del programa calculo (Asegúrese de que es correcta la ruta)
  15. # Cálculo de la firma para la operación
  16. $resultado = `$calculo $PWD $MID $ABIN $TID $NO $I $TM $E ""`;
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4


Mis preguntas son:
1º: Paso bien las variables desde PHP.
2º: Recojo bien las variables en Perl

Gracias, Salu2
Última edición por explorer el 2009-12-08 11:14 @510, editado 1 vez en total
Razón: Tildes, bloques de código
Iquei
Perlero nuevo
Perlero nuevo
 
Mensajes: 7
Registrado: 2009-12-08 07:55 @371

Publicidad

Re: Problema de cómo pasar variables de PHP a Perl

Notapor explorer » 2009-12-08 12:12 @550

Bienvenido a los foros de Perl en Español, Iquei.

No conozca la librería curl_setopt() por lo que no sé si esa es la forma correcta de pasar los argumentos.

En estos hilos hemos hablado en algunas ocasiones del paso de parámetros entre PHP y Perl (ver último mensaje).

Ten en cuenta que también depende de que tengas el binario calculo.exe, en el mismo directorio: estás intentando ejecutar ./calculo.exe. Y compilado para la arquitectura donde se va a ejecutar.

Luego, debes enviar $resultado a la salida estándar (con un print(), por ejemplo), para que el servidor web se lo pase al curl.
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14486
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: Problema de cómo pasar variables de PHP a Perl

Notapor Iquei » 2009-12-08 13:01 @584

Gracias, por contestar.

El archivo binario ./calculo exe, está en el mismo directorio y tiene permiso para su ejecución.

He estado mirando los enlaces que me dices, y he puesto al final del .pl esto:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
print "$resultado";
exit($resultado);
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

El resultado que obtengo es este:
Un mensaje de error: 502 Bad Gateway

El servidor, actuando como puerta de enlace o proxy, recibió una respuesta no válida del servidor anterior en la cadena.

Gracias por ayudarme.
Iquei
Perlero nuevo
Perlero nuevo
 
Mensajes: 7
Registrado: 2009-12-08 07:55 @371

Re: Problema de cómo pasar variables de PHP a Perl

Notapor explorer » 2009-12-08 17:44 @780

No es lo mismo hacer el print() que el exit().

El print() devuelve el $resultado al proceso que le llamó, mientras que exit() es el resultado de la ejecución del CGI al proceso que lo ejecutó, que en este caso es el servidor web. Lo principal es el print().

En cuanto al error, Yo pondría

use CGI::Carp qw(fatalsToBrowser);

después del use CGI; para obtener más información, pero con ese tipo de errores, es posible que ni llegue a ejecutar el CGI.

Según lo que veo,
* El proceso CGI se terminó inesperadamente antes de procesar la petición.
* El proceso CGI tiene un fallo y no devuelve un conjunto completo de cabeceras HTTP.

Qué se puede intentar:
* Comprueba los registros (log) del sistema para ver por qué el proceso CGI se terminó bruscamente.
* Analizar la aplicación CGI para determinar por qué no está enviando el juego completo de cabeceras HTTP.

Intenta ejecutar primero el CGI de forma directa, sin el PHP, desde un navegador, para ver si el CGI devuelve un valor correcto. Para ello, coloca en la dirección del navegador

http://www.mipagina.com/cgi-bin/calculo.pl?Num_operacion=1&Importe=1234

mientras que en el CGI, lo reduces a

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/perl
  2. #
  3. use CGI       qw(:standard);
  4. use CGI::Carp qw(fatalsToBrowser);
  5.  
  6. print
  7.     header,
  8.     start_html('PRUEBA'),
  9.     p( 'Num_operacion: ' ), blockquote( param('Num_operacion') ),
  10.     p( 'Importe: '       ), blockquote( param('Importe')       ),
  11.     hr,
  12.     end_html,
  13.     ;
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

El resultado de la ejecución deberá salir en la página HTML. Como ves, le estoy pasando los valores con argumentos en el mismo URL.

Una vez que esto funcione, es más fácil seguir con la ejecución del resto.

El error 502 podría incluso significar que el calculo.exe no ha podido ser ejecutado por el CGI.
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14486
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: Problema de cómo pasar variables de PHP a Perl

Notapor Iquei » 2009-12-09 10:56 @497

¡Hola!

Perdona por no contestarte antes, pero he estado un poco liado hoy y ayer se me hizo tarde.

He hecho lo que me dices y me devuelve esto:
Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
Num_operacion:

    1

Importe:

    1234
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4

He mirado los log y ha registrado entre otras cosa esto:
Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
2009-12-08 17:30:42 W3SVC19790 H0041 86.109.167.59 GET /checkout_payment.php - 80 - 85.59.42.114 HTTP/1.1 Mozilla/5.0+(Windows;+U;+Windows+NT+5.2;+es-ES;+rv:1.9.0.1)+Gecko/2008070208+Firefox/3.0.1 osCsid=e3669097ba23871fb4157132ad17954b http://www.midominio.com/checkout_shipping.php http://www.midominio.com 200 0 0 5838 530 343
2009-12-08 17:30:45 W3SVC19790 H0041 86.109.167.59 GET /cgi-bin/calculo.pl - 80 - 86.109.167.59 HTTP/1.1 - - - http://www.midominio.com 502 2 0 1134 79 0
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4

Voy a ponerle lo que me dices y te digo lo que me da.

Gracias, salu2
Iquei
Perlero nuevo
Perlero nuevo
 
Mensajes: 7
Registrado: 2009-12-08 07:55 @371

Re: Problema de cómo pasar variables de PHP a Perl

Notapor Iquei » 2009-12-09 11:14 @509

¡Hola!
He probado con esto:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/perl
  2. # Perl script para la implementaciÆn del TPV Virtual de CECA
  3. # a travÅs del programa "calculo".
  4. #
  5. #
  6. use CGI;
  7. use CGI::Carp qw(fatalsToBrowser);
  8. $NO = "1";
  9. $I = "165";
  10. $TM = "978";
  11. $E = "2";
  12. # DescripciÆn del Comercio.
  13. $PWD = "99771197"; #Password o clave de encriptacion
  14. $MID = "116256173"; #identificación comercio MerchantID
  15. $ABIN = "0000554035"; #identificación de la caja AquirerBIN
  16. $TID = "00000003"; #idenficicación del terminal TerminalID
  17. $calculo = '/calculo.exe'; # LocalizaciÆn del programa calculo (Asegurese de que es correcta la ruta)
  18. # Calculo de la firma para la operaciÆn
  19. $resultado = `$calculo $PWD $MID $ABIN $TID $NO $I $TM $E ""`;
  20. print "$resultado";
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

Como verás no he pasado las variables desde PHP y lo he ejecutado desde el navegador directamente con esto: http://www.midominio.com/cgi-bin/calculo.pl y me sigue dando el mismo error.

También le he quitado el . a /calculo.exe.

También le he quitado después el print "$resultado"; y le he dejado solo el print ; y sigue dandome el mismo error.

Salu2
Última edición por explorer el 2009-12-09 11:32 @522, editado 1 vez en total
Razón: Ortografía
Iquei
Perlero nuevo
Perlero nuevo
 
Mensajes: 7
Registrado: 2009-12-08 07:55 @371

Re: Problema de cómo pasar variables de PHP a Perl

Notapor explorer » 2009-12-09 12:04 @544

Con la primera prueba, queda demostrado que el sistema CGI te funciona bien.

Ahora el tema es saber qué pasa con el segundo intento.

Con esta modificación,
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/perl
  2. #
  3. use CGI       qw(:standard);
  4. use CGI::Carp qw(fatalsToBrowser);
  5. use Cwd;
  6.  
  7. $NO = param('Num_operacion');
  8. $I  = param('Importe');
  9. $TM = 978;
  10. $E  = 2;
  11.  
  12. # Descripción del Comercio
  13. $PWD  = "99771197";     #Password o clave de encriptacion
  14. $MID  = "116256173";    #identificación comercio MerchantID
  15. $ABIN = "0000554035";   #identificación de la caja AquirerBIN
  16. $TID  = "00000003";     #idenficicación del terminal TerminalID
  17.  
  18. $calculo = '/calculo.exe'; # Localización del programa calculo (Asegurese de que es correcta la ruta)
  19.  
  20. if (! -x $calculo) {
  21.     print header('text/html');
  22.     print start_html('ERROR');
  23.     print p("ERROR: No encuentro el programa [$calculo]: $!"), "\n";
  24.     print p("Ruta actual: " . cwd);
  25.     print end_html;
  26.     exit(1);
  27. }
  28.  
  29. # Calculo de la firma para la operación
  30. $resultado = qx($calculo $PWD $MID $ABIN $TID $NO $I $TM $E "");
  31.  
  32. print header('text/plain');
  33. print $resultado;
  34.  
  35. __END__
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
Verás que antes de ejecutar calculo.exe, miro a ver si es un fichero ejecutable (con -x $calculo estoy mirando por un fichero ejecutable, en el mismo directorio de trabajo en donde me encuentro). Si no está o no es ejecutable, me muero con un mensaje así:
Sintáxis: [ Descargar ] [ Ocultar ]
Using html4strict Syntax Highlighting
Content-Type: text/html; charset=ISO-8859-1

<!DOCTYPE html
       PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
        "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" lang="en-US" xml:lang="en-US">
<head>
<title>ERROR</title>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
</head>
<body>
<p>ERROR: No encuentro el programa [/calculo.exe]: No existe el fichero o el directorio</p>
<p>Ruta actual: /home/explorer/Documents/Desarrollo</p>
</body>
</html>
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4
Así al menos me entero de en qué directorio está trabajando el programa. Si no es el mismo en donde dejaste el ejecutable, quizás sea mejor poner la ruta completa al ejecutable.
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14486
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: Problema de cómo pasar variables de PHP a Perl

Notapor Iquei » 2009-12-09 12:05 @545

Voy a probarlo y te digo.
Gracias.
Iquei
Perlero nuevo
Perlero nuevo
 
Mensajes: 7
Registrado: 2009-12-08 07:55 @371

Re: Problema de cómo pasar variables de PHP a Perl

Notapor Iquei » 2009-12-09 12:15 @552

Tenías razón: la ruta no es la que tiene, tiene que ser la absoluta, me devuelve esto:
Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
ERROR: No encuentro el programa [/calculo.exe]: No such file or directory

Ruta actual: C:/Inetpub/vhosts/midominio.com/cgi-bin
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4
Última edición por explorer el 2009-12-09 12:18 @554, editado 1 vez en total
Razón: Tildes
Iquei
Perlero nuevo
Perlero nuevo
 
Mensajes: 7
Registrado: 2009-12-08 07:55 @371

Re: Problema de cómo pasar variables de PHP a Perl

Notapor explorer » 2009-12-09 12:17 @553

Skriptke escribiste:Sencillamente no se puede pasar variables entre dos procesos distintos, Perl y PHP, Perl y Perl, o lo que sea con lo que sea.

No, Skriptke, no se trata de paso de información entre procesos que se ejecutan de forma simultánea.

Se trata de que un proceso lanza a otro y espera una respuesta o un resultado, para continuar.

Aquí, un usuario lanza una petición HTTP para iniciar el proceso de compra. La petición se transforma, por orden del servidor web, en una petición al motor PHP, que lanza una nueva petición HTTP (por medio de la librería curl), al propio servidor web, que la transforma en una petición CGI, ejecutando un programa Perl. Se espera entonces que el resultado del CGI Perl, enviado a la salida estándar, lo recoja el servidor web para entregárselo al proceso PHP, y de allí de nuevo al servidor web que enviará el HTML definitivo al usuario.

El único proceso que se ejecuta todo el tiempo es el servidor web, que se encarga después de mandar peticiones al resto y obtener respuestas.

Parece lioso, pero es una forma muy común de construir páginas dinámicas.
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14486
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Siguiente

Volver a Básico

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 0 invitados

cron