Comment implémenter le traitement asynchrone en php

小云云
Libérer: 2023-03-21 20:18:01
original
2321 Les gens l'ont consulté

Dans les environnements de production réels, il est très courant que PHP soit utilisé comme serveur d'interface backend. Bien entendu, PHP présente les avantages d'être un serveur backend. Cependant, il apparaît lors du traitement de certains résultats que le client ne fait pas. L'inconvénient est qu'il n'y a pas de mécanisme d'exécution asynchrone. Par exemple, lorsque nous souhaitons enregistrer les performances de l'accès d'un certain client à PHP (y compris l'heure de début, l'heure de fin, l'état du résultat, etc.), le client souhaite bien sûr que le traitement de PHP puisse répondre dans les plus brefs délais. pour obtenir les résultats, et si vous installez une solution conventionnelle, le client devra attendre que PHP termine l'enregistrement des performances avant d'obtenir les résultats. Cela équivaut à aller à la banque pour vérifier votre solde actuel, et le caissier accourut et discute avec d'autres personnes pendant un moment, mais le résultat est le même lorsqu'il vient vous le dire.

Ainsi, plusieurs fois, un PHP capable d'effectuer des opérations asynchrones est nécessaire.

Alors, comment pouvons-nous parvenir à une mise en œuvre asynchrone ?

Une solution consiste à utiliser les appels système PHP pour démarrer un nouveau processus afin d'y parvenir.

php fournit la fonction fsockopen. La fonction de cette fonction est d'initialiser une connexion socket à l'hôte spécifié. Par défaut, la connexion socket sera ouverte en mode blocage. Bien sûr, vous pouvez le convertir en mode non bloquant via stream_set_blocking(). C'est la clé. Par conséquent, l'idée est la suivante : ouvrez un socket non bloquant pour vous connecter à la machine locale, et la machine locale effectuera un traitement fastidieux après l'avoir reçu.

Un code de traitement similaire à celui-ci (fichier posttest.php) :

$fp = fsockopen($php_Path,80);
if (!$fp) {
    LMLog::error("fsockopen:err" );
} else {
    $out = "GET /album/action/album_write_friends_thread_record.php?key=&u=   HTTP/1.1\r\n";
    $out .= "Host: ".$php_Path."\r\n";
    $out .= "Connection: Close\r\n\r\n";
    stream_set_blocking($fp,true);
    stream_set_timeout($fp,1);
    fwrite($fp, $out);
    usleep(1000);
    fclose($fp);
}
Copier après la connexion

Ici, usleep(1000) est très critique, il peut garantir que cette demande peut être envoyée.

Nous examinons la logique du code de traitement (fichier album_write_friends_thread_record.php) :

<?php
/**
 * Created by PhpStorm.
 * User: Administrator
 * Date: 2016-09-23
 * Time: 09:26
 */
/**
 * 客户端调用服务器接口页面
 * user: guwen
 */
sleep(20);// 睡眠20s
?>实际上,我们服务器在执行fsockopen 那段程序时,就不会再等20s之后才能返回给客户端,而是发出这个请求之后,即返回客户端,销毁进程,
而把剩余的工作交由其他进程慢慢做去,这就实现了php的异步。
Copier après la connexion

Recommandations associées :

PHP asynchrone Plan de mise en œuvre du traitement

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