Foros del Web » Programando para Internet » PHP »

Ejecución de un programa en el servidor

Estas en el tema de Ejecución de un programa en el servidor en el foro de PHP en Foros del Web. Hola a todos, Estoy intentando llamar a un programa que está en el servidor desde mi página .php. Lo estoy llamando de la siguiente manera: ...
  #1 (permalink)  
Antiguo 24/06/2003, 19:32
 
Fecha de Ingreso: junio-2003
Mensajes: 38
Antigüedad: 14 años, 5 meses
Puntos: 0
Ejecución de un programa en el servidor

Hola a todos,

Estoy intentando llamar a un programa que está en el servidor desde mi
página .php. Lo estoy llamando de la siguiente manera:

$program_execution="c:\web\cmmo\Tool\prueba.exe 1 >
c:\web\cmmo\Tool\log.txt";
passthru ($program_execution);

Y obtengo el siguiente error:

Fatal error: Maximum execution time of 30 seconds exceeded in c:\web\cmmo
\formulario_interfaz_web.php on line 370

Primero: No se si esta es la manera correcta para llamar a un programa, pero
es la que se ma ha ocurrido. ¿Alguna sugerencia?

Segundo: ¿Sería posible que durante la ejecución del programa se generara
una ventana indicando que hay un programa en progreso?

Un saludo y gracias de antemano,
Carlos.
  #2 (permalink)  
Antiguo 24/06/2003, 20:38
Avatar de Sav1989  
Fecha de Ingreso: junio-2003
Ubicación: Cap Fed | Colegiales
Mensajes: 50
Antigüedad: 14 años, 5 meses
Puntos: 0
a mi me pasaba ( no con una ejecucion de programa), pero con otras cosas, me parece que debes editar el php.ini , en c:/win (o tu directorio de win) Mas datos no te puedo dar, tal como no se :)
  #3 (permalink)  
Antiguo 24/06/2003, 20:42
 
Fecha de Ingreso: junio-2003
Mensajes: 38
Antigüedad: 14 años, 5 meses
Puntos: 0
Muchas gracias. Lo probaré mañana.
Un saludo,
Carlos.
  #4 (permalink)  
Antiguo 24/06/2003, 20:55
O_O
 
Fecha de Ingreso: enero-2002
Ubicación: Santiago - Chile
Mensajes: 34.417
Antigüedad: 15 años, 11 meses
Puntos: 126
Cita:
Fatal error: Maximum execution time of 30 seconds exceeded in c:\web\cmmo
\formulario_interfaz_web.php on line 370
Ese error lo puedes solventar ajustando y dandole más tiempo de ejecución a tu script con:

Código PHP:
set_time_limit(segundos); 
Si indicas 0 .. segundos se tomará como tiempo infinito para la ejecuión de tu scritp (osese, tarde lo que tarde. Esto no es aconsejable pues podría dejarte el servidor "colgado" .. usa tiempos largos, pero no infinito)

Cita:
Primero: No se si esta es la manera correcta para llamar a un programa, pero
es la que se ma ha ocurrido. ¿Alguna sugerencia?
Si vas a ejecutar una aplicación externa .. puedes usar esa función, pero recuerda qu PHP dispone de más funciones sobre ese tema. Depende de lo que esperes o haga esa ejecución de tu aplicación tal vez te resulte mejor usar otras fuciones como system() o exec(). Algunas devuelven la salida que pueda entregar la ejecución de tu aplicación externa .. otras no. Si no necesitas esa funcionalidad, no uses ese tipo de funciones que lo hagan.

Cita:
Segundo: ¿Sería posible que durante la ejecución del programa se generara
una ventana indicando que hay un programa en progreso?
No sé si ese script.php que llama a tu passthru() lo ejecutas en modo PHP CLI o CGI (o incluso PHP-GTK).. o bajo entorno WEB (con tu llamada a http:// a dicho script ..). El caso que si lo haces vía web (así parece?) .. lanza tu "pop-up" en javascript como lo harías habitualmente y ejecuta esa instrucción PHP .. cuando termine tu proceso (la ejecución de esa función) .. redireccionas a otra pagina o cierras el pop-up (esto sería cosa más bien de javascript) ...

Un saludo,
__________________
Por motivos personales ya no puedo estar con Uds. Fue grato haber compartido todos estos años. Igualmente los seguiré leyendo.
  #5 (permalink)  
Antiguo 24/06/2003, 21:44
 
Fecha de Ingreso: junio-2003
Mensajes: 38
Antigüedad: 14 años, 5 meses
Puntos: 0
Muchísimas gracias por tu completísima respuesta. Soy nuevo en el mundo de PHP y estoy tratando de aprender a marchas forzadas.

Lo que quiero lograr es llamar al programa que está en el servidor pasandole un fichero de entrada como argumento. Este fichero lo he creado con los datos de un formulario. Al hacer "submit" del formulario, llamo a la pagina php en la que creo el fichero y ejecuto el programa. Este programa generará unos ficheros de salida que luego tengo que incluir en una página web resultante.

Cuando llamo al programa, redirecciono la salida a un fichero log para analizar si ha sido ejecutado con éxito. Una vez que obtengo los ficheros de texto de salida, los tengo que convertir a .gif. No se si estoy en lo correcto, pero puede ser que para la llamada al programa pueda usar system y para la llamada al conversor pueda usar passthru() ?

También he leído en el manual de PHP refiriendose a passthru
Cita:
Esta función debería usarse en lugar de Exec() o System() cuando la salida de la orden Unix sean datos binarios que deban ser pasados directamente al navegador.
Un uso típico de ello es ejecutar algo como las utilidades pbmplus las cuales pueden dar como resultado directamente el
flujo de datos de una imagen.Poniendo el content-type a image/gif y llamando al programa pbmplus para mostrar un gif, usted puede crear archivos de órdenes PHP que generen directamente imágenes.
Yo voy a tener distintos contenidos: texto e imágenes, ¿podría usar el método explicado en el libro para las imágenes?

Y para terminar, me gustaría agradecerte sinceramente tu soporte. Estoy empezando y ando un poco perdido, así que respuestas como la tuya son de mucha utilidad.

Un saludo,
Carlos.
  #6 (permalink)  
Antiguo 24/06/2003, 22:32
O_O
 
Fecha de Ingreso: enero-2002
Ubicación: Santiago - Chile
Mensajes: 34.417
Antigüedad: 15 años, 11 meses
Puntos: 126
mm Si dices que tu aplicación te genera ese archivo "binario" al llamarlo en un archivo .. usando System() o exec() te sobraría ..

Si quieres llamar a tu aplicacion (ese .exe) y entregar el dato directamente al navegador (como ahí dice pasandole la cabecera adecuada al formato MIME que seá el archivo que ha generado esa aplicacion externa) .. ahí te combiene passthru() ..

No sé cuando te refierea a que "genera un archivo de texto" .. si está codificado en algún formato gráfico o mejor dicho "binario" o simplemente genera un archivo en el servidor que luego tu lo abres con PHP..

Si tu archivo genera directamente un ".gif" (binario) .. puedes llamarlo así:

Código PHP:
<?
$program_execution
="c:\web\cmmo\Tool\prueba.exe 1 >
c:\web\cmmo\Tool\log.txt"
;

// cabecera HTTP para indicar que lo que vas a entregar al navegador está codificado como formato MIME: GIF
header("Content-type: image/gif");  
passthru ($program_execution);
?>
Ojo que al usar cabeceras HTTP, NO ha de existir náda más de HTML (ni salto de línea o espacios antes del primer <? .. ) y por las propiedades de la cabecera usada .. ha de llamarse de forma individual (nada de echo "algo" por abajo del passthru() ..)


Si no te quieres complicar con esa función (la verdad que hay poca documentación y ejemplos de uso en el própio manual oficial de PHP ...) puedes usar system() por ejemplo o exec() y abrir el archivo con readfile() previo envio de las cabeceras (header() ..) mencionadas de "Content-type: ...." ...

Un saludo,
__________________
Por motivos personales ya no puedo estar con Uds. Fue grato haber compartido todos estos años. Igualmente los seguiré leyendo.
  #7 (permalink)  
Antiguo 24/06/2003, 23:17
 
Fecha de Ingreso: junio-2003
Mensajes: 38
Antigüedad: 14 años, 5 meses
Puntos: 0
Muchísimas gracias otra vez.

Creo que me voy a decantar por la opción system() o exec(). Solamente una pregunta más. Si no he entendido mal, aunque use esta segunda alternativa, debo de usar también header(...). Quedaría algo tal que así:

exec ($program_execution);
header("Content-type: image/gif");
readfile(http://fichero.gif);

Pero esto me crearía una página con un fichero gif, verdad? Por lo que he leído en el libro de PHP parece ser que poniendo "http://"
Cita:
se abre una conexión HTTP 1.0 al servidor
especificado y el texto de la respuesta se escribe a la salida estándar.
Lo que quiero intentar hacer es que dependiendo de una opción, la página web resultado mostraría imagenes gif o texto. Por otro lado, me gustaría crear una página web con todos los gif o con todos los ficheros de texto. Para hacer esto, ¿podría abrir una nueva página desde mi pagina php y pasarle todos los gif o todos los ficheros de texto?

Un saludo y muchas gracias de antemano,
Carlos.
  #8 (permalink)  
Antiguo 25/06/2003, 01:44
O_O
 
Fecha de Ingreso: enero-2002
Ubicación: Santiago - Chile
Mensajes: 34.417
Antigüedad: 15 años, 11 meses
Puntos: 126
Bueno .. si ejecutas un script similar a:

Código PHP:
<?
exec 
($program_execution);
header("Content-type: image/gif"); 
readfile("fichero.gif");
?>
donde como ya te mencioné usas cabeceras HTTP .. en este caso particular de "imagenes" (sean del típo que sean) .. debes de llamar a ese script bajo un <tag> HTML de imagen tal que:

Código PHP:
<img src="tu_script_ese.php"
y si necesitas pasarle parámetros a ese script para que a su vez se los pase a tu ejecutable .. tan sólo añadeselos y recuerda que en tu script ese, entraran dichos datos por el método GET.

ejemplo:
Código PHP:
<img src="tu_script_ese.php?varible=valor"
Si el archivo que genera tu aplicación es de "texto" .. la cabecera HTTP de content-type .. ya no será esa de image/gif .. sino text/plain (o algo así .. ahora no recuerdo bien ..).

Por lo tanto .. no sé como sabes que tu aplicación te va a generar un "texto" o un "binario/imagen" .. pero .. o una de dos:

1) identificas el formato MIME de tu archivo que acabas de generar con tu aplicación. Esto lo peudes hacer con la función: mime_content_type() .. (requiere de algo de configuración del servidor si no dispones de ese soporte)


2) si lo sabes de antemano .. le "tiras" al navegador la cabecera adecuada (if .. tal .. header .. image/gif .. else .. header .. text/plain ...)


Lo que comentas del "http://.." en el readfile() .. Si usas http:// o ftp:// y algunas más .. estas haciendo que PHP use el "wrapper" que hay le indicas y por ende abrirá dicha conexión al puerto que corresponda (80 HTTP, 21 FTP (si no me equivoco) .. etc)

mas info:
http://www.php.net/manual/en/features.remote-files.php

El caso que no es necesario que lo hagas si vas a acceder a un archivo q lo tienes en tu própio servidor (no remoto) así que es mas "rápido" llamarlo simplemente como te puse en el ejemplo .. Con eso te ahorras esa "conexión" y todo lo que implica de tiempos ...

Por cierto .. te puse como ejemplo para leer tu archivo la función readfile(). Esta función cumple dos funciones (valga la rebundancia):

1) abre el archivo en modo lectura ..
2) lo entrega directo al buffer de salida (en tu caso será al navegador).

Otras opciones son por ejemplo hacer un fopen() .. fread() y echo/print .. pero como veras, con esa función nos ahorramos unas cuantas funciones.

Un saludo,
__________________
Por motivos personales ya no puedo estar con Uds. Fue grato haber compartido todos estos años. Igualmente los seguiré leyendo.

Última edición por Cluster; 25/06/2003 a las 01:47
  #9 (permalink)  
Antiguo 25/06/2003, 11:25
 
Fecha de Ingreso: junio-2003
Mensajes: 38
Antigüedad: 14 años, 5 meses
Puntos: 0
Muchísimas gracias de nuevo.

Ahora voy a poner en práctica todo lo que me has ido contando en tus respuestas.

Seguimos en contacto.

Un saludo,
Carlos.
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 11:29.