Foro de elhacker.net

Programación => PHP => Mensaje iniciado por: OzX en 21 Marzo 2009, 06:08 am



Título: Emular MultiHilos (multithread) Sin Fork (FAKE FORK)
Publicado por: OzX en 21 Marzo 2009, 06:08 am
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"


Código
  1. <?php
  2.  
  3. //coded by OzX Undersecurity.net
  4.  
  5. $hosts[] = "www.terra.cl";
  6. $hosts[] = "www.ask.com";
  7. $hosts[] = "www.google.com";
  8. $hosts[] = "www.microsoft.com";
  9. $hosts[] = "www.terra.cl";
  10. $hosts[] = "www.ask.com";
  11. $hosts[] = "www.google.com";
  12. $hosts[] = "www.microsoft.com";
  13. $hosts[] = "www.terra.cl";
  14. $hosts[] = "www.ask.com";
  15. $hosts[] = "www.google.com";
  16. $hosts[] = "www.microsoft.com";
  17. $hosts[] = "www.terra.cl";
  18. $hosts[] = "www.ask.com";
  19. $hosts[] = "www.google.com";
  20. $hosts[] = "www.microsoft.com";
  21. $hosts[] = "www.terra.cl";
  22. $hosts[] = "www.ask.com";
  23. $hosts[] = "www.google.com";
  24. $hosts[] = "www.microsoft.com";
  25. $hosts[] = "www.terra.cl";
  26. $hosts[] = "www.ask.com";
  27. $hosts[] = "www.google.com";
  28. $hosts[] = "www.microsoft.com";
  29. $hosts[] = "www.terra.cl";
  30. $hosts[] = "www.ask.com";
  31. $hosts[] = "www.google.com";
  32. $hosts[] = "www.microsoft.com";
  33. $hosts[] = "www.terra.cl";
  34. $hosts[] = "www.ask.com";
  35. $hosts[] = "www.terra.cl";
  36.  
  37.  
  38. $data = "";
  39. $timeout = 15;
  40. $sockets = array();
  41.  
  42.  
  43. #Asignamos Los sockets Creados a un Array
  44. foreach ($hosts as $id => $host) {
  45. $sockets[$id] = stream_socket_client("$host:80", $errno, $errstr, $timeout, STREAM_CLIENT_ASYNC_CONNECT);
  46. }
  47. #=================================================
  48. $total = count($sockets); //Contamos el Total de Socket Creados
  49.  
  50. for($x=0;$x<$total;$x++){ // Creamos el Ciclo para Realizar las Peticiones
  51. $write = $sockets; //Se Copia el array de sockets a write, en cada ciclo este sera 1 menos.
  52. $n = stream_select($r=null, $write, $e = null, $timeout); //establecemos y selecionamos un socket.
  53. echo "[+] HOST :".$hosts[$x]."\n";
  54. if ($n > 0) { //si existen cambios (si quedan socket por procesar)then...
  55. $packet  = "GET /index.php HTTP/1.1\r\n";//Headers
  56. $packet .= "Host: ".$hosts[$x]."\r\n";    //Headers
  57. $packet .= "Connection: close\r\n\r\n";    //Headers
  58. fwrite($sockets[$x],$packet); //Enviamos la Peticion
  59.     while (!feof($sockets[$x])) {
  60.      $data .= fgets($sockets[$x], 128); //Obtenemos el Code Source
  61.    }
  62. echo strlen($data)."\n"; //Contamos el Total (Solo Test)
  63. fclose($sockets[$x]); //Cerramos Conexion
  64. $data = "";
  65. /*Borramos en el Array La peticion recien pasada para que en el siguiente */
  66. unset($sockets[$x]);
  67.  
  68.  
  69. }
  70. }
  71.  
  72.  
  73. ?>
  74.  
  75.  
  76.  

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 ¡


Título: Re: Emular MultiHilos (multithread) Sin Fork
Publicado por: HardieVon en 21 Marzo 2009, 09:18 am
y esto de que nos sirve?.


Título: Re: Emular MultiHilos (multithread) Sin Fork
Publicado por: OzX en 21 Marzo 2009, 20:22 pm
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





Título: Re: Emular MultiHilos (multithread) Sin Fork
Publicado por: OzX en 21 Marzo 2009, 23:13 pm
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¡


Título: Re: Emular MultiHilos (multithread) Sin Fork
Publicado por: ^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.


Título: Re: Emular MultiHilos (multithread) Sin Fork
Publicado por: OzX en 23 Marzo 2009, 23:17 pm
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¡


Título: Re: Emular MultiHilos (multithread) Sin Fork
Publicado por: ^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.


Título: Re: Emular MultiHilos (multithread) Sin Fork
Publicado por: OzX en 25 Marzo 2009, 14:32 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¡


Título: Re: Emular MultiHilos (multithread) Sin Fork
Publicado por: Krackwar ™ en 25 Marzo 2009, 17:59 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 ...  ;)



Título: Re: Emular MultiHilos (multithread) Sin Fork
Publicado por: yeikos en 25 Marzo 2009, 20:53 pm
OzX, estás algo equivocado...

Código
  1. <?php
  2.  
  3. $timeout = 15;
  4. $sockets = array();
  5.  
  6. for ($x=0;$x<6;++$x) {
  7. $hosts[] = "www.microsoft.com";
  8. $hosts[] = "www.live.com";
  9. $hosts[] = "www.apple.com";
  10. $hosts[] = "www.yahoo.com";
  11. }
  12.  
  13. foreach ($hosts as $id => $host) $sockets[$id] = stream_socket_client("$host:80", $errno, $errstr, $timeout, STREAM_CLIENT_ASYNC_CONNECT);
  14. $total = count($sockets); echo '<body style="text-align:center;">';
  15.  
  16. for($x=0;$x<$total;++$x){
  17.  
  18. $data = '';
  19. $write = $sockets;
  20. $n = stream_select($r=null, $write, $e = null, $timeout);
  21. echo '[<b>Socket</b>] <font color="red">'.microtime().'</font> | ';
  22.  
  23. if ($n > 0) {
  24. $packet  = "GET / HTTP/1.1\r\nHost: $hosts[$x]\r\nConnection: close\r\n\r\n";    
  25. echo '[<b>Request</b>] <font color="blue">'.microtime().'</font> «--» ';
  26. fwrite($sockets[$x], $packet);
  27. while (!feof($sockets[$x]))  $data .= fgets($sockets[$x], 128);
  28. echo '<font color="red">'.microtime().'</font> | [<b>Size</b>] <font color="orange">'.
  29. str_pad(strlen($data),5,0, STR_PAD_LEFT)."</font><br>";
  30. fclose($sockets[$x]);
  31. unset($sockets[$x]);
  32. }
  33. }
  34.  
  35. echo '</body>';
  36.  
  37. ?>

Y a las pruebas me remito...

(http://img220.imageshack.us/img220/5518/log2.png)

(http://img223.imageshack.us/img223/5822/logy.png)


Título: Re: Emular MultiHilos (multithread) Sin Fork
Publicado por: OzX en 25 Marzo 2009, 22:11 pm
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¡



Título: Re: Emular MultiHilos (multithread) Sin Fork (FAKE FORK)
Publicado por: 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...


Título: Re: Emular MultiHilos (multithread) Sin Fork (FAKE FORK)
Publicado por: OzX en 26 Marzo 2009, 01:41 am
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




Título: Re: Emular MultiHilos (multithread) Sin Fork (FAKE FORK)
Publicado por: yeikos en 26 Marzo 2009, 13:51 pm
Citar
luca 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/


Título: Re: Emular MultiHilos (multithread) Sin Fork (FAKE FORK)
Publicado por: OzX en 27 Marzo 2009, 00:24 am
Citar
luca 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¡