Tout d'abord..
Non, ce ne sont pas de vrais threads, selon les définitions CS, mais vous ne pouvez vraiment pas faire la différence. Je vais le dire de cette façon : cette bibliothèque est plus proche de la sensation d'un vrai threading que la nouvelle galette de hamburger "McPlant" de McDonald's ne l'est du bœuf. ?
Si vous êtes comme moi, vous aimez PHP ! Vous aimez la flexibilité et la puissance du langage - la liberté d'écrire du code bâclé (je ne le préconise pas, mais je défendrai jusqu'à la mort le droit d'écrire du code bâclé), ou de créer des œuvres d'art logique incontestablement belles ! Désormais, pour tous mes programmeurs C (et C++, je suppose), vous disposez d'une bibliothèque non seulement pour vraiment montrer la puissance de PHP, mais aussi pour dynamiser votre prochain projet !
Cette bibliothèque vous permet de traiter en parallèle très efficacement d'une manière qui ressemble très, très étroitement au multithreading POSIX. Vous pouvez partager des variables globales entre tous phpthreads , transmettre des valeurs/objets/tableaux à votre PHPTHread lors de la création, partager facilement des valeurs/objets/tableaux entre phpthreads en cours d'exécution et recevoir des valeurs/objets/tableaux de sortie PHPThread lorsque chaque PHPThread se termine via phpthread_join()
famille de fonctions.
J'ai conçu cette bibliothèque parce que je voulais écrire un serveur WebSocket hautes performances pour gérer facilement des milliers de connexions simultanées via lesquelles de grandes quantités de données pourraient être transférées rapidement (pensez aux images ou aux vidéos). Oui, fondamentalement, il s'agit d'un serveur fork()
, mais la couche PHPThread supérieure le rend très facile à déployer tout en fournissant un mécanisme pour un IPC simple (et semblable à un thread). J'aurais pu utiliser C et obtenir de meilleures performances, mais pour moi, cela semblait plus portable et plus facile à déployer à mesure que les serveurs démarrent, alors le voici maintenant.
Pour vous, les techniciens, cette bibliothèque n'est pas temporairement gênée par la nécessité d'utiliser des « ticks ». C'est en partie ce qui le rend si rapide. La bibliothèque utilise des signaux (par exemple SIGUSR1 et SIGUSR2) en interne pour interrompre l'exécution et changer de contexte de manière très fluide. Oui, nous monopolisons SIGUSR1 et 2, donc si votre projet utilise ces signaux, envisagez d'utiliser phpthread_send_message()
pour une fonction de gestionnaire de messages désignée (voir : examples/messages1.php et examples/messages2.php). Cela devrait parfaitement correspondre à votre objectif.
Il existe des exemples que vous pouvez exécuter dans le répertoire « exemples ». N'hésitez pas à placer un shebang pour une exécution facile, ou exécutez-les en les préfixant avec php <filename>
. Je ne les ai pas encore tous terminés, mais j'en ai terminé un bon nombre. Au moins suffisant pour bien comprendre les capacités.
phpthreads nécessite les extensions PHP suivantes :
<?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);