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ée 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. Elle 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 arrĂȘtĂ© (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
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ée 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Ă©e de
l'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.
à l'exception des objets Threadés, toute référence utilisée pour définir un membre d'un objet Threadé
est sĂ©parĂ©e 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 objets 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 ressources 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.