parallel est une extension de concurrence parallèle pour PHP ≥ 7.2.0. A partir de parallel 1.2.0, PHP ≥ 8.0.0 est requis.
Une brève description des concepts de base de parallel suit, des informations plus détaillées peuvent être trouvées dans cette section du manuel.
Un parallel\Runtime représente un thread d'interpréteur PHP. Un parallel\Runtime est configuré avec un fichier d'amorçage optionnel passé à parallel\Runtime::__construct(), il s'agit généralement d'un chargeur automatique, ou d'une autre routine de préchargement: le fichier d'amorçage sera inclus avant l'exécution de toute tâche.
Après la construction, le parallel\Runtime reste disponible jusqu'à ce qu'il soit fermé, tué, ou détruit par les règles de portée normales des objets PHP. parallel\Runtime::run() permet au développeur de planifier des tâches pour une exécution parallèle. Un parallel\Runtime a un ordre de planification FIFO, les tâches seront exécutées dans l'ordre où elles sont planifiées.
Parallel implémente une API fonctionnel, de haut niveau sur parallel\Runtime qui fournit un seul point d'entrée pour exécuter du code parallèle avec une planification automatique: parallel\run().
Une tâche (Task) est simplement une Closure destinée à une exécution parallèle. La Closure peut contenir presque n'importe quelle instruction, y compris des fermetures imbriquées. Cependant, certaines instructions sont interdites dans les tâches:
yield
use by-reference
declare class
declare named function
Note:
Les fermetures imbriquées peuvent utiliser yield ou use by-reference, mais ne doivent pas contenir de déclarations de classe ou de fonctions nommées.
Note:
Aucune instruction n'est interdite dans les fichiers que la tâche peut inclure.
Le parallel\Future est utilisé pour accéder à la valeur de retour de la tâche, et expose une API pour l'annulation de la tâche.
Une tâche peut être planifiée avec des arguments, utiliser des variables de portée lexicale (par valeur), et retourner une valeur (via un parallel\Future), mais celles-ci ne permettent que la communication unidirectionnelle: Elles permettent au développeur d'envoyer des données dans une tâche et de récupérer des données à partir d'une tâche, mais ne permettent pas la communication bidirectionnelle entre les tâches. L'API parallel\Channel permet la communication bidirectionnelle entre les tâches, un parallel\Channel est un lien de type socket entre les tâches que le développeur peut utiliser pour envoyer et recevoir des données.
L'API parallel\Events implémente une boucle d'événements (Traversable) native, et la méthode parallel\Events::poll(). Cela permet au développeur de travailler avec des ensembles de canaux et/ou de futurs. Le développeur ajoute simplement des canaux et des futurs à la boucle d'événements, en définissant éventuellement l'entrée pour les écritures avec parallel\Events::setInput(), et entre dans une boucle foreach: parallel lira et écrira dans les objets au fur et à mesure qu'ils deviennent disponibles, renvoyant des objets parallel\Events\Event décrivant les opérations qui se sont produites.