Nachdem ich die Bearbeitung der Anfrage erhalten hatte, gab es einen sehr zeitaufwändigen Vorgang, der die Anforderung der WeChat-Schnittstelle erforderte. Dabei mussten viele Bestellungen bearbeitet und die WeChat-Schnittstelle aufgerufen werden. Ich möchte diese Vorgänge nach dem Echo ausführen. Die Nachrichtenwarteschlange muss Erweiterungen wie memcacheq auf dem Server installieren. Ich habe keine Berechtigung zum Betreiben des Servers und möchte das Problem mit Code lösen. Ist es möglich, eine Nachrichtenwarteschlange zu implementieren? Kann mir jemand ein Beispiel geben? Ich weiß nichts über Warteschlangenoperationen. Ich habe gesehen, dass es auch mit fsockopen implementiert werden kann. Was ist der Unterschied zwischen diesem und dem Nachrichtenwarteschlangenmechanismus?
Nachdem ich die Bearbeitung der Anfrage erhalten hatte, gab es einen sehr zeitaufwändigen Vorgang, der die Anforderung der WeChat-Schnittstelle erforderte. Dabei mussten viele Bestellungen bearbeitet und die WeChat-Schnittstelle aufgerufen werden. Ich möchte diese Vorgänge nach dem Echo ausführen. Die Nachrichtenwarteschlange muss Erweiterungen wie memcacheq auf dem Server installieren. Ich habe keine Berechtigung zum Betreiben des Servers und möchte das Problem mit Code lösen. Ist es möglich, eine Nachrichtenwarteschlange zu implementieren? Kann mir jemand ein Beispiel geben? Ich weiß nichts über Warteschlangenoperationen. Ich habe gesehen, dass es auch mit fsockopen implementiert werden kann. Was ist der Unterschied zwischen diesem und dem Nachrichtenwarteschlangenmechanismus?
<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.
Um Shell-Injection (im Vergleich zur SQL-Injection) zu vermeiden, ist es am besten, dies zu tun Serialisieren Sie den Zeichenfolgenparameter in die Datei
und übergeben Sie dann den Dateipfadparameter an das Skript task.php. Lassen Sie task.php die Datei lesen, deserialisieren und die Daten abrufen.
Der Dateiname sollte eindeutig sein Dies kann beispielsweise die Benutzer-ID, die Prozess-PID und die Zufallszeit sein:
<code>$filename = md5(uniqid($uid.'_'.getmypid().'_'.mt_rand().'_', true)); </code>
Die von PHP-FPM bereitgestellte Funktion fastcgi_finish_request
kann alle Antwortdaten an den Client senden und die Anfrage beenden. Dadurch kann der Client weiterhin Code ausführen, der nach Beendigung der Verbindung nicht an den Benutzer ausgegeben werden muss, z B. einen Cache generieren, blockiert jedoch weiterhin den aktuellen FPM-Arbeitsprozess.
http://php.net/manual/zh/func...
fsockopen bedeutet, eine Anfrage zu stellen (ähnlich wie bei Curl), aber nicht auf die Rückgabe des Ergebnisses zu warten.
Sie können also auch fsockopen verwenden. Nach dem Echo fordert fsockopen den lokalen Betrieb der WeChat-Schnittstelle an und fertig