Dans le développement back-end d'aujourd'hui, la programmation multi-threadded est devenue un moyen important pour améliorer les capacités de concurrence du système. Mais en tant que langue backend traditionnelle, PHP ne prend pas en charge nativement le multi-threading, ce qui provoque souvent des doutes parmi les débutants et les développeurs. Cet article explorera ce numéro en profondeur sous trois perspectives: concept de conception, limitations techniques et alternatives réalisables.
PHP a été initialement conçu pour le développement Web, et sa philosophie principale est de répondre rapidement à chaque demande HTTP. Pour assurer la stabilité et l'isolement des ressources des services Web, PHP adopte un modèle d'exécution d'un processus par demande. Cela peut éviter des problèmes complexes causés par le partage de l'État, tels que la cohérence des sessions, la concurrence des données et la sécurité des fils.
Bien que le multithreadage puisse améliorer la concurrence des applications, il s'accompagne également d'une série de problèmes difficiles à dégager et à maintenir des problèmes, tels que l'impasse, les conditions de course, la synchronisation des threads, etc. pour la plupart des applications Web centrées sur la demande, l'introduction de la lecture multithrecaire n'apporte pas seulement des avantages significatifs, mais peut augmenter le risque d'erreurs du système.
PHP fonctionne généralement sur la base du mode de réponse de la demande de cycle de vie de courte durée de vie. Cela signifie que chaque demande est détruite une fois le traitement terminé et n'occupera pas les ressources du serveur pendant longtemps. La programmation multithread nécessite de maintenir plusieurs threads actifs dans le même processus, ce qui met des exigences plus élevées sur les ressources du serveur et la gestion de la mémoire et est incompatible avec le modèle d'exécution léger actuel de PHP.
Bien que PHP lui-même ne prenne pas en charge les mécanismes de multithreaux natifs, les développeurs peuvent toujours utiliser d'autres méthodes pour implémenter un traitement simultané. Voici deux méthodes de mise en œuvre grand public:
En créant des processus enfants, PHP peut simuler des capacités de traitement simultanées. Le contrôle de processus peut être implémenté à l'aide de l'extension PCNTL :
if (function_exists('pcntl_fork')) {
$pid = pcntl_fork();
if ($pid == -1) {
die('could not fork');
} elseif ($pid) {
// Le code du processus parent
} else {
// Le code du processus de l'enfant
}
}
Cette méthode peut être utilisée pour implémenter un traitement parallèle des tâches, mais elle nécessite une gestion minutieuse des ressources et du cycle de vie du processus enfant.
L'écosystème PHP moderne a également introduit des extensions et des cadres qui prennent en charge la programmation asynchrone, tels que ReactPHP et Swoole. Ils mettent en œuvre des opérations d'E / S très concurrentes dans un seul fil à travers des mécanismes pilotés par des événements, qui conviennent aux scénarios où un grand nombre de demandes de réseau sont nécessaires.
Par exemple, Swoole utilise la technologie coroutine intégrée pour permettre à PHP de gérer les tâches asynchrones aussi efficacement que Node.js, tout en conservant la structure synchrone du code et en améliorant la lisibilité.
La raison fondamentale pour laquelle PHP ne prend pas en charge la programmation multithreade est qu'elle optimise le modèle d'exécution pour les services Web, en choisissant de sacrifier la complexité pour l'efficacité du développement et la stabilité. Bien qu'il n'y ait pas de support multi-threading natif, les développeurs peuvent toujours atteindre l'objectif de traitement simultané via la fourche, la programmation asynchrone, etc. La compréhension de ces orientations de conception de PHP aidera les développeurs à effectuer des sélections techniques plus appropriées dans des projets réels.