Emular MultiHilos (multithread) Sin Fork (FAKE FORK)

Iniciado por OzX, 21 Marzo 2009, 06:08 AM

0 Miembros y 1 Visitante están viendo este tema.

OzX

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 (php) [Seleccionar]

<?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$timeoutSTREAM_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





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 ¡

HardieVon


OzX

#2
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




OzX

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¡

^Cloud^

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.
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

#5
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¡

^Cloud^

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.
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

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¡

Krackwar ™

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 ...  ;)

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 (asm) [Seleccionar]

mov ecx,1000
Etiqueta:
invoke printf,"No Copiare en clases"
loop Etiq

yeikos

#9
OzX, estás algo equivocado...

Código (php) [Seleccionar]
<?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$timeoutSTREAM_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,0STR_PAD_LEFT)."</font><br>";
fclose($sockets[$x]);
unset($sockets[$x]); 
}
}

echo '</body>';

?>


Y a las pruebas me remito...