Maison > développement back-end > tutoriel php > Comment utiliser la fonction de contrôle de processus de PHP ?

Comment utiliser la fonction de contrôle de processus de PHP ?

王林
Libérer: 2023-06-04 08:34:01
original
1023 Les gens l'ont consulté

PHP est un langage de programmation très populaire qui peut être exécuté côté serveur. Lors de l'exécution de scripts PHP côté serveur, nous avons souvent besoin de contrôler le déroulement du processus afin de coordonner l'exécution des différentes tâches et d'assurer la fiabilité du programme. PHP fournit un ensemble de fonctions de contrôle de processus simples et faciles à utiliser qui peuvent nous aider à atteindre ces objectifs. Dans cet article, nous présenterons les principes de base, l'utilisation et les précautions du contrôle de processus PHP.

1. Concepts de base du contrôle de processus PHP

Le contrôle de processus PHP comprend principalement des fonctions telles que la création, la terminaison, l'attente et la capture de signaux. Parmi elles, la création de processus est la fonction la plus élémentaire. Elle peut créer un nouveau sous-processus dans le contexte du processus en cours afin que les tâches ultérieures puissent être exécutées dans le sous-processus pour réaliser un traitement simultané. La fonction de terminaison de processus nous permet de mettre fin activement à l'exécution du processus enfant une fois l'exécution du programme terminée. La fonction d'attente de processus permet au processus parent d'attendre la fin du processus enfant et d'obtenir la valeur de retour du processus enfant pour un traitement ultérieur en fonction des résultats d'exécution du processus enfant. La fonction de capture de signal nous permet de contrôler le comportement du programme en envoyant des signaux, tels que l'interruption du processus enfant en cours d'exécution ou la fin forcée de l'exécution du programme.

2. Comment utiliser le contrôle de processus PHP

  1. Création de processus

PHP fournit la fonction pcntl_fork pour réaliser la fonction de création de processus. Cette fonction créera un nouveau processus enfant et renverra une valeur entière utilisée pour faire la distinction entre le processus parent et le processus enfant. Dans le processus enfant, la valeur de retour de cette fonction est 0 ; dans le processus parent, cette fonction renvoie l'ID de processus du nouveau processus. Voici un exemple de code de création de processus :

$pid = pcntl_fork();
if ($pid == -1) {
  // 进程创建失败
  exit(1);
} else if ($pid) {
  // 父进程
  echo "父进程,子进程ID:$pid
";
} else {
  // 子进程
  echo "子进程,ID:" . getmypid() . "
";
}
Copier après la connexion

Dans cet exemple, nous créons un nouveau processus enfant via la fonction pcntl_fork et produisons différentes informations dans le processus parent et le processus enfant. Il convient de noter que lorsque la fonction pcntl_fork est appelée, le processus parent et le processus enfant copient une copie de l'environnement d'exécution du programme, y compris les variables, les descripteurs de fichiers, l'état d'exécution et d'autres informations. Étant donné que le processus enfant hérite de ces informations du processus parent, nous devons être très prudents pour éviter les erreurs inattendues.

  1. Terminaison du processus

PHP fournit la fonction pcntl_exit pour terminer le processus. Cette fonction nous permet de mettre fin activement à l'exécution du processus enfant après l'exécution du programme. Vous pouvez transmettre une valeur entière comme valeur de retour pour transmettre le résultat de l'exécution du processus enfant au processus parent. Voici un exemple de code de fin de processus :

$pid = pcntl_fork();
if ($pid == -1) {
  // 进程创建失败
  exit(1);
} else if ($pid) {
  // 父进程
  pcntl_wait($status); // 等待子进程执行完毕
  echo "子进程执行完成,返回值:".$status."
";
} else {
  // 子进程
  echo "子进程执行中...
";
  pcntl_exit(123); // 终止子进程,并返回123
}
Copier après la connexion

Dans cet exemple, nous terminons l'exécution du processus enfant via la fonction pcntl_exit et transmettons la valeur de retour 123. Le processus parent appelle la fonction pcntl_wait pour attendre la fin du processus enfant et utilise la variable $status pour recevoir la valeur de retour du processus enfant. Il convient de noter que la fonction pcntl_exit ne peut être utilisée que pour terminer le processus en cours et ne peut pas terminer les autres processus.

  1. Process wait

PHP fournit la fonction pcntl_wait pour attendre la fin du processus enfant et obtenir la valeur de retour du processus enfant. Cette fonction peut être appelée dans le processus parent pour obtenir le résultat de l'exécution du processus enfant une fois l'exécution du processus enfant terminée. Voici un exemple de code de processus en attente :

$pid = pcntl_fork();
if ($pid == -1) {
  // 进程创建失败
  exit(1);
} else if ($pid) {
  // 父进程
  pcntl_wait($status); // 等待子进程执行完毕
  echo "子进程执行完成,返回值:".$status."
";
} else {
  // 子进程
  echo "子进程执行中...
";
  sleep(3); // 模拟子进程执行
  pcntl_exit(123); // 终止子进程,并返回123
}
Copier après la connexion

Dans cet exemple, nous attendons la fin du processus enfant via la fonction pcntl_wait et utilisons la variable $status pour recevoir la valeur de retour du processus enfant. Il convient de noter que si plusieurs processus enfants dans le processus parent doivent attendre, vous pouvez utiliser la fonction pcntl_waitpid pour attendre spécifiquement un processus enfant spécifié.

  1. Signal Capture

PHP fournit la fonction pcntl_signal pour implémenter la fonction de capture de signal. Cette fonction nous permet de spécifier un signal et de lier la fonction de traitement du signal pour traiter le signal. Voici un exemple de code de capture de signal :

function signal_handler($signal)
{
  echo "接收到信号:".$signal."
";
}

pcntl_signal(SIGINT, "signal_handler"); // 捕捉Ctrl+C信号

while (true) {
  // 循环执行
  sleep(1);
}
Copier après la connexion

Dans cet exemple, nous capturons le signal Ctrl+C via la fonction pcntl_signal et lions une fonction de traitement signal_handler. Lorsque l'utilisateur appuie sur la touche Ctrl+C, le programme recevra ce signal et exécutera le code dans la fonction signal_handler. Il est à noter que dans la fonction de traitement du signal, on ne peut pas appeler directement la fonction pcntl_exit, car cela pourrait provoquer une interruption du processus lors de l'exécution, entraînant des erreurs imprévisibles. Si vous souhaitez terminer le processus, vous devez utiliser la fonction posix_kill pour envoyer un signal de fin au processus et le terminer par le processus lui-même.

3. Précautions

Lors de l'utilisation de la fonction de contrôle de processus PHP, vous devez faire attention aux points suivants :

  1. La création et la terminaison de processus occuperont des ressources système. Si cela n'est pas nécessaire, vous devez essayer d'éviter les opérations de création et de terminaison excessives. .
  2. Le processus enfant doit hériter des descripteurs de fichiers et des variables du processus parent, de sorte que l'état de ces ressources doit être géré avec soin lors de l'exécution du programme.
  3. Lorsque vous attendez un processus enfant dans le processus parent, vous devez attendre tous les processus enfants possibles pour éviter les processus zombies.
  4. Dans la fonction de traitement du signal du processus, vous devez éviter d'appeler directement la fonction pcntl_exit, vous devez plutôt utiliser la fonction posix_kill pour envoyer un signal de fin au processus et le terminer par le processus lui-même.

Pour résumer, le contrôle de processus PHP est une fonction très puissante. Grâce au contrôle des processus, nous pouvons facilement mettre en œuvre un traitement simultané, une communication inter-processus, une gestion des exceptions et d'autres fonctions, nous aidant ainsi à créer des programmes plus fiables. Cependant, lorsque vous utilisez le contrôle de processus, vous devez faire attention à éviter les erreurs imprévisibles.

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!

Étiquettes associées:
source:php.cn
Déclaration de ce site Web
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
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal