Maison >développement back-end >tutoriel php >Comment implémenter la programmation multi-processus en PHP

Comment implémenter la programmation multi-processus en PHP

墨辰丷
墨辰丷original
2018-05-19 10:56:481517parcourir

Cet article présente principalement la méthode de programmation multi-processus PHP et analyse plus en détail les concepts, l'utilisation, les fonctions associées et les techniques d'utilisation de la programmation multi-processus PHP. Les amis dans le besoin peuvent se référer à

<.> Première étape :

commande $ php -m pour vérifier si php a installé les extensions pcntl et posix. Sinon, installez

Scénario d'utilisation : <.>1. De nombreuses opérations réseau fastidieuses doivent être effectuées

2. De nombreux calculs doivent être effectués et le système dispose de plusieurs processeurs afin de permettre aux utilisateurs de fonctionner plus rapidement. expérience, une tâche est divisée en plusieurs Une petite tâche, finalement fusionnée.


Fonctions communes pour plusieurs processus :

pcntl_alarm

— Définir un signal de réveil pour le processus pcntl_errno
— Alias ​​pcntl_strerrorpcntl_exec
—Exécuter le programme spécifié dans l'espace de processus actuel pcntl_fork
—Créer un processus enfant et générer une branche (processus enfant) à la position actuelle du processus actuel. Annotation : fork crée un processus enfant.Le processus parent et le processus enfant continuent de s'exécuter à partir de la position fork. La différence est que pendant l'exécution du processus parent, la valeur de retour de fork est le numéro du processus enfant, tandis que l'enfant. le processus obtient 0. pcntl_get_last_error
— Récupère le numéro d'erreur défini par la dernière fonction pcntl qui a échouépcntl_getpriority
— Récupère la priorité de n'importe quel processuspcntl_setpriority
— Modifier la priorité de n'importe quel processus pcntl_signal_dispatch
— Appeler un gestionnaire en attente d'un signal pcntl_signal
— Installer un gestionnaire de signal pcntl_sigprocmask
— Définir ou récupérer le signal de blocage pcntl_sigtimedwait
— Attente du signal avec mécanisme de délai d'attente pcntl_sigwaitinfo
— Attendre le signal pcntl_strerror
— Récupérer le système message d'erreur associé au errno donnépcntl_wait
— Attend ou renvoie l'état du processus enfant de fork pcntl_waitpid
— Attend ou renvoie l'état du processus enfant de fork pcntl_wexitstatus
— Renvoie le code retour d'un processus enfant interrompu pcntl_wifexited
— Vérifie si le code d'état représente une sortie normale. pcntl_wifsignaled
— Vérifiez si le code d'état du processus enfant signifie qu'il a été interrompu en raison d'un signal pcntl_wifstopped
— Vérifiez si le processus enfant est actuellement arrêté pcntl_wstopsig
— Renvoie le signal qui provoque l'arrêt du processus enfant pcntl_wtermsig
— Renvoie le signal qui provoque l'interruption du processus enfant

Exemple 1 :

<?php
//最早的进程,也是父进程
$parentPid = getmypid();
echo &#39;原始父进程:&#39; . $parentPid . PHP_EOL;
//创建子进程,返回子进程id
$pid = pcntl_fork();
if( $pid == -1 ){
  exit("fork error");
}
//pcntl_fork 后,父进程返回子进程id,子进程返回0
echo &#39;ID : &#39; . $pid . PHP_EOL;
if( $pid == 0 ){
  //子进程执行pcntl_fork的时候,pid总是0,并且不会再fork出新的进程
  $mypid = getmypid(); // 用getmypid()函数获取当前进程的PID
  echo &#39;I am child process. My PID is &#39; . $mypid . &#39; and my fathers PID is &#39; . $parentPid . PHP_EOL;
} else {
  //父进程fork之后,返回的就是子进程的pid号,pid不为0
  echo &#39;Oh my god! I am a father now! My childs PID is &#39; . $pid . &#39; and mine is &#39; . $parentPid . PHP_EOL;
}
$aa = shell_exec("ps -af | grep index.php");
echo $aa;

Exemple 2 :

Ouvrir plusieurs processus enfants pour éviter l'inondation de forks

<?php
//最早的进程,也是父进程
$parentPid = getmypid();
echo &#39;原始父进程:&#39; . $parentPid . PHP_EOL;
//开启十个子进程
for($i = 0; $i < 10; $i++) {
  $pid = pcntl_fork();
  if($pid == -1) {
    echo "Could not fork!\n";
    exit(1);
  }
  //子进程
  if(!$pid) {
    //child process workspace
    echo &#39;子进程:&#39; . getmypid() . PHP_EOL;
    exit(); //子进程逻辑执行完后,马上退出,以免往下走再fork子进程,不好控制  
  } else {
    echo &#39;父进程:&#39; . getmypid() . PHP_EOL;
  }
}
echo getmypid() . PHP_EOL;
$aa = shell_exec("ps -af | grep index.php");
echo $aa;

Remarque :

Utilisez la fonction multi-processus via la série de fonctions pcntl_XXX. Remarque : pcntl_XXX ne peut s'exécuter que dans l'environnement php CLI (ligne de commande). Dans l'environnement du serveur Web, des résultats imprévisibles se produiront, veuillez l'utiliser avec prudence !

Recommandations associées :

Implémentation PHP basée sur une solution de verrouillage de fichiers

Processus multiplesLire et écrire un fichier en même temps

Php

Multi-processusImplémenter des exemples de programmation

Implémentation PHP

Multi-processus et multithread

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