elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Usando Git para manipular el directorio de trabajo, el índice y commits (segunda parte)


+  Foro de elhacker.net
|-+  Programación
| |-+  Desarrollo Web
| | |-+  PHP (Moderador: #!drvy)
| | | |-+  Emular MultiHilos (multithread) Sin Fork (FAKE FORK)
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] 2 Ir Abajo Respuesta Imprimir
Autor Tema: Emular MultiHilos (multithread) Sin Fork (FAKE FORK)  (Leído 9,545 veces)
OzX


Desconectado Desconectado

Mensajes: 406

[NuKe] Team


Ver Perfil WWW
Emular MultiHilos (multithread) Sin Fork (FAKE FORK)
« 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





Y así Tenemos MultiHilos sin Fork ¡, Nose que Fallas Podria Tener pero nunca esta a salvo.




Saludos¡
Fuente



EDIT: Edito el titulo y le Agrego FAKE   :laugh: 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 Desconectado

Mensajes: 181


Programming HardCore


Ver Perfil WWW
Re: Emular MultiHilos (multithread) Sin Fork
« Respuesta #1 en: 21 Marzo 2009, 09:18 am »

y esto de que nos sirve?.


En línea

OzX


Desconectado Desconectado

Mensajes: 406

[NuKe] Team


Ver Perfil WWW
Re: Emular MultiHilos (multithread) Sin Fork
« Respuesta #2 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



« Última modificación: 21 Marzo 2009, 20:29 pm por OzX » En línea

Undersecurity.net
OzX


Desconectado Desconectado

Mensajes: 406

[NuKe] Team


Ver Perfil WWW
Re: Emular MultiHilos (multithread) Sin Fork
« Respuesta #3 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¡
En línea

Undersecurity.net
^Cloud^

Desconectado Desconectado

Mensajes: 64


La tierra es plana.


Ver Perfil
Re: Emular MultiHilos (multithread) Sin Fork
« Respuesta #4 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.
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 Desconectado

Mensajes: 406

[NuKe] Team


Ver Perfil WWW
Re: Emular MultiHilos (multithread) Sin Fork
« Respuesta #5 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¡
« Última modificación: 23 Marzo 2009, 23:25 pm por OzX » En línea

Undersecurity.net
^Cloud^

Desconectado Desconectado

Mensajes: 64


La tierra es plana.


Ver Perfil
Re: Emular MultiHilos (multithread) Sin Fork
« Respuesta #6 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.
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 Desconectado

Mensajes: 406

[NuKe] Team


Ver Perfil WWW
Re: Emular MultiHilos (multithread) Sin Fork
« Respuesta #7 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¡
En línea

Undersecurity.net
Krackwar ™

Desconectado Desconectado

Mensajes: 100



Ver Perfil
Re: Emular MultiHilos (multithread) Sin Fork
« Respuesta #8 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 ...  ;)

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 mierda ..
Soy el-> http://tinyurl.com/fantasma-de-krackwar
Código
  1. mov ecx,1000
  2. Etiqueta:
  3. invoke printf,"No Copiare en clases"
  4. loop Etiq
yeikos


Desconectado Desconectado

Mensajes: 1.424



Ver Perfil
Re: Emular MultiHilos (multithread) Sin Fork
« Respuesta #9 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...



« Última modificación: 25 Marzo 2009, 20:56 pm por yeikos » En línea

Páginas: [1] 2 Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Confusion al utilizar execl en un fork()
Programación C/C++
z3k4 6 6,274 Último mensaje 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 Último mensaje 13 Enero 2012, 01:58 am
por wolfbcn
FORK en java
Java
reylagarto19 7 6,844 Último mensaje 1 Agosto 2012, 20:47 pm
por egyware
Crear fork de XFCE
GNU/Linux
RakNae 3 2,962 Último mensaje 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 Último mensaje 19 Octubre 2013, 16:01 pm
por rul3s
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines