In tatsächlichen Produktionsumgebungen wird PHP häufig als Backend-Schnittstellenserver verwendet. Natürlich hat PHP die Vorteile, ein Backend-Server zu sein, zeigt sich jedoch bei der Verarbeitung einiger Ergebnisse, die der Client nicht hat Der Nachteil besteht darin, dass es keinen asynchronen Ausführungsmechanismus gibt. Wenn wir beispielsweise die Leistung des Zugriffs eines bestimmten Clients auf PHP aufzeichnen möchten (einschließlich Startzeit, Endzeit, Ergebnisstatus usw.), möchte der Client natürlich, dass die PHP-Verarbeitung so schnell wie möglich antworten kann. Um die Ergebnisse zu erhalten, und wenn Sie eine herkömmliche Lösung installieren, muss der Client warten, bis PHP die Leistungsaufzeichnung abgeschlossen hat, bevor er die Ergebnisse erhält. Es ist so, als würden Sie zur Bank gehen, um Ihren aktuellen Kontostand zu überprüfen, und der Kassierer kommt zu Ihnen und plaudert eine Weile mit anderen Leuten, aber das Ergebnis ist dasselbe, wenn er kommt, um es Ihnen zu sagen.
Daher benötigen Sie oft ein PHP, das asynchrone Vorgänge ausführen kann.
Wie können wir also eine asynchrone Implementierung erreichen?
Eine Lösung besteht darin, PHP-Systemaufrufe zu verwenden, um einen neuen Prozess zu starten.
php bietet die Funktion fsockopen. Die Funktion dieser Funktion besteht darin, eine Socket-Verbindung zum angegebenen Host zu initialisieren. Natürlich können Sie es über stream_set_blocking() in den nicht blockierenden Modus konvertieren. Das ist der Schlüssel. Daher besteht die Idee darin, einen nicht blockierenden Socket zu öffnen, um eine Verbindung zum lokalen Computer herzustellen, und der lokale Computer führt nach dem Empfang eine zeitaufwändige Verarbeitung durch.
Ein Verarbeitungscode ähnlich diesem (Datei 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); }
Hier ist usleep(1000) sehr wichtig, es kann sicherstellen, dass diese Anfrage gesendet werden kann.
Wir betrachten die Verarbeitungscodelogik (Datei 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的异步。
Verwandte Empfehlungen:
PHP asynchron Umsetzungsplan bearbeiten
Das obige ist der detaillierte Inhalt vonSo implementieren Sie die asynchrone Verarbeitung in PHP. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!