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.
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>
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>