Foros del Web » Programando para Internet » PHP »

Llamada a una aplicacion desde php

Estas en el tema de Llamada a una aplicacion desde php en el foro de PHP en Foros del Web. Hola buenas, resulta que estoy realizando el proyecto fin de carrera y tengo un pequeño problemilla. El caso es que estoy haciendo una aplicacion de ...
  #1 (permalink)  
Antiguo 28/01/2008, 06:33
 
Fecha de Ingreso: enero-2008
Mensajes: 57
Antigüedad: 16 años, 3 meses
Puntos: 0
Llamada a una aplicacion desde php

Hola buenas, resulta que estoy realizando el proyecto fin de carrera y tengo un pequeño problemilla.

El caso es que estoy haciendo una aplicacion de analítica web, hecha en c++. Y ahora estoy haciendo la interfaz grafica en php. El problema viene cuando desde php llamo al programa c++ con la orden system.
El programa se ejecuta correctamente y voy guardando en un fichero temporal el porcentaje de procesamiento del fichero log.
Pero el problema esta en que cuando hago la llamada, la pagina php no se carga, y claro a los 30sg, me da error. No habria alguna manera, de llamar al programa c++ y que quedara ejecutandose en segundo plano, cargandose la pagina php?
Y ademas, como podria hacer para sacar una barra de progreso en esta pagina, cogiendo el porcentaje que lleva la aplicacion desde el fichero status.
Espero que me podais hechar una mano, que llevo tiempo atascado aki.

Gracias y un saludo.
  #2 (permalink)  
Antiguo 28/01/2008, 09:56
 
Fecha de Ingreso: enero-2008
Mensajes: 57
Antigüedad: 16 años, 3 meses
Puntos: 0
Re: Llamada a una aplicacion desde php

nadie me puede hechar una mano?
llevo dias estancado en este paso y no se como puedo solucionarlo.


saludos
  #3 (permalink)  
Antiguo 28/01/2008, 10:37
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 17 años, 11 meses
Puntos: 2135
Re: Llamada a una aplicacion desde php

Si ves el manual de la funcion system, claramente indica esto:
Cita:
Note: If you start a program using this function and want to leave it running in the background, you have to make sure that the output of that program is redirected to a file or some other output stream or else PHP will hang until the execution of the program ends.
Eso quiere decir que si tu programa genera salida, PHP va a esperar hasta que la salida este completa.

Para mostrar la barra de progreso, una vez que iniciaste el comando con system() debes de usar una llamada Asyncrona desde tu HTML para ver el estado del log, esto lo puedes hacer con AJAX.

Saludos.
  #4 (permalink)  
Antiguo 28/01/2008, 12:10
 
Fecha de Ingreso: enero-2008
Mensajes: 57
Antigüedad: 16 años, 3 meses
Puntos: 0
Re: Llamada a una aplicacion desde php

Muchisimas gracias por responder.

Asi que si mi programa solo saca datos en un fichero de log, la pagina php se cargaria por completo, aunque se este ejecutando la aplicacion en segundo plano?

Y como puedo hacer lo que me comentas con ajax? y la barra de progreso que la haria en javascript o algo por el estilo?

gracias y un saludo
  #5 (permalink)  
Antiguo 28/01/2008, 12:34
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 17 años, 11 meses
Puntos: 2135
Re: Llamada a una aplicacion desde php

Para tu primera pregunta, así es, si rediriges la salida de tu programa a un fichero, PHP lo ejecutara en segundo plano, por ejemplo:
Código PHP:
system"/usr/programa > /dev/null" ); 
Para tus otras dos preguntas te recomiendo vayas al foro de AJAX o JavaScript, para que te indiquen la mejor forma de utilizarlo.

Saludos.
  #6 (permalink)  
Antiguo 28/01/2008, 15:59
 
Fecha de Ingreso: enero-2008
Mensajes: 57
Antigüedad: 16 años, 3 meses
Puntos: 0
Re: Llamada a una aplicacion desde php

he probado a redireccionar la salida a un fichero y sigue esperando a que acabe el proceso, y eso que lo hago con la orden del sistema start /b y la ruta completa del ejecutable. se supone que /b tambien te crea el proceso en segundo plano
  #7 (permalink)  
Antiguo 28/01/2008, 21:58
 
Fecha de Ingreso: enero-2008
Mensajes: 6
Antigüedad: 16 años, 3 meses
Puntos: 0
Re: Llamada a una aplicacion desde php

Cita:
Iniciado por consigna Ver Mensaje
Hola buenas, resulta que estoy realizando el proyecto fin de carrera y tengo un pequeño problemilla.

El caso es que estoy haciendo una aplicacion de analítica web, hecha en c++. Y ahora estoy haciendo la interfaz grafica en php. El problema viene cuando desde php llamo al programa c++ con la orden system.
El programa se ejecuta correctamente y voy guardando en un fichero temporal el porcentaje de procesamiento del fichero log.
Pero el problema esta en que cuando hago la llamada, la pagina php no se carga, y claro a los 30sg, me da error. No habria alguna manera, de llamar al programa c++ y que quedara ejecutandose en segundo plano, cargandose la pagina php?
Y ademas, como podria hacer para sacar una barra de progreso en esta pagina, cogiendo el porcentaje que lleva la aplicacion desde el fichero status.
Espero que me podais hechar una mano, que llevo tiempo atascado aki.

Gracias y un saludo.
Saludos...

Mira puedes hacer lo siguiente:

Con respecto a lo que explicaste cree un archivo en C# (MONO) para linux,
que simularia (archivo.log)
"...analítica web, hecha en c++."
Este solo genera numeros aleatorios...

writing.cs
using System;
using System.IO;
namespace csharp_station.howto{
class TextFileWriter {
static void Main(string[] args) {
// Imprimo br
// create a writer and open the file
TextWriter tw = new StreamWriter("datos.log");
// write a line of text to the file //
Random rand = new Random();
//Lo echamos a andar indefinidamente
for(;;){
tw.WriteLine(rand.NextDouble());
tw.WriteLine("<br>"); // ESTO SE PUEDE AGREGAR DESDE READING
}

}
}
}
gmcs writing.cs
mono writing.exe
Posteriormente crear uno lector que se va a ejecutar desde php...

Este archivo es el unico que vas a crear ya que solo va accesar a los datos del fichero log.

"....El programa se ejecuta correctamente y voy guardando en un fichero temporal el porcentaje de procesamiento del fichero log."...


reading.cs

using System;
using System.IO;

namespace csharp_station.howto
{
class TextFileReader
{
static void Main(string[] args)
{

string[] readText = File.ReadAllLines("datos.log");
foreach (string s in readText)
{
Console.WriteLine(s);
}

/*
// create reader & open file
TextReader tr = new StreamReader("datos.log");
// read a line of text
Console.WriteLine(tr.ReadLine());
// close the stream
tr.Close();
*/
}
}
}
gmcs reading.cs


Desde php ejecutamos :

<?

print exec("date");
print "<br>";
print exec('mono reading.exe');

/***********************************************
************************************************
// print exec("mono writing.exe");
************************************************
************************************************
************************************************/
?>

La salida que obtengo aqui es algo asi:

Mon Jan 28 20:55:47 MST 2008
0.9562392920.560022115968178
0.998822958208072
0.71827728660697
0.531409646166214
0.174550135235558
0.526675751212368
0.804661527650739
0.176945238922231
0.709579101628428
0.219727242002137
0.415064679652017
0.443338754793321
0.680730388816786
0.0169070707712821
0.842444049121087
0.825576490175713
0.414728396765296
0.227580359311579
0.261970315716216
0.908712194258679
0.296150841422449
0.283986947165796
0.810774301090638
0.890783278686359
0.111907620966391
0.474582465586524
0.373925730760175
0.916491236964469
0.69871977376692
0.144254785098254
0.250650403672201
0.697371108782185
0.223802641138342
0.465545386758421
0.942183031673628
0.137516798049918
0.869291599313399
0.237301753478731
0.119628511424935
0.892508704630895
0.373939954384202
0.0544146774590084
0.986568065819595
0.077197495418227
0.0396013879401616
0.221581709674365
0.673777795710497
0.58050882936479


Espero y sirva de algo....
  #8 (permalink)  
Antiguo 29/01/2008, 03:31
 
Fecha de Ingreso: enero-2008
Mensajes: 57
Antigüedad: 16 años, 3 meses
Puntos: 0
Re: Llamada a una aplicacion desde php

Gracias por responder, pero es que estoy haciendo lo mismo cuando llamo a mi aplicacion c++ y nada, sigue esperando php a que acabe la aplicacion, exactamente hago esto.

exec("start /b c:\Docume~1\Jose\Proyecto\Procesa_logs.exe 1 1 > tmp/salida.txt");

Ha estoy ejecutandolo todo en windows.

saludos
  #9 (permalink)  
Antiguo 29/01/2008, 06:34
 
Fecha de Ingreso: enero-2008
Mensajes: 57
Antigüedad: 16 años, 3 meses
Puntos: 0
Re: Llamada a una aplicacion desde php

Hola muchas gracias a todos, por fin lo he hecho funcionar, lo he hecho de la siguiente manera.

$WshShell = new COM("WScript.Shell");
$OExec = $WshShell ->
run("C:\Docume~1\Jose\Escritorio\procesa_logs.exe 1 1 > salida.txt",3,false);

Me lo ejecuta correctamente en segundo plano y la pagina php se carga por completo.
El unico problema es que no me crea el fichero salida.txt con la salida de mi programa.


saludos
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 17:37.