Maison  >  Article  >  développement back-end  >  Guide du débutant en PHP : programmation multithread

Guide du débutant en PHP : programmation multithread

WBOY
WBOYoriginal
2023-05-20 12:51:06916parcourir

PHP est un langage de programmation côté serveur populaire utilisé pour créer des applications Web et des sites Web dynamiques. Bien que PHP ne prenne pas en charge nativement la programmation multithread, il fournit des outils et des extensions qui peuvent être utilisés pour implémenter des opérations d'E/S non bloquantes et une communication inter-processus. Cet article présentera les connaissances et les outils de base de la programmation multithread PHP.

  1. Bases de la programmation multithread

La programmation multithread est une méthode de programmation concurrente qui permet à un programme d'effectuer plusieurs tâches en même temps . Un thread est la plus petite unité permettant au système d'exploitation d'allouer des ressources. Il dispose d'un chemin d'exécution de code et d'une pile indépendants (appels de fonction de stockage et variables locales). Les ressources telles que la mémoire et les descripteurs de fichiers peuvent être partagées entre les threads. Des outils de synchronisation tels que des verrous et des variables de condition doivent donc être utilisés pour éviter les conditions de concurrence.

En PHP, créer un thread nécessite d'utiliser les fonctions fournies par l'extension PCNTL. PCNTL est une extension de PHP qui fournit une interface pour le contrôle des processus PHP. En utilisant l'extension PCNTL, nous pouvons créer et gérer des sous-processus, envoyer et recevoir des signaux et gérer les événements de sortie de processus et bien plus encore.

  1. Extension PCNTL

PHP L'extension PCNTL fournit plusieurs fonctions qui peuvent être utilisées pour la programmation multithread. Voici quelques fonctions courantes :# 🎜 🎜#

pcntl_fork() : Créez un processus enfant et copiez toutes les ressources du processus actuel (y compris le code et les données). La seule différence entre le processus enfant et le processus parent est qu'ils ont des ID de processus différents. Le processus parent peut utiliser cet ID pour surveiller et contrôler le processus enfant.

pcntl_fork():创建一个子进程,并复制当前进程的所有资源(包括代码和数据)。子进程与父进程唯一的区别是有不同的进程ID。父进程可以使用这个ID来监视和控制子进程。

pcntl_wait($status):等待任何子进程退出,并取得它的退出状态。这个函数会阻塞当前进程的执行,直到任何一个子进程退出。

pcntl_signal($sig, $handler):注册一个信号处理器,当接收到指定信号时,调用指定的处理函数。可以使用这个函数来捕捉和处理子进程终止、中断和其他事件。

pcntl_alarm($seconds)pcntl_wait($status) : Attendez que tout processus enfant se termine et obtenez son statut de sortie. Cette fonction bloque l'exécution du processus en cours jusqu'à la fin de tout processus enfant.

    pcntl_signal($sig, $handler) : enregistrez un processeur de signal et appelez la fonction de traitement spécifiée lorsque le signal spécifié est reçu. Vous pouvez utiliser cette fonction pour capturer et gérer l'arrêt des processus enfants, les interruptions et d'autres événements.
  1. pcntl_alarm($seconds) : Installez un signal de minuterie et envoyez un signal SIGALARM après le nombre de secondes spécifié. Vous pouvez utiliser cette fonction pour effectuer certaines tâches régulièrement, telles que des interrogations pour vérifier l'état du processus et les événements de mise à jour des fichiers.

Communication inter-processus

En programmation multi-thread, la communication inter-processus (IPC) est essentielle. PHP fournit une variété de méthodes IPC, telles que :

(1) Pipe (pipe) : permet l'échange de données entre deux processus liés, où un processus écrit des données et l'autre processus lit des données.

(2) File d'attente de messages : un mécanisme de transfert de données entre les processus. Les processus peuvent envoyer et recevoir des messages via des files d'attente de messages, qui implémentent une communication asynchrone.

    (3) Mémoire partagée : plusieurs processus peuvent accéder à la même zone de mémoire partagée pour partager l'état et les données.
  1. (4) Sémaphore (sémaphore) : utilisé pour la synchronisation et l'exclusion mutuelle entre plusieurs processus afin d'éviter les conditions de concurrence.

Implémentation de la programmation multi-thread PHP

L'implémentation de la programmation multi-thread en PHP nécessite l'utilisation d'extensions PCNTL et des outils IPC associés. Ce qui suit est un exemple simple de programmation multithread PHP :

<?php

$pid = pcntl_fork();

if ($pid == -1) {
    die('could not fork');
} else if ($pid) {
    // 父进程
    pcntl_wait($status); // 等待子进程退出
} else {
    // 子进程
    echo "child process
";
    sleep(5);
    exit(0); // 退出子进程
}

echo "parent process
";
    Cet exemple crée un processus enfant et imprime un message dans le processus enfant. Le processus parent attend la fin du processus enfant avant de quitter. Dans des applications pratiques, les outils IPC peuvent être utilisés pour réaliser une communication et une synchronisation inter-processus. Par exemple, utilisez une file d'attente de messages pour implémenter la transmission de messages entre les processus parent et enfant :
  1. <?php
    
    $parent_pid = getmypid(); // 获取父进程ID
    $msg_queue = msg_get_queue(123); // 创建消息队列
    
    $pid = pcntl_fork();
    
    if ($pid == -1) {
        die('could not fork');
    } else if ($pid) {
        // 父进程
        sleep(1); // 等待子进程创建消息队列
        msg_send($msg_queue, $parent_pid, "Hello, child process!"); // 发送消息
        echo "message sent
    ";
        pcntl_wait($status); // 等待子进程退出
    } else {
        // 子进程
        $child_pid = getmypid(); // 获取子进程ID
        echo "child process
    ";
        $msg = null;
        msg_receive($msg_queue, $child_pid, $msgtype, 1024, $msg); // 接收消息
        echo "received message: $msg
    ";
        exit(0); // 退出子进程
    }
    
    echo "parent process
    ";
  2. Cet exemple crée une file d'attente de messages et transmet un message de chaîne entre les processus parent et enfant. Le processus parent attend la fin du processus enfant avant de quitter. Notez que dans cet exemple, vous devez utiliser l'ID de processus comme type de message pour empêcher le message d'être reçu par d'autres processus.

Summary#🎜🎜##🎜🎜##🎜🎜#Bien que PHP lui-même ne prenne pas en charge le multi-threading, en utilisant les extensions PCNTL et les outils IPC associés, nous pouvons réaliser un multi-thread Programmation, contrôle de concurrence et communication IPC et autres fonctions. La programmation multithread peut améliorer les performances et la réactivité du programme, mais il faut veiller à éviter les problèmes tels que les conditions de concurrence et les blocages. Dans les applications pratiques, les outils et technologies appropriés doivent être sélectionnés en fonction de scénarios spécifiques. #🎜🎜#

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn