Heim  >  Artikel  >  Backend-Entwicklung  >  Implementierungsmethode für asynchrone PHP-Aufrufe

Implementierungsmethode für asynchrone PHP-Aufrufe

巴扎黑
巴扎黑Original
2016-11-23 13:17:191083Durchsuche

Für die Kommunikation zwischen dem Browser und dem Server gibt es nur ein verbindungsloses HTTP-Protokoll. Das Merkmal verbindungsloser Programme besteht darin, dass der Client den Server anfordert und der Server das entsprechende Programm entsprechend der Anforderung ausgibt und keine dauerhafte Verbindung aufrechterhalten kann .

Es kann vorkommen, dass der entsprechende Server eines Clients 1 Sekunde oder 1 Minute lang ausgeführt wird. Auf diese Weise befindet sich der Browser immer im Wartezustand Haben Sie die Geduld, den Browser zu schließen.

Manchmal müssen wir uns nicht um die Ergebnisse der Programmausführung kümmern. Es ist nicht nötig, so Zeit zu verschwenden und geduldig zu warten. Dann müssen wir einen Weg finden, das Programm im Hintergrund auszuführen ohne zu warten.

Zum Beispiel gibt es 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.

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

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 überlastet wird Eine lange Wartezeit für Benutzer führt dazu, dass Benutzer Probleme mit dem Produkt haben und ihr Vertrauen 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 an den Hintergrund gesendet wurde, und sie dann vom Hintergrundprogramm stillschweigend senden lassen eins.

Zu diesem Zeitpunkt benötigen wir die Technologie der „asynchronen Ausführung“, um den Code auszuführen. Das Merkmal der asynchronen Ausführung ist, dass der Benutzer nicht auf das Ausführungsergebnis des Codes warten muss der Verwendung der asynchronen Ausführung:

1. Beseitigen Sie die Abhängigkeit der Anwendung von einer einzelnen Aufgabe.

Verbessern Sie die Ausführungseffizienz des Programms.

3 das Programm

In bestimmten Szenarien verbesserte Benutzererfahrung

5 Da PHP kein Multithreading unterstützt, wird durch die Verwendung asynchroner Aufrufe zum Anfordern mehrerer HTTPs der Effekt einer parallelen Ausführung des Programms erzielt. Bitte beachten Sie jedoch, dass sich die Zeit erheblich erhöht, wenn zu viele HTTP-Anfragen angefordert werden

Übliche Methoden zur asynchronen Ausführung von PHP:

1 . Die Client-Seite verwendet AJAX-Technologie, um den Server anzufordern

1 Der einfachste Weg ist, AJAX-Aufrufe in den an den Client zurückgegebenen HTML-Code einzubetten oder ein img-Tag einzubetten, das auf die Zeit verweist. verbrauchendes Skript, das ausgeführt werden soll.
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. die Statusleiste des Browsers des Benutzers zeigt immer an, dass es noch geladen wird.
Natürlich können Sie auch andere Methoden mit ähnlichen Prinzipien verwenden, z. B. Skript-Tags usw.


2.popen()-Funktion

Ressource popen (String-Befehl, String-Modus);
//Öffnen Sie eine Pipe, die auf den Prozess zeigt, der aus der Ausführung des angegebenen Befehls resultiert. Öffnet eine Pipe zu dem Prozess, der durch die Verzweigung der Ausführung des angegebenen Befehls entsteht.

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

?

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

Diese Methode vermeidet die Mängel der ersten Methode und ist außerdem sehr 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.CURL-Erweiterung

CURL ist ein leistungsstarkes HTTP-Befehlszeilentool, das HTTP-Anfragen wie POST/GET simulieren und dann Daten abrufen und extrahieren kann . Wird auf „Standardausgabe“ (stdout) angezeigt. 9b21ee6b58e97765e2a3d44fcda3f6db http://www.example.com/backend.php',

CURLOPT_RETURNTRANSFER, 1,

CURLOPT_TIMEOUT, 1,);

curl_setopt_array($ch, $curl_opt);

curl_exec($ch);

curl_close($ch);




Um CURL zu verwenden, müssen Sie CUROPT_TIMEOUT auf 1 setzen (das Minimum beträgt 1, deprimierend). Das heißt, der Client muss mindestens 1 Sekunde warten. 9b21ee6b58e97765e2a3d44fcda3f6db

4.fscokopen()-Funktion

fsockopen ist eine sehr leistungsstarke Funktion, die die Socket-Programmierung unterstützt. Sie können fsockopen zum Senden von E-Mails verwenden. usw. Bei Socket-Programmen usw. müssen Sie bei Verwendung von fcockopen den Header-Teil manuell selbst spleißen

Offizielles Dokument: http://cn.php.net/fsockopen/

?
$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);
}

Stellungnahme:
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
Vorheriger Artikel:PHP-ReferenzNächster Artikel:PHP-Referenz