Introduction
pthreads est une API orientée objet qui apporte tous les outils nécessaires pour
le multithreading en PHP.
Les applications PHP peuvent créer, lire, écrire, exécuter
et synchroniser des Threads, des Workers, et des objets Threaded.
Avertissement
Cette extension est considéré non maintenue et morte.
Astuce
Envisager d'utiliser parallel à la place.
Avertissement
L'extension pthreads ne peut pas être utilisée dans un environnement de
serveur Web. Le Threading en PHP est donc limité aux applications basées
sur CLI uniquement.
Avertissement
pthreads (v3) peut être utilisé uniquement avec PHP 7.2+ à cause d'un
mode ZTS dangereux en PHP 7.0 et 7.1.
La classe Threaded constitue la base de la
fonctionnalité qui permet à pthreads de fonctionner. Il expose les méthodes
de synchronisation et quelques interfaces utiles pour le programmeur.
La classe Thread permet de créer des threads en
l'étendant simplement et en implémentant une méthode run
.
Tous les membres peuvent être écrits et lus par n'importe quel contexte avec
une référence au thread. Tout contexte peut également exécuter toutes les
méthodes publiques et protégées. Le corps de la méthode run sera exécuté
dans un thread séparé lorsque la méthode Thread::start()
de l'implémentation est appelée à partir du contexte qui l'a créé. Seul le
contexte qui crée un thread peut le démarrer et le rejoindre.
La classe Worker a un état persistant et sera
disponible à partir de l'appel à Thread::start() (une
méthode héritée) jusqu'à ce que l'objet soit hors de portée, ou soit
explicitement arreté (via Worker::shutdown()). Tout
contexte avec une référence à l'objet Worker peut empiler des tâches sur le
Worker (via Worker::stack()), où ces tâches seront
exécutées par le Worker dans un thread séparé. La méthode
run
d'un objet worker est exécutée avant tout objet de la
pile du worker, ce qui permet aux ressources d'être initialisées pour que
les objets à exécuter puissent les utiliser.
La classe Pool est utilisée pour créer un groupe de
worker pour distribuer des objets Threaded parmi eux.
Il est le moyen le plus facile et le plus efficace d'utiliser plusieurs
threads dans les applications PHP.
Attention
La classe Pool n'étend pas la classe
Threaded, et donc les objets basés sur pool sont
considérés comme des objets PHP normaux. En tant que tel, ses instances ne d
doivent pas être partagées entre des contextes différents.
La classe Volatile est nouvelle pour pthreads v3.
Elle est utilisée pour désigner les propriétés Threaded
mutable des classes Threaded (car celles-ci sont
désormais immuables par défaut). Elle est également utilisé pour stocker
des tableaux PHP dans des contextes Threaded.
La synchronisation est une capacité importante lors du Threading. Tous les
objets créés par pthreads ont été construits en synchronisation dans la
forme (qui sera familière aux programmeurs Java) de
Threaded::wait() et
Threaded::notify(). L'appel de
Threaded::wait() sur un objet entraînera le contexte
à attendre qu'un autre contexte appelle
Threaded::notify() sur le même objet. Ce mécanisme
permet une synchronisation puissante entre les objets
Threaded en PHP.
Attention
Tout objet prévu pour être utilisé dans une partie multithreadé de votre
application doit étendre Threaded.
Stockage des données : En règle générale, tous les types de données pouvant être sérialisés peuvent
être utilisés comme membre d'un objet Threadé, ils peuvent être lus, et écrits depuis n'importe quel
contexte avec une référence vers l'objet Threadé. Tous les types de données ne sont pas stockés
après sérialisation ; les types simples sont stockés sous leur forme initiale. Les types complexes,
les tableaux et les objets qui ne sont pas Threadés, sont stockés sérialisés ; ils peuvent être lus
et écrits dans l'objet Threadé depuis n'importe quel contexte avec une référence.
A l'exception des objets Threadés, toute référence utilisée pour définir un membre d'un objet Threadé
est séparé de la référence dans l'objet Threadé ; les mêmes données peuvent être lues directement
depuis l'objet Threadé à tout moment par n'importe quel contexte avec une référence vers l'objet Threadé.
Membres statiques : Lorsqu'un nouveau contexte est créé (Thread ou Worker),
ils sont généralement copiés, mais les ressources et objects avec un état
interne sont nullifiés (pour des raisons de sécurité). Ceci permet alors à la fonction une sorte de stockage local
au niveau du thread. Par exemple, lors du démarrage du contexte, une classe dont les membres statiques
incluent des informations de connexion vers un serveur de base de données, seules les informations
seront copiées, et non la connexion en tant que telle. Ceci permet au nouveau contexte d'initialiser
une connexion de la même façon que le contexte qui l'a créé, stockant la connexion au même endroit
sans pour autant affecter le contexte original.
Attention
Lorsque print_r, var_dump et d'autres fonctions de débogage sont exécutées, elles n'incluent pas
de protection contre la récursion.
Note:
Ressources : Les extensions et les fonctionnalités qui définissent des ressoures en PHP ne sont pas préparées
pour ce type d'environnement ; pthreads prend des dispositions en matière de ressource à partager entre
les contextes, cependant, pour la plupart des ressources, elles devront être considérées comme dangereuses.
Un soin et une extrème prudence devront être de mise pour partager les ressources entre les contextes.
Attention
Dans l'environnement d'exécution de pthreads, des restrictions et des limitations sont nécessaires afin de
fournir un environnement stable.