So implementieren Sie asynchrone Aufrufmethoden in PHP

小云云
Freigeben: 2023-03-21 22:54:02
Original
8454 Leute haben es durchsucht

Die Verbindung und Kommunikation zwischen dem Browser und dem Server erfolgt über das HTTP-Protokoll. Dabei handelt es sich um ein Protokoll, das auf einem Anfrage- und Antwortmodell basiert. Der Browser initiiert über die URL eine Anfrage an den Server. Der Webserver empfängt die Anfrage, führt ein Programm aus und antwortet dann, indem er den entsprechenden HTML-Code an den Client sendet.

Es liegt ein Problem vor, wenn der Webserver ein Programm ausführt, das möglicherweise in wenigen Millisekunden oder auch nicht in mehreren Minuten abgeschlossen ist. Wenn das Programm langsam ausgeführt wird, hat der Benutzer möglicherweise nicht die Geduld, länger zu warten und den Browser zu schließen.

Manchmal kümmern wir uns nicht einmal um die Rückgabeergebnisse dieser zeitaufwändigen Skripte, sondern wir müssen warten, bis die Ausführung abgeschlossen ist und sie zurückkehren, bevor wir mit dem nächsten Schritt fortfahren können. Gibt es also eine Möglichkeit, den Aufruf dieser zeitaufwändigen Skripte einfach auszulösen und dann mit dem nächsten Schritt fortzufahren, sodass diese zeitaufwändigen Skripte serverseitig langsam ausgeführt werden können?

Nach dem Testen habe ich mehrere Methoden zusammengefasst und teile sie mit Ihnen: 1. Der einfachste Weg besteht darin, einen AJAX-Aufruf in den an den Client zurückgegebenen HTML-Code einzubetten oder ein img-Tag mit src einzubetten, das auf das auszuführende zeitaufwändige Skript verweist. Diese Methode ist die einfachste und schnellste. Der Server muss keine Anrufe tätigen. Der Nachteil besteht jedoch darin, 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. die Statusleiste des Browsers des Benutzers zeigt immer an, dass es noch geladen wird. Natürlich können auch andere Methoden mit ähnlichen Prinzipien verwendet werden, z. B. Skript-Tags usw.

2. popen()

Ressource popen (String-Befehl, String-Modus); //Öffnen Sie eine Pipe zu dem Prozess, der durch die Verzweigung der angegebenen Befehlsausführung erzeugt wurde. Öffnet eine Pipe zu dem Prozess, der durch die Ausführung des Befehls erzeugt wurde, der den angegebenen Befehl erzeugt hat.

Sie können es also aufrufen, aber seine Ausgabe ignorieren.

pclose(popen("/home/xinchen/backend.php &", 'r'));
Nach dem Login kopieren

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.
Und wenn die Anzahl der Besuche hoch ist, werden viele Prozesse generiert. Wenn Sie externe Ressourcen nutzen, müssen Sie selbst Rücksicht auf die Konkurrenz nehmen.

3. Verwenden Sie die CURL
-Methode und setzen Sie CUROPT_TIMEOUT auf 1 (das Minimum ist 1, deprimierend). Das heißt, der Client muss mindestens 1 Sekunde warten.

$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);
Nach dem Login kopieren

4. Verwendung von fsockopen
Diese Methode sollte die perfekteste sein, aber der Nachteil ist, dass Sie den HTTP-Header-Teil selbst buchstabieren müssen.

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

Im Großen und Ganzen ist also die erste Methode die beste und einfachste Methode.
Das Perfekteste sollte das Letzte sein, aber es ist komplizierter.

Verwandte Empfehlungen:

Analyse von Beispielen für asynchrone JavaScript-Aufrufe

So implementieren Sie asynchrone Multithread-Aufrufe in PHP

Über die asynchrone Aufrufmethode von JavaScript

Das obige ist der detaillierte Inhalt vonSo implementieren Sie asynchrone Aufrufmethoden in PHP. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Verwandte Etiketten:
Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage
Über uns Haftungsausschluss Sitemap
Chinesische PHP-Website:Online-PHP-Schulung für das Gemeinwohl,Helfen Sie PHP-Lernenden, sich schnell weiterzuentwickeln!