Primero que nada..
No, no son hilos verdaderos , según las definiciones de CS, pero realmente no se nota la diferencia. Lo diré de esta manera: esta biblioteca está más cerca de la sensación de un verdadero hilo que la nueva hamburguesa "McPlant" de McDonalds de la carne de res. ?
Si eres como yo, ¡te encanta PHP! Te encanta la flexibilidad y el poder del lenguaje: la libertad de escribir código descuidado (no lo defiendo, pero defenderé hasta la muerte el derecho a escribir código descuidado) o de crear obras de arte lógica indiscutiblemente hermosas. Ahora, para todos mis programadores de C (y C++, supongo), tienen una biblioteca no solo para mostrar realmente el poder de PHP, ¡sino también para potenciar su próximo proyecto!
Esta biblioteca le permite realizar procesos en paralelo de manera muy eficiente de una manera que se parece mucho al subproceso múltiple POSIX. Puede compartir variables globales entre todos phpthreads , pasar valores/objetos/matrices a su PHPTHread en el momento de la creación, compartir valores/objetos/matrices fácilmente entre phpthreads en ejecución y recibir valores/objetos/matrices de salida de PHPThread cuando cada PHPThread termina a través de phpthread_join()
familia de funciones.
Diseñé esta biblioteca porque quería escribir un servidor WebSocket de alto rendimiento para manejar fácilmente miles de conexiones simultáneas a través de las cuales se pudieran transferir rápidamente grandes cantidades de datos (piense en imágenes o videos). Sí, fundamentalmente, es un servidor de fork()
, pero la capa PHPThread en la parte superior hace que sea muy fácil de implementar y al mismo tiempo proporciona un mecanismo para una IPC fácil (y similar a un subproceso). Podría haber usado C y obtener un mejor rendimiento, pero para mí, esto parecía más portátil y fácil de implementar a medida que los servidores se activan, así que aquí está.
Para los más técnicos, esta biblioteca no se ve obstaculizada temporalmente por la necesidad de utilizar "ticks". Eso es parte de lo que lo hace tan rápido. La biblioteca utiliza señales (por ejemplo, SIGUSR1 y SIGUSR2) internamente para interrumpir la ejecución y cambiar de contexto de forma muy fluida. Sí, estamos acaparando SIGUSR1 y 2, así que si su proyecto usa esas señales, considere usar phpthread_send_message()
para una función de manejo de mensajes designada (ver: ejemplos/messages1.php y ejemplos/messages2.php). Debería adaptarse completamente a su propósito.
Hay ejemplos que puede ejecutar en el directorio "ejemplos". Siéntase libre de colocar un shebang para una fácil ejecución, o ejecutarlos prefijándolos con php <filename>
. Aún no los he completado todos, pero sí un buen número de ellos. Al menos lo suficiente para comprender bien las capacidades.
phpthreads requiere las siguientes extensiones PHP:
<?php
require_once '../lib/phpthread.php'; /* Use correct path! */
function thread_proc( $thread,
$param)
{
echo "nt[PHPTHREAD] - I've started and have a param: "" . print_r($param, true) . ""!n";
for ($i = 0; $i < 15; $i++) {
usleep(1000000);
echo "t[PHPTHREAD] - Tick!n";
}
$myobj = (object)array(
'seconds_alive'=>$i,
'lucky_number'=>rand(0, 10000)
);
echo "nt[PHPTHREAD] - I'm returning this:n";
print_r($myobj);
echo "n";
echo "<--------------------------------------->nn";
return $myobj;
}
$id = phpthread_create($phpthread, array(), "thread_proc", null, array("this awesome string!"));
for ($i = 0; $i < 5; $i++) {
echo "n[MAIN] - Doing my thing...n";
usleep(1000000);
}
echo "n[MAIN] - Okay, I'm tired. Waiting on child to quit.n";
phpthread_join($id, $retval);
echo "n[MAIN] - Child is done. It returned:n";
print_r($retval);