Autor
|
Tema: Emular MultiHilos (multithread) Sin Fork (FAKE FORK) (Leído 9,545 veces)
|
OzX
Desconectado
Mensajes: 406
[NuKe] Team
|
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.htmlLogre 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; #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 */ } } ?>
La Magia ¡ 30 Peticiones Simultaneas Y así Tenemos MultiHilos sin Fork ¡, Nose que Fallas Podria Tener pero nunca esta a salvo. Saludos¡ FuenteEDIT: Edito el titulo y le Agrego FAKE Para evitar nuevamente que me digan "hey chaval estas mal no es fork " FAKE. Saludos ¡
|
|
« Última modificación: 25 Marzo 2009, 22:40 pm por OzX »
|
En línea
|
Undersecurity.net
|
|
|
HardieVon
Desconectado
Mensajes: 181
Programming HardCore
|
y esto de que nos sirve?.
|
|
|
En línea
|
|
|
|
OzX
Desconectado
Mensajes: 406
[NuKe] Team
|
y esto de que nos sirve?.
jajajajajja bueno cuando estes con http://es.wikipedia.org/wiki/Hilo_de_ejecuci%C3%B3nvas 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
|
|
« Última modificación: 21 Marzo 2009, 20:29 pm por OzX »
|
En línea
|
Undersecurity.net
|
|
|
OzX
Desconectado
Mensajes: 406
[NuKe] Team
|
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¡
|
|
|
En línea
|
Undersecurity.net
|
|
|
^Cloud^
Desconectado
Mensajes: 64
La tierra es plana.
|
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.htmlTambién es evidente que no tienes ni idea de lo que es un fork.
|
|
|
En línea
|
Ahora resulta que imagino mi pasado y llevo en esta clínica cuarenta años. Nunca jamás he pisado la calle y el electroshock ha sido mi padre
|
|
|
OzX
Desconectado
Mensajes: 406
[NuKe] Team
|
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.htmlTambié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¡
|
|
« Última modificación: 23 Marzo 2009, 23:25 pm por OzX »
|
En línea
|
Undersecurity.net
|
|
|
^Cloud^
Desconectado
Mensajes: 64
La tierra es plana.
|
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.
|
|
|
En línea
|
Ahora resulta que imagino mi pasado y llevo en esta clínica cuarenta años. Nunca jamás he pisado la calle y el electroshock ha sido mi padre
|
|
|
OzX
Desconectado
Mensajes: 406
[NuKe] Team
|
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.
bueno. de todas formas no te tengo porque convencer Saludos Brota¡
|
|
|
En línea
|
Undersecurity.net
|
|
|
Krackwar ™
Desconectado
Mensajes: 100
|
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 ...
|
|
|
En línea
|
WHK es mas u17r4m4573r31337 que yo El error mas grande de el mundo es decir que el ser humano es inteligente. Facismo , antifacismo , etc.. la misma mie rda .. Soy el-> http://tinyurl.com/fantasma-de-krackwarmov ecx,1000 Etiqueta: invoke printf,"No Copiare en clases" loop Etiq
|
|
|
yeikos
Desconectado
Mensajes: 1.424
|
OzX, estás algo equivocado... <?php $timeout = 15; 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; 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">'. } } echo '</body>'; ?>
Y a las pruebas me remito...
|
|
« Última modificación: 25 Marzo 2009, 20:56 pm por yeikos »
|
En línea
|
|
|
|
|
Mensajes similares |
|
Asunto |
Iniciado por |
Respuestas |
Vistas |
Último mensaje |
|
|
Confusion al utilizar execl en un fork()
Programación C/C++
|
z3k4
|
6
|
6,274
|
12 Marzo 2011, 02:38 am
por [L]ord [R]NA
|
|
|
Pale Moon project, un fork de Firefox con versión de 64 bits
Software
|
wolfbcn
|
0
|
2,852
|
13 Enero 2012, 01:58 am
por wolfbcn
|
|
|
FORK en java
Java
|
reylagarto19
|
7
|
6,844
|
1 Agosto 2012, 20:47 pm
por egyware
|
|
|
Crear fork de XFCE
GNU/Linux
|
RakNae
|
3
|
2,962
|
27 Noviembre 2012, 19:04 pm
por portaro
|
|
|
Señales, fork se detiene para luego seguir su ejecucion con una señal.
Programación C/C++
|
rul3s
|
0
|
1,767
|
19 Octubre 2013, 16:01 pm
por rul3s
|
|