Ver Mensaje Individual
  #14 (permalink)  
Antiguo 20/12/2012, 07:23
Avatar de gnzsoloyo
gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 5 meses
Puntos: 2658
Respuesta: No logro entender exec()

OK. Entendido.
Entonces, vamos a documentación que podemos hallar por medio de Google, entre lo que se puede leer:
Cita:
Lanzar con un exec de PHP una llamada al php.exe que ejecute el script en cuestión. Por ejemplo si tenemos el script consulta_webservice.php que es el que realiza la carga de datos del Webservice podemos escribir en nuestro script de lanzamiento lanzador_webservice.php:
Código PHP:
Ver original
  1. < ?php
  2. exec("C:\ruta_al_exe_php\php.exe -f consulta_webservice.php");
  3. ?>

Este metodo funciona optimamente bajo entornos linux, no así en windows. ¿Por qué? Pues por que deja al script lanzador esperando que termine el proceso que él mismo ha lanzado (en nuestro caso php.exe -f consulta_webservice.php)
O sea: Lo que quieres hacer, no funcionará de ese modo si lo haces en Windows...

Vamos a ver qué proponen para esto:
Cita:
Tras muchas horas de pruebas con diversas soluciones que en la www se dan a este problema, nos dimos cuenta que tan sólo una nos funcionaba correctamente. En concreto se trata de usar un programa auxiliar "psexec.exe" cuya principal utilidad consiste en lanzar programas tanto en nuestra máquina como en máquinas en red.

Veamos como usarlo:

En nuestro script lanzador usamos la funcion exec para lanzar este comando:
Código PHP:
Ver original
  1. < ?php
  2. exec('psexec -d C:\ruta_al_exe_php\php.exe -f consulta_webservice.php');
  3. ?>
Esta linea nos lanza desde el PHP el mencionado psexec (deberá estar en el mismo directorio en el que estamos), que a su vez invoca al php.exe que ejecuta nuestro script cargador que se ejecutará en segundo plano. Consiguiendo con este pequeño rodeo que el script lanzador quede libre de esperar a que acabe su ejecución el script cargador.

Para lograr esto usamos la opcion del psexec "-d"

Rizando el rizo:

Pero imaginemos que al script que queremos usar para cargar datos del webservice tenemos que pasarle parametros (por ejemplo un id) digamos: consulta_webservice.php?id=123

Si probamos a llamarlo tal cual lo hariamos desde la web, nos encontraremos con un fallo del psexec, el cual no admite ningún parametro con “?” o con “=”, así que recurriremos al uso de parametros específicos para ejecutar php desde la linea de comandos, tal que así:
Código PHP:
Ver original
  1. < ?php
  2. exec('psexec -d C:\ruta_al_exe_php\php.exe -f consulta_webservice.php -- 123');
  3. ?>

El script receptor, consulta_webservice.php, deberá recojer dicho valor de la siguiente forma:
Código PHP:
Ver original
  1. < ?php
  2. $id=$argv[1];
  3. # $id vale 123
  4. ?>

Donde el array global $argv nos proporciona todos los parametros pasados y la variable $arvc su cardinalidad.

Resumiendo:

El programa psexec nos brinda la posibilidad de ejecutar una aplicacion en segundo plano llamada desde un script PHP ejecutado en un servidor Apache en Windows, sin interrumpir el uso nuestra aplicación web.
Fuente: http://www.2mdc.com/blogs/administra...o-bajo-windows

Prueba eso y nos cuentas.

PsExec v1.98
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)