pthreads est une API orientée objet qui permet le multi-threading en espace utilisateur en PHP. Il inclut tous les outils nécessaires pour créer des applications multi-threadées. Les applications PHP peuvent créer, lire, écrire, exécuter et synchroniser des Threads, des Workers, et des objets Threaded.
Un objet Threaded : Un objet Threaded est la fonctionnalité de base qui permet d'utiliser pthreads. Il expose des méthodes de synchronisation ainsi que divers interfaces utile pour le développeur.
Un objet Thread : L'utilisateur peut implémenter un thread en étendant la déclaration Thread fournie par pthreads et en implémentant la méthode run. N'importe quel membre peut écrire et lire dans n'importe quel contexte avec une référence au Thread, n'importe quel contexte peut aussi exécuter n'importe quelle méthode publique et protégée. La méthode run de l'implémentation est exécutée dans un thread séparé lorsque la méthode start de l'implémentation est appelée depuis le contexte (Thread ou Processus) qui l'a créé. Seul le contexte qui crée un thread peut le démarre ou le rejoindre.
Un objet Worker : Un Thread Worker a un statut persistant, et sera disponible depuis l'appelant pour le démarrer tant que l'objet ne sort pas du scope, ou qu'il n'est pas explicitement éteint. N'importe quel contexte avec une référence peut empiler des objets dans le Worker qui sera exécuté par le Worker dans un Thread séparé. La méthode run d'un Worker est exécutée avant les objets de la pile, ainsi, il peut initialiser les ressources dont les objets auront besoin.
Un Pool: Un Pool de Worker threadés peut être utilités pour distribuer des objets Threaded sur les Workers. La classe Pool implémente cette fonctionnalité et tient compte des références de facon saine. Introduite dans la version v1.0.0, l'implémentation de Pool est la plus simple et efficiente facon d'utiliser de nombreux threads.
Pool est un objet PHP classique, et donc ses instances ne doivent pas être partagés entre les contextes.
Synchronisation : Tous les objets que pthreads crée possèdent un mécanisme de synchronisation de la forme (familier pour les programmeurs Java) ::wait et ::notify. L'appel à ::wait sur un objet fera que le contexte attendra qu'un autre contexte appelle ::notify sur le même objet. Ceci permet une synchronisation puissante entre les objets Threadés en PHP.
Tout objet prévu pour être utilisé dans une partie multi-threadé de votre application doit étendre Treaded.
Modificateurs de méthode : Les méthodes protégées des objets Threadés sont protégées par pthreads, aussi, uniquement un contexte peut appeler cette méthode à la fois. Les méthodes privées des objets Threadés peuvent seulement être appelées depuis l'objet Threadé pendant l'exécution.
Stockage des données : En règle générale, tous les types de données pouvant être linéarisé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 linéarisation ; 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 linéarisé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.
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 fonctionalité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.
Dans l'environnement d'exécution de pthreads, des restrictions et des limitations sont nécessaires afin de fournir un environnement stable.