Die folgende Spalte des Tutorials zur Workerman-Nutzung wird Ihnen die Methode des Workerman zum Implementieren asynchroner Aufgaben vorstellen. Ich hoffe, dass sie Freunden, die sie benötigen, hilfreich sein wird!
1. Problem
PHP ist Single-Threaded und kann keine Multi-Threaded-Funktionalität erreichen. Einfädeln. Jetzt muss ich ein Szenario verwenden, in dem mehrere Links einen Thread verwenden, also in einem Verbindungsprozess, und dann den Prozess öffnen, um
Lösung
zu verarbeiten Wie wäre es mit Workerman? Implementieren Sie asynchrone Aufgaben. Workerman kann mir bei der Lösung des Problems helfen und eine Antwort auf das Dokument geben
F:
Wie man schwere Geschäfte asynchron verarbeitet, um zu vermeiden, dass das Hauptgeschäft für längere Zeit blockiert wird. Ich möchte beispielsweise E-Mails an 1.000 Benutzer senden. Da der Hauptprozess während dieses Vorgangs blockiert ist, wirkt sich dies auf nachfolgende Anfragen aus andere Prozesse zur asynchronen Verarbeitung.
Antwort:
Sie können einige Aufgabenprozesse auf diesem Computer oder anderen Servern oder sogar Serverclustern vorab einrichten, um schwere Aufgaben abzuwickeln. Die Anzahl der Aufgabenprozesse kann beispielsweise auf 10 erhöht werden mal die CPU und dann anrufen Die Partei verwendet AsyncTcpConnection, um asynchron Daten an diese Task-Prozesse zur asynchronen Verarbeitung zu senden und die Verarbeitungsergebnisse asynchron zu erhalten
Task-Prozessserver
use Workerman\Worker; require_once __DIR__ . '/Workerman/Autoloader.php'; // task worker,使用Text协议 $task_worker = new Worker('Text://0.0.0.0:12345'); // task进程数可以根据需要多开一些 $task_worker->count = 100; $task_worker->name = 'TaskWorker'; //只有php7才支持task->reusePort,可以让每个task进程均衡的接收任务 //$task->reusePort = true; $task_worker->onMessage = function($connection, $task_data) { // 假设发来的是json数据 $task_data = json_decode($task_data, true); // 根据task_data处理相应的任务逻辑.... 得到结果,这里省略.... $task_result = ...... // 发送结果 $connection->send(json_encode($task_result)); }; Worker::runAll();
Arbeiter anrufen
use Workerman\Worker; use \Workerman\Connection\AsyncTcpConnection; require_once __DIR__ . '/Workerman/Autoloader.php'; // websocket服务 $worker = new Worker('websocket://0.0.0.0:8080'); $worker->onMessage = function($ws_connection, $message) { // 与远程task服务建立异步连接,ip为远程task服务的ip,如果是本机就是127.0.0.1,如果是集群就是lvs的ip $task_connection = new AsyncTcpConnection('Text://127.0.0.1:12345'); // 任务及参数数据 $task_data = array( 'function' => 'send_mail', 'args' => array('from'=>'xxx', 'to'=>'xxx', 'contents'=>'xxx'), ); // 发送数据 $task_connection->send(json_encode($task_data)); // 异步获得结果 $task_connection->onMessage = function($task_connection, $task_result)use($ws_connection) { // 结果 var_dump($task_result); // 获得结果后记得关闭异步连接 $task_connection->close(); // 通知对应的websocket客户端任务完成 $ws_connection->send('task complete'); }; // 执行异步连接 $task_connection->connect(); } Worker::runAll();
Auf diese Weise werden schwere Aufgaben an den Prozess des lokalen Computers oder anderer Server übergeben. Nach Abschluss der Aufgabe werden die Ergebnisse asynchron empfangen. und der Geschäftsprozess wird nicht blockiert.
Weitere technische Artikel zum Thema Workerman finden Sie in der Spalte Workerman-Tutorial, um mehr darüber zu erfahren!
Das obige ist der detaillierte Inhalt vonWie Workerman asynchrone Aufgaben implementiert (mit Code). Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!