Asynchrone Programmierung – Wie führt PHP Code asynchron aus?

WBOY
Freigeben: 2016-08-08 09:06:53
Original
1321 Leute haben es durchsucht

Wenn ich beispielsweise einige Protokolldaten aufzeichnen möchte, muss ich sie nicht in Echtzeit speichern. Ich möchte den folgenden Code sofort ausführen, nachdem der Code asynchron ausgeführt wurde Wenn ich die Daten an die Nachrichtenwarteschlange sende, dauert dies ebenfalls einige Zeit. Es ist mir egal, an wen die Daten weitergeleitet werden in die Datenbank. Zum Beispiel:
echo 1;
log(data) ;
echo 2;
Ich möchte, dass die Protokollfunktion im Hintergrund ausgeführt wird. Es ist mir egal, aber ich muss nicht darauf warten, es scheint mir, dass es in Millisekunden erledigt ist.

Antwortinhalt:

Wenn ich beispielsweise einige Protokolldaten aufzeichnen möchte, muss ich sie nicht in Echtzeit speichern. Ich möchte den folgenden Code sofort ausführen, nachdem der Code asynchron ausgeführt wurde Wenn ich die Daten an die Nachrichtenwarteschlange sende, dauert dies ebenfalls einige Zeit. Es ist mir egal, an wen die Daten weitergeleitet werden in die Datenbank. Zum Beispiel:
echo 1;
log(data) ;
echo 2;
Ich möchte, dass die Protokollfunktion im Hintergrund ausgeführt wird. Es ist mir egal, aber ich muss nicht darauf warten, es scheint mir, dass es in Millisekunden erledigt ist.

An Nachrichtenwarteschlange senden vs. Millisekundenebene >>> Wo liegt der Widerspruch?

Sie können Redis verwenden, um eine Warteschlange für Redis-Operationen zu erstellen, die Zehntausende Male pro Sekunde gelesen und geschrieben werden. Das Einfügen von Nachrichten in Redis erfordert nur einen Schreibvorgang und der Zeitaufwand beträgt weniger als Millisekunden.
Ich denke also, dass die Verwendung von Warteschlangen die von Ihnen genannten Anforderungen auf Millisekundenebene vollständig erfüllen kann.

Außerdem entsteht unabhängig davon, welche Mittel zur Durchführung asynchroner Vorgänge verwendet werden, immer ein Zeitaufwand, der unvermeidlich ist.

<code>//程序被阻塞10秒
shell_exec('timeout 10 vmstat 1 >/dev/null 2>&1 &');

//程序不会被阻塞
pclose(popen('timeout 10 vmstat 1 >/dev/null 2>&1 &', 'r'));

//因此可以异步执行任务
pclose(popen("timeout 60 php /path/to/task.php '$arg' >/dev/null 2>&1 &", 'r'));</code>
Nach dem Login kopieren

Die Variable $arg ist der Parameter, der an das Skript task.php übergeben wird. Dieser Parameter wird über $argv[1] in task.php erhalten.
timeout 60 bedeutet die maximale Ausführungszeit des task.php-Skripts 60 Sekunden. Es kann bei Bedarf entfernt werden.
Der Kern von pclose(popen()) besteht darin, einen Prozess zum Ausführen von Blockierungscode zu öffnen.
Es eignet sich für asynchrone Szenarien, die keine automatische Implementierung erfordern Rückgabe der Ergebnisse (Callbacks) nach Abschluss der Ausführung

Der String-Parameter $arg kann in einfache Anführungszeichen gesetzt werden, wodurch die Auswirkungen einiger Leerzeichen vermieden werden können, er weist jedoch immer noch Mängel auf.
Es ist am besten, den String-Parameter in eine Datei zu serialisieren,
und dann Geben Sie es an die Skriptaufgabe weiter und
lässt task.php die Datei lesen, deserialisieren und die Daten abrufen.
Der Dateiname sollte eindeutig sein die Benutzer-ID oder Prozess-PID plus eine zufällige Zeitnummer:

<code>$filename = md5(uniqid($uid.'_',        true));
$filename = md5(uniqid($getmypid().'_', true));</code>
Nach dem Login kopieren
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