# pthreads

# 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.

- Installation/Configuration
  - Pré-requis
  - Installation
- Constantes pré-définies
- Threaded — La classe Threaded
  - Threaded::chunk — Manipulation
  - Threaded::count — Manipulation
  - Threaded::extend — Manipulation pendant l'exécution
  - Threaded::isRunning — Détection de statut
  - Threaded::isTerminated — Détection de statut
  - Threaded::merge — Manipulation
  - Threaded::notify — Synchronisation
  - Threaded::notifyOne — Synchronise
  - Threaded::pop — Manipulation
  - Threaded::run — Exécution
  - Threaded::shift — Manipulation
  - Threaded::synchronized — Synchronisation
  - Threaded::wait — Synchronisation
- Thread — La classe Thread
  - Thread::getCreatorId — Identification
  - Thread::getCurrentThread — Identification
  - Thread::getCurrentThreadId — Identification
  - Thread::getThreadId — Identification
  - Thread::isJoined — Détection de statut
  - Thread::isStarted — Détection de statut
  - Thread::join — Synchronisation
  - Thread::start — Exécution
- Worker — La classe Worker
  - Worker::collect — Collecte les références des tâches terminées
  - Worker::getStacked — Obtient la taille de pile restante
  - Worker::isShutdown — Détection de statut
  - Worker::shutdown — Arrêter le worker
  - Worker::stack — Empile la tâche
  - Worker::unstack — Dépile une tâche
- Collectable — L'interface Collectable
  - Collectable::isGarbage — Détermine si un objet a été marqué comme obsolète
- Pool — La classe Pool
  - Pool::collect — Collecte les références des tâches achevées
  - Pool::__construct — Crée un nouveau Pool de Workers
  - Pool::resize — Redimensionne le Pool
  - Pool::shutdown — Arrête tous les workers
  - Pool::submit — Soumet un objet pour exécution
  - Pool::submitTo — Soumet une tâche à un worker spécifique pour exécution
- Volatile — La classe Volatile

`↑` and `↓` to navigate • `Enter` to select • `Esc` to close • `/` to open