La colonne suivante du tutoriel d'utilisation de Workerman vous présentera la méthode de Workingerman pour mettre en œuvre des tâches asynchrones. J'espère qu'elle sera utile aux amis qui en ont besoin !
1. Problème
J'ai rencontré un problème avec un seul thread et ne peut pas réaliser de multi-thread. filetage. Maintenant, je dois utiliser un scénario dans lequel plusieurs liens utilisent un seul thread, c'est-à-dire dans un seul processus de connexion, puis ouvrir le processus pour gérer
Solution
. Que diriez-vous de Workerman Implémentez des tâches asynchrones. Workerman peut m'aider à résoudre le problème et donner une réponse au document
Q :
Comment traiter des affaires lourdes de manière asynchrone pour éviter que l'activité principale ne soit bloquée pendant une longue période. Par exemple, je souhaite envoyer des e-mails à 1 000 utilisateurs. Ce processus est très lent et peut être bloqué pendant plusieurs secondes. Étant donné que le processus principal est bloqué pendant ce processus, cela affectera les demandes ultérieures. d'autres processus pour le traitement asynchrone.
Réponse :
Vous pouvez pré-établir certains processus de tâches sur cette machine ou sur d'autres serveurs ou même des clusters de serveurs pour gérer des tâches lourdes. Le nombre de processus de tâches peut être augmenté, par exemple, 10. fois le processeur, puis appelez La partie utilise AsyncTcpConnection pour envoyer de manière asynchrone des données à ces processus de tâche pour un traitement asynchrone et obtenir les résultats du traitement de manière asynchrone
Serveur de processus de tâche
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();
Appel à Workererman
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();
De cette façon, les tâches lourdes sont transférées au processus de la machine locale ou d'autres serveurs. Une fois la tâche terminée, les résultats seront reçus de manière asynchrone, et le processus commercial ne sera pas bloqué.
Pour plus d'articles techniques liés à Workerman, veuillez visiter la colonne Tutoriel Workerman pour apprendre !
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!