Maison  >  Article  >  développement back-end  >  Explication détaillée du mode non bloquant PHP

Explication détaillée du mode non bloquant PHP

*文
*文original
2017-12-29 18:03:361809parcourir

Le mode non bloquant fait référence au mécanisme de messagerie qui utilise les événements de socket. La communication entre le serveur et le client est dans un état asynchrone. Cet article présente le mode php non bloquant à tout le monde. J'espère que cela aide tout le monde.

Laissez PHP ne plus bloquer. Lorsque PHP doit effectuer un traitement à long terme en tant que processus back-end, afin de répondre rapidement aux demandes de pages sans porter de jugement sur le résultat renvoyé, les mesures suivantes peuvent être prises. être pris :

1. Si vous utilisez le mode FastCGI, l'utilisation de fastcgi_finish_request() peut mettre fin à la session immédiatement, mais le thread PHP continue de s'exécuter.


echo "program start.";
file_put_contents('log.txt','start-time:'.date('Y-m-d H:i:s'), FILE_APPEND);
fastcgi_finish_request();
sleep(1);
echo 'debug...';
file_put_contents('log.txt', 'start-proceed:'.date('Y-m-d H:i:s'), FILE_APPEND);
sleep(10);
file_put_contents('log.txt', 'end-time:'.date('Y-m-d H:i:s'), FILE_APPEND);

Comme le montre la sortie de cet exemple, la session revient après le démarrage du programme., donc le navigateur de sortie de débogage ne peut pas la recevoir. est arrivé et le fichier log.txt peut recevoir entièrement trois temps d'achèvement.

2. Utilisez le mode non bloquant de fsockopen et cUrl pour demander une autre URL


$fp = fsockopen("www.example.com", 80, $errno, $errstr, 30);
if (!$fp) die('error fsockopen');
stream_set_blocking($fp,0);
$http = "GET /save.php / HTTP/1.1\r\n"; 
$http .= "Host: www.example.com\r\n"; 
$http .= "Connection: Close\r\n\r\n";
fwrite($fp,$http);
fclose($fp);

Utilisez la fonction curl_multi_* dans cURL pour envoyer des requêtes asynchrones


$cmh = curl_multi_init();
$ch1 = curl_init();
curl_setopt($ch1, CURLOPT_URL, "http://localhost:6666/child.php");
curl_multi_add_handle($cmh, $ch1);
curl_multi_exec($cmh, $active);
echo "End\n";

Utilisez les extensions Gearman et Swoole.

Gearman est un framework de traitement asynchrone distribué avec des extensions PHP qui peut gérer de gros lots de tâches asynchrones
Swoole a été très populaire récemment et dispose de nombreuses méthodes asynchrones et est facile à utiliser ; . (Remarque Chenyuan : il prétend redéfinir PHP et pulvériser complètement NodeJS. Bien que l'outil Swoole soit bon, j'estime que l'extension elle-même n'est pas comparable à NodeJS)

4. Utilisez redis Attendez que le cache et la file d'attente écrivent des données dans le cache et utilisez des tâches planifiées en arrière-plan pour implémenter le traitement asynchrone des données.

Cette méthode devrait être très courante dans les architectures courantes à fort trafic

5. Dans les cas extrêmes, le système peut être appelé. La commande peut transmettre des données aux tâches en arrière-plan pour exécution, mais je pense personnellement que ce n'est pas très efficace.


$cmd = 'nohup php ./processd.php $someVar >/dev/null &';
`$cmd`

6. Le coup ultime du gringo, je ne le comprends pas, support php natif

http://nikic.github.io/2012/12/22/Cooperative-multitasking-using-coroutines-in-PHP.html

7. Installez l'extension pcntl et utilisez pcntl_fork pour générer un sous-processus pour exécuter des tâches de manière asynchrone. Personnellement, je pense que c'est le plus pratique, mais il est également sujet aux processus zombies. .


if (($pid = pcntl_fork()) == 0) {
child_func(); //子进程函数,主进程运行
} else {
father_func(); //主进程函数
}
echo "Process " . getmypid() . " get to the end.\n";
function father_func() {
echo "Father pid is " . getmypid() . "\n";
}
function child_func() {
sleep(6);
echo "Child process exit pid is " . getmypid() . "\n";
exit(0);
}

Recommandations associées :

php utilise swoole pour de vrai -mises à jour temporelles des données client

Utilisation de Swoole pour capturer de manière asynchrone des pages Web et un partage pratique

CGI de php, FastCGI, APACHE2HANDLER, explication détaillée du mode de fonctionnement CLI

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