En el Afan de poder Crear Hilos Paralelos en php, para una tool (YASBU ) llegue a pcntl_fork, pero este solo funciona en unix, aunque puede ser instalado en windows nececita de una version compilada con --enabled-pcntl por lo cual volver a compilar php y que no todos lo tengan, me mancho la pelicula.
Luego de Investigar Bastante y Caer en Esta web
http://www.ibm.com/developerworks/library/os-php-multitask/index.html
Logre Ver que se podia , con "stream_socket"
<?php
//coded by OzX Undersecurity.net
$hosts[] = "www.terra.cl";
$hosts[] = "www.ask.com";
$hosts[] = "www.google.com";
$hosts[] = "www.microsoft.com";
$hosts[] = "www.terra.cl";
$hosts[] = "www.ask.com";
$hosts[] = "www.google.com";
$hosts[] = "www.microsoft.com";
$hosts[] = "www.terra.cl";
$hosts[] = "www.ask.com";
$hosts[] = "www.google.com";
$hosts[] = "www.microsoft.com";
$hosts[] = "www.terra.cl";
$hosts[] = "www.ask.com";
$hosts[] = "www.google.com";
$hosts[] = "www.microsoft.com";
$hosts[] = "www.terra.cl";
$hosts[] = "www.ask.com";
$hosts[] = "www.google.com";
$hosts[] = "www.microsoft.com";
$hosts[] = "www.terra.cl";
$hosts[] = "www.ask.com";
$hosts[] = "www.google.com";
$hosts[] = "www.microsoft.com";
$hosts[] = "www.terra.cl";
$hosts[] = "www.ask.com";
$hosts[] = "www.google.com";
$hosts[] = "www.microsoft.com";
$hosts[] = "www.terra.cl";
$hosts[] = "www.ask.com";
$hosts[] = "www.terra.cl";
$data = "";
$timeout = 15;
$sockets = array();
#Asignamos Los sockets Creados a un Array
foreach ($hosts as $id => $host) {
$sockets[$id] = stream_socket_client("$host:80", $errno, $errstr, $timeout, STREAM_CLIENT_ASYNC_CONNECT);
}
#=================================================
$total = count($sockets); //Contamos el Total de Socket Creados
for($x=0;$x<$total;$x++){ // Creamos el Ciclo para Realizar las Peticiones
$write = $sockets; //Se Copia el array de sockets a write, en cada ciclo este sera 1 menos.
$n = stream_select($r=null, $write, $e = null, $timeout); //establecemos y selecionamos un socket.
echo "[+] HOST :".$hosts[$x]."\n";
if ($n > 0) { //si existen cambios (si quedan socket por procesar)then...
$packet = "GET /index.php HTTP/1.1\r\n";//Headers
$packet .= "Host: ".$hosts[$x]."\r\n"; //Headers
$packet .= "Connection: close\r\n\r\n"; //Headers
fwrite($sockets[$x],$packet); //Enviamos la Peticion
while (!feof($sockets[$x])) {
$data .= fgets($sockets[$x], 128); //Obtenemos el Code Source
}
echo strlen($data)."\n"; //Contamos el Total (Solo Test)
fclose($sockets[$x]); //Cerramos Conexion
$data = "";
/*Borramos en el Array La peticion recien pasada para que en el siguiente */
unset($sockets[$x]);
}
}
?>
La Magia ¡ 30 Peticiones Simultaneas :D
(http://i39.tinypic.com/2dlm7o1.png)
Y así Tenemos MultiHilos sin Fork ¡, Nose que Fallas Podria Tener pero nunca esta a salvo.
Saludos¡
Fuente (http://foro.undersecurity.net/read.php?11,1194)
EDIT: Edito el titulo y le Agrego FAKE :laugh: Para evitar nuevamente que me digan "hey chaval estas mal no es fork :¬¬" FAKE.
Saludos ¡
y esto de que nos sirve?.
Cita de: HansVon en 21 Marzo 2009, 09:18 AM
y esto de que nos sirve?.
jajajajajja :D bueno cuando estes con
http://es.wikipedia.org/wiki/Hilo_de_ejecuci%C3%B3n
vas a entender la ventaja y la optimizacion de ocupar fork, pero como dije arriba en windows no tienen pnctl por defecto por lo cual esta opcion ayuda bastante.
¡De que nos sirve?
Pues de Mucho. Como alternativa real de fork para crear procesos paralelos en peticiones http.
Saludos Brota¡
pD:
Solo Encontre 1 problema que es en que aparecen procesos zombies, una vez que repites demasiado el scripts. incluso podria hasta saturar tu conexion.
buscare la solucion y la posteo, tendria que existir alguna funcion kill_pid XD¡
Si alguien me ayuda genial jejeje :D
Ya encontre el problema de los Time_Wait, de los procesos que quedan en cola durante 30 segundos, demonios sin matar en otras palabras.
Se tiene que dejar que se ejecuten y terminen todas las consultas, si se interfiere dentro del ciclo del for con algun exit, y algo, aunque se cierren con fclose, este proceso seguira activo.
En Conclusión, no tiene que tener Ningun Proceso de interrupcion para que funcione perfecto.
Saludos¡
Siento pincharte el globo pero eso ni es multihilo ni se ejecutan en paralelo. Vamos, si consideras meter en un bucle una pool de conexiones y ejecutarlas SECUENCIALMENTE como procesamiento en paralelo...
La única forma probada de crear una emulación multihilo es usando CURL. http://www.ibuildings.com/blog/archives/811-Multithreading-in-PHP-with-CURL.html
También es evidente que no tienes ni idea de lo que es un fork.
Cita de: ^Cloud^ en 23 Marzo 2009, 11:44 AM
Siento pincharte el globo pero eso ni es multihilo ni se ejecutan en paralelo. Vamos, si consideras meter en un bucle una pool de conexiones y ejecutarlas SECUENCIALMENTE como procesamiento en paralelo...
La única forma probada de crear una emulación multihilo es usando CURL. http://www.ibuildings.com/blog/archives/811-Multithreading-in-PHP-with-CURL.html
También es evidente que no tienes ni idea de lo que es un fork.
Hi Brota.
Pero te recomiendo que leas el titulo 2 veces, en especial lo que esta en rojo.
ehmmm
Emular MultiHilos (multithread) Sin Fork ? l
No dije en ningun Momento que era multihilo, sino que emulaba la conducta de uno.
En cuanto a conexiones paralelas, no creo que este mal , porque todas se conectan al mismo instante, pero generan la peticion con milisegundos de diferencias.
Y en cuanto a los fork, estos se generan procesos indenticos con Pid distintos.(padres e hijos ) Esto no genera lo mismo que un "FORK", ni TAmpoco Multihilo, pero como te dije. Lee el titulo 2 veces.
Saludos¡
Ni sabes lo que es emulación, ni sabes lo que es un fork ni tienes idea de lo que es multihilo..
Te vas a tener que esforzar un poquito más si quieres convencerme de algo.
Cita de: ^Cloud^ en 25 Marzo 2009, 14:23 PM
Ni sabes lo que es emulación, ni sabes lo que es un fork ni tienes idea de lo que es multihilo..
Te vas a tener que esforzar un poquito más si quieres convencerme de algo.
:rolleyes: bueno.
de todas formas no te tengo porque convencer ;)
Saludos Brota¡
Cita de: ^Cloud^ en 25 Marzo 2009, 14:23 PM
Ni sabes lo que es emulación, ni sabes lo que es un fork ni tienes idea de lo que es multihilo..
Te vas a tener que esforzar un poquito más si quieres convencerme de algo.
Yo no eh visto que nadie te quiera convencer de nada ... ;)
OzX, estás algo equivocado...
<?php
$timeout = 15;
$sockets = array();
for ($x=0;$x<6;++$x) {
$hosts[] = "www.microsoft.com";
$hosts[] = "www.live.com";
$hosts[] = "www.apple.com";
$hosts[] = "www.yahoo.com";
}
foreach ($hosts as $id => $host) $sockets[$id] = stream_socket_client("$host:80", $errno, $errstr, $timeout, STREAM_CLIENT_ASYNC_CONNECT);
$total = count($sockets); echo '<body style="text-align:center;">';
for($x=0;$x<$total;++$x){
$data = '';
$write = $sockets;
$n = stream_select($r=null, $write, $e = null, $timeout);
echo '[<b>Socket</b>] <font color="red">'.microtime().'</font> | ';
if ($n > 0) {
$packet = "GET / HTTP/1.1\r\nHost: $hosts[$x]\r\nConnection: close\r\n\r\n";
echo '[<b>Request</b>] <font color="blue">'.microtime().'</font> «--» ';
fwrite($sockets[$x], $packet);
while (!feof($sockets[$x])) $data .= fgets($sockets[$x], 128);
echo '<font color="red">'.microtime().'</font> | [<b>Size</b>] <font color="orange">'.
str_pad(strlen($data),5,0, STR_PAD_LEFT)."</font><br>";
fclose($sockets[$x]);
unset($sockets[$x]);
}
}
echo '</body>';
?>
Y a las pruebas me remito...
(http://img220.imageshack.us/img220/5518/log2.png)
(http://img223.imageshack.us/img223/5822/logy.png)
Hi yeikos...
Equivocado en Que cosa?
Si es pork si no es "fork" o no es multihilo , o paralelo, etc
Pues como dije arriba, no lo es y no lo sera. es secuencial.
Como dije es Emular, "fake" de un multihilo, lo vengo diciendo desde unos post mas arriba.
Si tu haces un fsocketopen dentro de un Loop, te vas a dar cuenta que abren y cierran las conexion y una vez que se cierra una se abre la otra.
Claramente y repito No es que sea FORK o Multihilo. Emular "FAKE"
Es para emular lo que se podria obtener con un fork o multihilos o procesos paralelos. pero NO es igual.
Fake Fake Fake Emular ¡ :silbar: :silbar: :silbar: :silbar:
Mi intencion y objectivo claro de este code, es poder crear procesos mas rapidos que los que generarias con un Loop normal y fsockopen dentro de el.
¿Me equivoco en Eso? (para yeikos)
Pork pnctl_fork no esta en windows precompilado, por ello busque esta solucion y me funciona perfecto.
¿o ALguien tiene Alguna Otra solucion? (Para Cloude)
Saludos Yeikos ¡
Saludos¡
Emular: Imitar las acciones de otro procurando igualarlas o superarlas.
Eso es lo que entiendo yo por emular, más que nada por que ese es su significado, de ahí que tanto ^Cloud^ como yo coincidamos en lo mismo...
En base al título, entendí que estabas imitando la acción de fork creando varios hilos (multihilos) pudiendo así realizar conexiones en paralelo y no en serie...
Pero ahora te contradices... posiblemente confundiste los conceptos, pero aún así, no encuentro diferencia alguna, porque si no hace lo mismo, de qué sirve?
PD: fake = falso, engaño, mentira, bulo...
Cita de: yeikos en 25 Marzo 2009, 23:23 PM
Emular: Imitar las acciones de otro procurando igualarlas o superarlas.
Eso es lo que entiendo yo por emular, más que nada por que ese es su significado, de ahí que tanto ^Cloud^ como yo coincidamos en lo mismo...
En base al título, entendí que estabas imitando la acción de fork creando varios hilos (multihilos) pudiendo así realizar conexiones en paralelo y no en serie...
Pero ahora te contradices... posiblemente confundiste los conceptos, pero aún así, no encuentro diferencia alguna, porque si no hace lo mismo, de qué sirve?
PD: fake = falso, engaño, mentira, bulo...
Hi Brota ¡
Porque windows no tiene pcntl_fork.
Y este es el resultado mas proximo a lo que podria obtener con fork.
Vosotros podrian postear algun code , para así discutir y poder avanzar y obtener un script que sea lo mas parecido a fork :D.
Saludos Yeikos
Citarluca dot mariano at email dot it
12-Nov-2003 03:49
Hi folks,
if someone uses PHP-CLI onWin32 and wants to experiment the PCNTL stuff, I've packed a binary version of PHP with built-in pcntl, shmop, sysvshm and other typical Unix extensions... (thanks to Cygwin DLLs).
Download it: http://sourceforge.net/projects/phplet/
Cita de: yeikos en 26 Marzo 2009, 13:51 PM
Citarluca dot mariano at email dot it
12-Nov-2003 03:49
Hi folks,
if someone uses PHP-CLI onWin32 and wants to experiment the PCNTL stuff, I've packed a binary version of PHP with built-in pcntl, shmop, sysvshm and other typical Unix extensions... (thanks to Cygwin DLLs).
Download it: http://sourceforge.net/projects/phplet/
Aja, Si lo habia visto, pero no es la gracia tener que volver a bajarse otras cosas para que funcione. Sino nativamente como viene nativamente para windows.
para eso mejor pasarse a linux :D.
Lo que busco es poder realizar con el instalador que esta en php.net para windows, algo que sea "similar" a fork. o lo que este mas cerca a esto. (Mi Code).
Si Alguien tiene alguna idea u codigo que tenga que lo Postee Porfavor ;-)
Pd: Nose que tanto discuten que no es fork, que no es multihilo, Nadie dice que sea eso. Solo que es la Opcion mas cerca a este. (Sin tener que volver a llamar al archivo con proc_open().) Y que Emule o Que falsifique el resultado que me daria con fork, aunque
no sea lo mismo.. Calculad cuanto se demora con fork y con esta forma. Y calculad la diferencia. ;)
Saludos Brota¡