Primeiro..
Não, eles não são threads verdadeiros , de acordo com as definições de CS, mas você realmente não consegue perceber a diferença. Vou colocar desta forma - esta biblioteca está mais próxima da sensação do verdadeiro threading do que o novo hambúrguer "McPlant" do McDonalds está da carne bovina. ?
Se você é como eu, você adora PHP! Você adora a flexibilidade e o poder da linguagem - a liberdade de escrever códigos desleixados (não defendo isso, mas defenderei até a morte o direito de escrever códigos desleixados) ou de criar obras de arte lógica indiscutivelmente belas! Agora, para todos os meus programadores C (e C++, eu acho), você tem uma biblioteca não apenas para mostrar verdadeiramente o poder do PHP, mas para turbinar seu próximo projeto!
Esta biblioteca permite que você processe paralelamente de forma muito eficiente de uma forma que se assemelha muito ao multithreading POSIX. Você pode compartilhar variáveis globais entre todos os phpthreads , passar valores/objetos/arrays para seu PHPTHread na criação, compartilhar valores/objetos/arrays facilmente entre phpthreads em execução e receber valores/objetos/arrays de saída do PHPThread quando cada PHPThread termina através do phpthread_join()
família de funções.
Eu projetei esta biblioteca porque queria escrever um servidor WebSocket de alto desempenho para lidar facilmente com milhares de conexões simultâneas através das quais grandes quantidades de dados pudessem ser transferidas rapidamente (pense em imagens ou vídeo). Sim, fundamentalmente, é um servidor fork()
ing, mas a camada PHPThread na parte superior torna muito fácil a implantação, ao mesmo tempo que fornece um mecanismo para IPC fácil (e semelhante a thread). Eu poderia ter usado C e obtido melhor desempenho, mas para mim parecia mais portátil e fácil de implantar à medida que os servidores eram ativados, então agora aqui está.
Para vocês, pessoal mais técnico, esta biblioteca não é temporariamente impedida pela necessidade de usar “tiques”. Isso é parte do que o torna tão rápido. A biblioteca utiliza sinais (por exemplo, SIGUSR1 e SIGUSR2) internamente para interromper a execução e alternar o contexto com muita fluidez. Sim, estamos monopolizando SIGUSR1 e 2, então se o seu projeto estiver usando esses sinais, considere usar phpthread_send_message()
para uma função de manipulador de mensagens designada (veja: exemplos/messages1.php e exemplos/messages2.php). Deve atender totalmente ao seu propósito.
Existem exemplos que você pode executar no diretório "examples". Sinta-se à vontade para colocar um shebang para facilitar a execução ou executá-los prefixando-os com php <filename>
. Ainda não completei todos, mas já terminei um bom número deles. Pelo menos o suficiente para obter uma boa compreensão das capacidades.
phpthreads requer as seguintes extensões 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);