Maison  >  Article  >  développement back-end  >  Comment implémenter l'appel asynchrone de multi-threads en PHP

Comment implémenter l'appel asynchrone de multi-threads en PHP

黄舟
黄舟original
2017-11-11 13:49:075464parcourir

Dans l'article précédent, nous vous avons présenté la méthode d'implémentation du multi-threading PHP, nous allons donc aujourd'hui vous présenter en détail la méthode de PHP pour implémenter le multi-threading asynchrone. J'espère qu'à travers cet article, vous pourrez. avancez davantage votre compréhension du multi-threading PHP !

Par exemple, il existe désormais un scénario dans lequel un e-mail de recommandation est envoyé à 1 000 utilisateurs. L'utilisateur saisit ou importe le compte de messagerie et le soumet au serveur pour envoi

. La première solution :

<?php
$count=count($emailarr);
for($i=0;$i<$count;$i )
{
sendmail(.....);//发送邮件
}
?>

Ce code a une très mauvaise expérience utilisateur et ne peut pas être utilisé en pratique. Tout d'abord, l'envoi d'autant d'e-mails entraînera des heures supplémentaires du serveur. le long temps d'attente des utilisateurs fera douter les utilisateurs et perdra confiance dans le produit du système. Cependant, l'utilisateur n'a pas besoin d'attendre que les 1 000 e-mails aient été envoyés avant de soumettre le message avec succès. Nous pouvons directement inviter l'utilisateur à l'envoyer avec succès après l'avoir soumis en arrière-plan, puis laisser le programme en arrière-plan l'envoyer silencieusement un par un. un.

La deuxième solution :


Nous essayons d'utiliser la technologie "d'exécution asynchrone" pour exécuter le code. Les caractéristiques de l'exécution asynchrone. sont une exécution silencieuse en arrière-plan, les utilisateurs n'ont pas besoin d'attendre les résultats de l'exécution du code, les avantages de l'exécution asynchrone :

1 Débarrassez-vous de la dépendance de l'application à une seule tâche

<.>2. Améliorer l'efficacité d'exécution du programme

3. Amélioration de l'évolutivité du programme

4. Expérience utilisateur améliorée dans certains scénarios

5. -threading, il existe de nombreuses requêtes utilisant des appels asynchrones. La méthode HTTP obtient l'effet d'exécution parallèle du programme, mais veuillez noter que si trop de requêtes HTTP sont effectuées, la surcharge du système sera considérablement augmentée

Expérience utilisateur : L'utilisateur attend ->L'envoi est terminé

Ensuite La tâche d'envoi des lettres est transférée à un programme PHP qui gère l'envoi des lettres séparément. Lorsque l'utilisateur voit "Envoyé terminé", la lettre n'a pas encore été envoyée. temps, le programme d'envoi travaille dur en arrière-plan, envoyant chaque lettre une par une. Scellez et envoyez

<?php 
$domain="www.***.com"; 
$url="/system_mail.php"; 
$par="email=".implode(&#39;,&#39;,$emailarr)."&........"; 
$header = "POST $url HTTP/1.0rn"; 
$header .= "Content-Type: application/x-www-form-urlencodedrn"; 
$header .= "Content-Length: " . strlen($par) . "rnrn"; 
$fp = @fsockopen ($domain, 80, $errno, $errstr, 30); 
fputs ($fp, $header . $par); 
fclose($fp);
echo &#39;&#39;发送完毕&#39;; 
?> 
system_mail.php 
<?php 
ini_set("ignore_user_abort",true); 
ignore_user_abort(true);//此处的代码需要php.ini开启相关的选项,保证php执行不超时的,不明白,参考我的另一篇文章 “关闭浏览器后,php脚本会不会继续运行” 
//获取email地址,发信,此处为发信代码 
?>

La troisième méthode :

1. Le moyen le plus simple est d'intégrer AJAX dans le code HTML renvoyé à l'appel client, ou d'intégrer une

balise img avec src pointant vers le script fastidieux à exécuter. Cette méthode est la plus simple et la plus rapide. Le serveur n'a pas besoin de passer d'appels.
Mais l'inconvénient est que d'une manière générale, Ajax devrait être déclenché après onLoad. C'est-à-dire que si l'utilisateur clique sur la page puis la ferme, notre script en arrière-plan ne sera pas déclenché.
Si vous utilisez la balise img, cette méthode ne peut pas être qualifiée d'exécution asynchrone au sens strict. Le navigateur de l'utilisateur attendra longtemps que l'exécution du script php soit terminée, c'est-à-dire que la colonne
Statut du navigateur de l'utilisateur indique toujours qu'il est toujours en cours de chargement. Bien entendu, d'autres méthodes avec des principes similaires peuvent également être utilisées, comme les balises de script, etc.

Quatrième méthode :


popen()

resource popen ( string command, string mode );
//Ouvrir un processus de pointage Le tuyau du processus engendré par l'exécution de la commande donnée. Ouvre un canal vers le processus généré par l'exécution de la commande qui a généré la commande donnée.


Vous pouvez donc l'appeler mais ignorer sa sortie.

pclose(popen("/home/xinchen/backend.php &", &#39;r&#39;));
Cette méthode évite les défauts de la première méthode et est également rapide. Mais le problème est que cette méthode ne peut pas demander un autre WebService via le protocole HTTP et ne peut exécuter que des fichiers de script locaux. Et il ne peut être ouvert que dans un seul sens et ne peut pas transmettre un grand nombre de paramètres au script appelé.

Et si le nombre de visites est élevé, un grand nombre de processus seront générés. Si vous faites appel à des ressources externes, vous devez réfléchir vous-même à la concurrence.

La cinquième méthode :

Utilisez CURL

Cette méthode, définissez CUROPT_TIMEOUT sur 1 (le minimum est 1, déprimant). Autrement dit, le client doit attendre au moins 1 seconde.

$ch = curl_init();
$curl_opt = array(CURLOPT_URL, &#39;http://www.example.com/backend.php&#39;,
                            CURLOPT_RETURNTRANSFER, 1,
                            CURLOPT_TIMEOUT, 1,);
curl_setopt_array($ch, $curl_opt);
curl_exec($ch);
curl_close($ch);

La sixième méthode :

Utilisez fsockopen

Cette méthode devrait être la plus parfaite, mais l'inconvénient est que vous devez épeler HTTP vous-même partie d'en-tête.

$fp = fsockopen("www.example.com", 80, $errno, $errstr, 30);
if (!$fp) {
    echo "$errstr ($errno)<br />n";
} else {
    $out = "GET /backend.php / HTTP/1.1rn";
    $out .= "Host: www.example.comrn";
    $out .= "Connection: Closernrn";
    fwrite($fp, $out);
    /*忽略执行结果
while (!feof($fp)) {
echo fgets($fp, 128);
}*/
    fclose($fp);
}

Résumé :

Les six méthodes ci-dessus sont des exemples de multi-threading d'appels asynchrones en php, chaque méthode a ses fonctionnalités, vous pouvez choisir la méthode qui vous convient selon vos besoins !

Recommandations associées ;

Introduction à trois méthodes d'implémentation de simulation multi-thread php


Un exemple d'implémentation du multi-threading php


Une méthode d'implémentation du multi-threading php - shell


Petit boîtier PHP multi-thread

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