Maison >développement back-end >tutoriel php >Plusieurs processus en PHP

Plusieurs processus en PHP

王林
王林original
2023-05-23 08:39:322173parcourir

Avec le développement d'Internet, de plus en plus de sites Web doivent véhiculer un grand nombre de demandes d'accès des utilisateurs. Lorsqu'il est confronté à une concurrence élevée, un serveur à processus unique atteint rapidement un goulot d'étranglement, empêchant les utilisateurs d'accéder normalement au site Web. Par conséquent, le multi-processus est devenu l’une des solutions efficaces pour résoudre les problèmes de concurrence élevée. Cet article présentera la technologie multi-processus en PHP pour améliorer la capacité du programme à gérer les requêtes simultanées tout en garantissant la qualité du programme.

1. Introduction aux multi-processus

En informatique, un processus fait référence à une instance de programme en cours d'exécution. Chaque processus possède son propre espace mémoire et ses propres ressources système. Le multitraitement fait référence à la création de plusieurs processus dans un seul programme. Chaque processus s'exécute indépendamment, possède son propre numéro de processus et son propre bloc de contrôle de processus et n'interfère pas les uns avec les autres. La technologie multi-processus est largement utilisée dans les logiciels serveurs, les systèmes d’exploitation et d’autres domaines.

2. Multi-processus en PHP

  1. Méthodes pour implémenter le multi-processus

Pour implémenter le multi-processus en PHP, vous pouvez utiliser l'extension pcntl ou l'extension posix. Les deux extensions fournissent des fonctions telles que la création de processus, la communication inter-processus, la gestion des signaux, etc.

L'extension pcntl est la bibliothèque de fonctions de contrôle de processus de PHP, qui fournit de nombreuses fonctions pour créer, exploiter et gérer des processus. L'utilisation de la bibliothèque de fonctions pcntl pour implémenter plusieurs processus peut facilement contrôler la relation parent-enfant, la transmission du signal, le partage des ressources, etc. L'extension

posix fournit également un contrôle de processus, un traitement du signal et d'autres fonctions, qui complètent l'extension pcntl. Il fournit également davantage de fonctions système, telles que les opérations sur les fichiers, la requête d'informations système, etc.

  1. Création d'un processus enfant

Créez un processus enfant en PHP en utilisant la fonction pcntl_fork(). La valeur de retour de la fonction fork() est différente, ce qui permet de distinguer le processus parent et le processus enfant, réalisant ainsi la distinction entre les processus parent et enfant.

$pid = pcntl_fork();   // 创建子进程
if ($pid == -1) {
    die('fork failed');
} elseif ($pid == 0) { // 子进程
    // 子进程代码
} else {                // 父进程
    // 父进程代码
}

Après l'appel de la fonction fork(), le système d'exploitation créera un nouveau processus enfant. À ce moment, le processus principal peut continuer à s'exécuter et le processus enfant commencera à s'exécuter après la fonction fork(). Le pid du processus enfant est 0 et le pid du processus parent est la valeur pid du processus enfant. Après avoir créé un sous-processus, nous pouvons effectuer certaines opérations fastidieuses dans le sous-processus ou effectuer certaines tâches en parallèle, améliorant ainsi les performances de concurrence de l'ensemble du système de traitement.

  1. Le statut de sortie du processus enfant

Une fois l'exécution du processus enfant terminée, nous devons obtenir son statut de sortie. Dans la fonction pcntl_waitpid(), le premier paramètre est le numéro du processus en attente de la fin du processus enfant et le deuxième paramètre est l'emplacement où l'état de sortie du processus enfant est stocké. Lorsque la valeur de retour est positive, cela signifie que le processus fils est terminé, sinon cela signifie qu'il a été interrompu par un signal en attente.

$pid = pcntl_fork();
if ($pid == -1) {
    die('fork failed');
} elseif ($pid == 0) {
    // 子进程
    exit(0); // 子进程退出状态为0
} else {
    // 父进程
    pcntl_waitpid($pid, $status); // 等待子进程退出
    echo $status;   // 输出子进程退出状态
}

3. Cas pratique

Ce qui suit est un cas pratique simple pour illustrer comment utiliser la technologie multi-processus en PHP.

Implémentez un script pour obtenir le contenu de plusieurs URL, obtenez le contenu de l'URL simultanément en créant plusieurs sous-processus et enregistrez leur contenu dans la base de données après une acquisition réussie.

<?php
// 需要获取的URL列表
$urlList = [
    'https://www.baidu.com/',
    'https://www.qq.com/',
    'https://www.sina.com.cn/',
    'https://www.163.com/',
    'https://www.taobao.com/'
];

// 创建多个子进程并行获取URL内容
foreach ($urlList as $url) {
    $pid = pcntl_fork();
    if ($pid == -1) {
        die('fork failed');
    } elseif ($pid == 0) {
        // 子进程
        $content = file_get_contents($url); // 获取URL内容
        // 保存内容到数据库
        $pdo = new PDO('mysql:host=localhost;dbname=test', 'root', '');
        $stmt = $pdo->prepare("INSERT INTO url_content(url, content) VALUES(?, ?)");
        $stmt->execute([$url, $content]);
        exit(0);
    }
}

// 等待所有子进程执行完毕
while (pcntl_waitpid(0, $status) != -1) {
    // do nothing
}
echo 'All child processes have terminated' . PHP_EOL;

Dans le code ci-dessus, nous parcourons $urllist via foreach et créons plusieurs sous-processus pour obtenir le contenu de l'URL en parallèle. Après avoir obtenu le contenu de l'URL via la fonction file_get_contents(), nous enregistrons le contenu dans la base de données. Dans le processus parent, attendez que le processus enfant termine son exécution via les fonctions while et pcntl_waitpid().

4. Remarques

Lors de l'utilisation de la technologie multi-processus, vous devez faire attention aux points suivants :

  1. Le processus enfant doit se terminer avant la fin du processus parent, sinon un processus zombie sera généré.
  2. Le processus enfant ne fera une copie que lorsque le processus parent est créé. Le contenu modifié par le processus enfant n'affectera pas le processus parent, et le contenu modifié par le processus parent n'affectera pas le processus enfant.
  3. Lorsque le processus enfant est créé, toutes les variables et descripteurs de fichiers du processus parent seront copiés, mais les flux ouverts par le processus parent ne seront pas copiés.
  4. Lorsque vous utilisez une technologie multi-processus, vous devez prendre en compte l'utilisation des ressources système pour éviter une consommation excessive de ressources système.

5. Résumé

L'application de la technologie multi-processus en PHP peut améliorer efficacement la capacité du programme à gérer les requêtes simultanées. Grâce à la technologie multi-processus, plusieurs tâches peuvent être traitées en parallèle, améliorant ainsi la vitesse de réponse et la simultanéité du système. Dans le but d'assurer la qualité des programmes, la technologie multi-processus nous offre une solution efficace et simple.

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