Maison >développement back-end >tutoriel php >8 méthodes d'implémentation PHP non bloquantes pour répondre rapidement aux requêtes de pages

8 méthodes d'implémentation PHP non bloquantes pour répondre rapidement aux requêtes de pages

PHPz
PHPzoriginal
2018-07-19 23:51:245352parcourir

Mode non bloquant du programme, qui peut également être compris comme simultanéité afin d'empêcher PHP de se bloquer, lorsque PHP doit effectuer un traitement à long terme en tant que traitement back-end, afin de répondre rapidement aux demandes de page. sans porter de jugement sur le résultat retourné, vous pouvez avoir Les mesures suivantes :

8 méthodes dimplémentation PHP non bloquantes pour répondre rapidement aux requêtes de pages

Méthode d'implémentation PHP non bloquante spécifique :

1 Utilisez fastcgi_finish_request()

Si PHP et le serveur Web utilisent PHP-FPM (FastCGI Process Manager), la session peut être terminée immédiatement via la fonction fastcgi_finish_request(), et le PHP le thread peut continuer à s’exécuter en arrière-plan.

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 montrent les résultats de sortie, une fois la page imprimée, le démarrage du programme..., la session revient après avoir sorti la première ligne dans log.txt, donc le débogage suivant... ne sera pas parcouru. Il est affiché sur le serveur et le fichier log.txt peut recevoir entièrement les trois temps d'achèvement.

2 Utilisez fsockopen()

Utilisez fsockopen() pour ouvrir une connexion réseau ou une connexion socket Unix, puis utilisez stream_set_blocking() pour une demande de mode non bloquant :

$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);

3 Utilisez cURL

Utilisez les fonctions curl_multi_* dans cURL pour envoyer des requêtes asynchrones

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

4 Utilisez Gearman /Swoole Extensions

Gearman est un framework de traitement asynchrone distribué avec des extensions PHP qui peuvent gérer de gros lots de tâches asynchrones.

Swoole a été très populaire récemment. Il propose de nombreuses méthodes asynchrones et est facile à utiliser.

5 Utilisez des caches et des files d'attente

Utilisez Redis et d'autres caches et files d'attente pour écrire des données dans le cache, et utilisez des tâches planifiées en arrière-plan pour réaliser un traitement asynchrone des données.

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

6 Appeler des commandes système

Dans des cas extrêmes, vous pouvez appeler des commandes système , les données peuvent être transmises 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`

7 Utilisez pcntl_fork()

pour installer l'extension pcntl et utilisez pcntl_fork() pour générer un processus enfant pour exécuter des tâches de manière asynchrone. c'est le plus pratique, mais c'est aussi le cas où les processus zombies sont susceptibles d'apparaître.

$pid = pcntl_fork()
if ($pid == 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);
}

Support natif 8 PHP

Le coup ultime de Gringo, je ne le comprends pas

http://nikic.github.io / 2012/12/22/Coopératif-multitâche-utilisant-coroutines-in-PHP.html


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