Im vorherigen Artikel haben wir Ihnen die Implementierungsmethode von PHP-Multithreading vorgestellt. Heute werden wir Ihnen die Methode von PHP zur Implementierung von asynchronem Multithreading ausführlich vorstellen Verbessern Sie Ihr Verständnis von PHP-Multithreading weiter!
Zum Beispiel gibt es jetzt ein Szenario, in dem eine Empfehlungs-E-Mail an 1.000 Benutzer gesendet wird. Der Benutzer gibt das E-Mail-Konto ein oder importiert es und übermittelt es zum Senden an den Server Die erste Lösung:
Dieser Code hat eine sehr schlechte Benutzererfahrung und kann in der Praxis nicht verwendet werden. Erstens führt das Senden so vieler E-Mails dazu, dass der Server Überstunden macht. Die lange Wartezeit des Benutzers führt dazu, dass Benutzer zweifeln und das Vertrauen in das Systemprodukt verlieren. Der Benutzer muss jedoch nicht warten, bis alle 1.000 E-Mails gesendet wurden, bevor er die Nachricht erfolgreich sendet. Wir können den Benutzer direkt auffordern, die Nachricht erfolgreich zu senden, nachdem sie im Hintergrund gesendet wurde, und das Hintergrundprogramm dann einzeln senden lassen eins.
<?php $count=count($emailarr); for($i=0;$i<$count;$i ) { sendmail(.....);//发送邮件 } ?>
Die zweite Lösung:
Wir versuchen, die Technologie der „asynchronen Ausführung“ zu verwenden, um den Code auszuführen Durch die stille Ausführung im Hintergrund müssen Benutzer nicht auf die Ausführungsergebnisse des Codes warten. Die Vorteile der Verwendung der asynchronen Ausführung:
Dann wird der Briefversand an ein PHP-Programm übergeben, das den Briefversand separat abwickelt. Wenn der Benutzer „Gesendet abgeschlossen“ sieht, wurde der Brief zu diesem Zeitpunkt noch nicht gesendet Das Sendeprogramm arbeitet hart im Hintergrund und sendet jeden Brief einzeln.
Die dritte Methode:
<?php $domain="www.***.com"; $url="/system_mail.php"; $par="email=".implode(',',$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 ''发送完毕'; ?> system_mail.php <?php ini_set("ignore_user_abort",true); ignore_user_abort(true);//此处的代码需要php.ini开启相关的选项,保证php执行不超时的,不明白,参考我的另一篇文章 “关闭浏览器后,php脚本会不会继续运行” //获取email地址,发信,此处为发信代码 ?>
img-Tag einzubetten, wobei src auf das auszuführende zeitaufwändige Skript verweist. Diese Methode ist die einfachste und schnellste. Der Server muss keine Anrufe tätigen.
Aber der Nachteil ist, dass Ajax im Allgemeinen nach onLoad ausgelöst werden sollte. Das heißt, wenn der Benutzer auf die Seite klickt und sie dann schließt, wird unser Hintergrundskript nicht ausgelöst.Wenn Sie das img-Tag verwenden, kann diese Methode nicht als asynchrone Ausführung im engeren Sinne bezeichnet werden. Der Browser des Benutzers wartet lange auf den Abschluss der Ausführung des PHP-Skripts, d. h. in der Spalte Status des Browsers des Benutzers wird immer angezeigt, dass es noch geladen wird.
Natürlich können auch andere Methoden mit ähnlichen Prinzipien verwendet werden, wie z. B. Script-Tags usw.
Vierte Methode:
popen()
//Öffnen Sie einen Zeigeprozess Das Rohr des Prozesses, der durch die Ausführung des angegebenen Befehlsbefehls erzeugt wird. Öffnet eine Pipe zu dem Prozess, der durch die Verzweigung der Ausführung des angegebenen Befehls entsteht.
resource popen ( string command, string mode );
Diese Methode vermeidet die Mängel der ersten Methode und ist außerdem schnell. Das Problem besteht jedoch darin, dass diese Methode keinen anderen WebService über das HTTP-Protokoll anfordern und nur lokale Skriptdateien ausführen kann. Und es kann nur in eine Richtung geöffnet werden und kann nicht viele Parameter an das aufgerufene Skript übergeben.
pclose(popen("/home/xinchen/backend.php &", 'r'));
Die fünfte Methode:
CURL verwenden Diese Methode setzt CUROPT_TIMEOUT auf 1 (das Minimum ist 1, drückend). Das heißt, der Client muss mindestens 1 Sekunde warten.
Sechste Methode:
$ch = curl_init(); $curl_opt = array(CURLOPT_URL, 'http://www.example.com/backend.php', CURLOPT_RETURNTRANSFER, 1, CURLOPT_TIMEOUT, 1,); curl_setopt_array($ch, $curl_opt); curl_exec($ch); curl_close($ch);
Diese Methode sollte die perfekteste sein, aber der Nachteil ist, dass Sie den HTTP-Header selbst buchstabieren müssen Teil.
Zusammenfassung:
$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); }
Die oben genannten sechs Methoden sind Beispiele für asynchrones Aufruf-Multithreading in PHP. Jede Methode verfügt über folgende Funktionen: Sie können je nach Bedarf die Methode wählen, die zu Ihnen passt!
Verwandte Empfehlungen;Einführung in drei Methoden der PHP-Multithread-Simulationsimplementierung
Das obige ist der detaillierte Inhalt vonSo implementieren Sie den asynchronen Aufruf von Multithreads in PHP. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!