Foros del Web » Programando para Internet » PHP »

[SOLUCIONADO] "pcntl_fork();" hijo no ejecuta desde navegador

Estas en el tema de "pcntl_fork();" hijo no ejecuta desde navegador en el foro de PHP en Foros del Web. Buenas a todos! tengo una duda que por mucho que busco no consigo solventar.... tengo el siguiente codigo: $padre_pid = getmypid(); $hijo_pid = pcntl_fork(); if ...
  #1 (permalink)  
Antiguo 05/12/2013, 05:54
 
Fecha de Ingreso: diciembre-2010
Mensajes: 12
Antigüedad: 13 años, 3 meses
Puntos: 0
Pregunta "pcntl_fork();" hijo no ejecuta desde navegador

Buenas a todos! tengo una duda que por mucho que busco no consigo solventar....

tengo el siguiente codigo:

$padre_pid = getmypid();
$hijo_pid = pcntl_fork();

if (getmypid() == $hijo_pid) //Estamos en el proceso hijo
{
echo 'hijo dentro: '.$hijo_pid.'<br>';
header ("Location: ./script2.php");
}
if(getmypid() == $padre_pid) //Estamos en el proceso hijo
{

echo 'padre dentro: '.$padre_pid.'<br>';
//pcntl_waitpid(-1,$status);
}

echo 'fin';


Mi idea es crear un proceso hijo que me ejecute otro script, esperarle desde el padre, y una vez finalizado continuar. Creo que el problema viene al ser ejecutado desde el navegador, pero estoy perdidisimo, no se si hay manera de solucionarlo o por el contrario no se puede hacer.

alguna idea?? muchas gracias!
  #2 (permalink)  
Antiguo 05/12/2013, 06:12
Avatar de guardarmicorreo  
Fecha de Ingreso: noviembre-2012
Ubicación: Córdoba
Mensajes: 1.153
Antigüedad: 11 años, 5 meses
Puntos: 84
Respuesta: "pcntl_fork();" hijo no ejecuta desde navegador

¿Qué problema tienes exactamente?
__________________
Ayúdame a hacerlo por mi mismo.
  #3 (permalink)  
Antiguo 05/12/2013, 06:18
 
Fecha de Ingreso: diciembre-2010
Mensajes: 12
Antigüedad: 13 años, 3 meses
Puntos: 0
Respuesta: "pcntl_fork();" hijo no ejecuta desde navegador

uy! lo puse en el título pero no en la descripción... parece que no me ejecuta el hijo, como veis hice unos echos a modo de traza y el resultado es el siguiente:

padre: 32644
hijo: 32722
padre dentro: 32644
fin

y tampoco se ejecuta en ningún momento el script2.php

gracias por respoder!
  #4 (permalink)  
Antiguo 05/12/2013, 09:04
Avatar de guardarmicorreo  
Fecha de Ingreso: noviembre-2012
Ubicación: Córdoba
Mensajes: 1.153
Antigüedad: 11 años, 5 meses
Puntos: 84
Respuesta: "pcntl_fork();" hijo no ejecuta desde navegador

sigo sin entender muy bien qué es lo que quieres hacer. si lo que quieres es ejecutar código en otro archivo, lo más lógico y razonable es que lo envuelvas en una función o clase y la llames desde este código que has puesto aquí.

header location no es para ejecutar, sino que desplaza al usuario a otro documento enviando una cabecera http.

por otro lado, getmypid() siempre será igual a $padre_pid ¿no crees?

si explicaras mejor qué quieres hacer tal vez con mucho gusto pueda ayudarte más :D

saludos!
__________________
Ayúdame a hacerlo por mi mismo.
  #5 (permalink)  
Antiguo 05/12/2013, 09:26
 
Fecha de Ingreso: diciembre-2010
Mensajes: 12
Antigüedad: 13 años, 3 meses
Puntos: 0
Respuesta: "pcntl_fork();" hijo no ejecuta desde navegador

A ver si me explico que no se si será correcto mi planteamiento...

Pretendo crear un proceso hijo (uno o los que sea) que ejecute un segundo script (haga la tarea q haga, más o menos pesada) en segundo plano.

Dejando al lado el tema de la llamada a otro script, mi pregunta es acerca del pcntl_fork();

Según tengo entendido despues de la llamada al pcntl_fork(); tendre dos procesos independientes que han replicado las variables y el codigo a ejecutar, y que únicamente se diferencian por su identificador.

A partir de la llamada juegas con el tema del identificador para ver que trozo de codigo ejecuta el padre y el hijo. ¿Es así o estoy equivocado? ¿de ser asi porq motivo no funciona mi codigo? ¿tiene q ver que este ejecutandose el script desde el navegador en lugar de una shell?

Os comento para posibles respuestas que tengo activados los modulos necesarios en apache (o al menos eso creo) por las pruebas que hice tras googlear un poco.

Un saludo.
  #6 (permalink)  
Antiguo 05/12/2013, 10:29
Avatar de guardarmicorreo  
Fecha de Ingreso: noviembre-2012
Ubicación: Córdoba
Mensajes: 1.153
Antigüedad: 11 años, 5 meses
Puntos: 84
Respuesta: "pcntl_fork();" hijo no ejecuta desde navegador

Cita:
Iniciado por pezcaditox Ver Mensaje
A ver si me explico que no se si será correcto mi planteamiento...

Pretendo crear un proceso hijo (uno o los que sea) que ejecute un segundo script (haga la tarea q haga, más o menos pesada) en segundo plano.

Dejando al lado el tema de la llamada a otro script, mi pregunta es acerca del pcntl_fork();

Según tengo entendido despues de la llamada al pcntl_fork(); tendre dos procesos independientes que han replicado las variables y el codigo a ejecutar, y que únicamente se diferencian por su identificador.

A partir de la llamada juegas con el tema del identificador para ver que trozo de codigo ejecuta el padre y el hijo. ¿Es así o estoy equivocado? ¿de ser asi porq motivo no funciona mi codigo? ¿tiene q ver que este ejecutandose el script desde el navegador en lugar de una shell?

Os comento para posibles respuestas que tengo activados los modulos necesarios en apache (o al menos eso creo) por las pruebas que hice tras googlear un poco.

Un saludo.
Si no me equivoco, en PHP no hay segundos planos o procesos paralelos. Es todo lineal/secuencial (opera por 'tiempo de ejecución'). Tu código lo que hace es:

1º) recoge en la variable padre_pid un valor devuelto por la función getmypid().
2º) recoge en la variable hijo_pid un valor devuelto por la función pcntl_fork().
3º) comprueba con condicional if si el valor devuelto por la función getmypid() es igual al valor de la variable hijo_pid.
*si esto es cierto imprime un valor y traslada al usuario mediante cabecera HTTP a otro documento.
4º) comprueba si el valor devuelto por la función getmypid() es igual al valor de la variable padre_pid (dado por la función getmypid).
*si esto es cierto imprime un valor.
5º) imprime fin.

fin de la ejecución.

En PHP no hay procesos paralelos, puesto que pasan por un intérprete que comienza a leer el documento de arriba hacia abajo y va resolviendo cada instrucción finalizada con ';' o cada iteración de un bucle, etc.

No se si he sido claro. Espero que sí :)
__________________
Ayúdame a hacerlo por mi mismo.
  #7 (permalink)  
Antiguo 13/12/2013, 02:54
 
Fecha de Ingreso: diciembre-2010
Mensajes: 12
Antigüedad: 13 años, 3 meses
Puntos: 0
Respuesta: "pcntl_fork();" hijo no ejecuta desde navegador

Despues de probar y probar, llego a la conclusión que si tu aplicación esta programada para ejecutarse desde consola funciona correctamente. Por el contrario si lo ejecutas desde un navegador na' de na' .

Si es erroneo que alguien lo diga!

Gracias por tu tiempo guardarmicorreo!
  #8 (permalink)  
Antiguo 13/12/2013, 03:38
Avatar de masterpuppet
Software Craftsman
 
Fecha de Ingreso: enero-2008
Ubicación: Montevideo, Uruguay
Mensajes: 3.550
Antigüedad: 16 años, 3 meses
Puntos: 845
Respuesta: "pcntl_fork();" hijo no ejecuta desde navegador

@pezcaditox, pasaste por la documentación ?

Cita:
Process Control should not be enabled within a web server environment and unexpected results may happen if any Process Control functions are used within a web server environment.
__________________
http://es.phptherightway.com/
thats us riders :)
  #9 (permalink)  
Antiguo 13/12/2013, 06:44
 
Fecha de Ingreso: diciembre-2010
Mensajes: 12
Antigüedad: 13 años, 3 meses
Puntos: 0
Respuesta: "pcntl_fork();" hijo no ejecuta desde navegador

Cita:
Iniciado por masterpuppet Ver Mensaje
@pezcaditox, pasaste por la documentación ?
ups! no llegue a ver eso! gracias, para otra es a lo primero que recurriré, mira que le di vueltas a lo tonto
  #10 (permalink)  
Antiguo 13/12/2013, 10:05
Avatar de dashtrash
Colaborador
 
Fecha de Ingreso: abril-2007
Ubicación: Ni en Sevilla,ni en Sanlúcar..qué más da..
Mensajes: 927
Antigüedad: 17 años
Puntos: 270
Respuesta: "pcntl_fork();" hijo no ejecuta desde navegador

Todo esto depende de lo que quieras hacer.Si a lo que llamas "tarea de segundo plano" es algo que va a ser lento, y que no quieres parar a la request principal esperando a que termine, no es necesario que hagas fork() de procesos.Debes terminar la request actual, pero indicarle al SAPI que no mate a PHP.
Usando el SAPI fastcgi (fpm), con fastcgi_finish_request() , puedes terminar la request, pero seguir procesando PHP.Creo que con el SAPI usado con Apache también lo puedes hacer, pero ahora mismo no recuerdo cómo.
Hay que tener en cuenta que cualquier error que se produzca tras el fastcgi_finish_request(), no podrás notificarlo via html (la salida html ya se ha enviado).

Etiquetas: ejecuta, hijo, navegador
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 15:58.