workerman如何实现异步任务(附代码)

发布时间 - 2019-11-23 00:00:00    点击率:

下面由workerman使用教程栏目给大家介绍workerman实现异步任务的方法,希望对需要的朋友有所帮助!

1、问题

遇到一个问题,php是单线程,无法实现多线程。现在我需要使用一个场景是多个链接使用一个线程,也就是在一个连接进程,再开进程来处理

2、解决方案 

workerman如何实现异步任务。workerman可以帮我解决问题, 给予文档一个解答

问: 

如何异步处理繁重的业务,避免主业务被长时间阻塞。例如我要给1000用户发送邮件,这个过程很慢,可能要阻塞数秒,这个过程中因为主流程被阻塞,会影响后续的请求,如何将这样的繁重任务交给其它进程异步处理。 

答: 

可以在本机或者其它服务器甚至服务器集群预先建立一些任务进程处理繁重的业务,任务进程数可以开多一些,例如cpu的10倍,然后调用方利用AsyncTcpConnection将数据异步发送给这些任务进程异步处理,异步得到处理结果 

任务进程服务端

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();

在workerman中调用

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();

这样,繁重的任务交给本机或者其它服务器的进程去做,任务完成后会异步收到结果,业务进程就不会阻塞了。

更多Workerman相关技术文章,请访问Workerman教程栏目进行学习!


# workerman  # 异步任务  # php  # 线程  # 多线程  # 异步 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: 如何为不同团队 ID 动态生成多个“认领值班”按钮  如何用y主机助手快速搭建网站?  JavaScript如何实现倒计时_时间函数如何精确控制  如何快速搭建虚拟主机网站?新手必看指南  网站制作大概多少钱一个,做一个平台网站大概多少钱?  phpredis提高消息队列的实时性方法(推荐)  5种Android数据存储方式汇总  如何用PHP快速搭建高效网站?分步指南  昵图网官网入口 昵图网素材平台官方入口  Laravel Docker环境搭建教程_Laravel Sail使用指南  如何获取PHP WAP自助建站系统源码?  Laravel Blade组件怎么用_Laravel可复用视图组件的创建与使用  如何用IIS7快速搭建并优化网站站点?  javascript基本数据类型及类型检测常用方法小结  如何快速搭建高效简练网站?  如何用美橙互联一键搭建多站合一网站?  制作电商网页,电商供应链怎么做?  微信h5制作网站有哪些,免费微信H5页面制作工具?  js代码实现下拉菜单【推荐】  高性能网站服务器部署指南:稳定运行与安全配置优化方案  Laravel Eloquent性能优化技巧_Laravel N+1查询问题解决  Laravel如何使用Laravel Vite编译前端_Laravel10以上版本前端静态资源管理【教程】  Laravel怎么在Blade中安全地输出原始HTML内容  ChatGPT怎么生成Excel公式_ChatGPT公式生成方法【指南】  Laravel如何配置和使用缓存?(Redis代码示例)  Laravel怎么为数据库表字段添加索引以优化查询  jQuery 常见小例汇总  Android 常见的图片加载框架详细介绍  图片制作网站免费软件,有没有免费的网站或软件可以将图片批量转为A4大小的pdf?  Laravel如何与Docker(Sail)协同开发?(环境搭建教程)  网站页面设计需要考虑到这些问题  如何在HTML表单中获取用户输入并结合JavaScript动态控制复利计算循环  如何在橙子建站上传落地页?操作指南详解  Bootstrap CSS布局之列表  Laravel如何配置Horizon来管理队列?(安装和使用)  敲碗10年!Mac系列传将迎来「触控与联网」双革新  html5怎么画眼睛_HT5用Canvas或SVG画眼球瞳孔加JS控制动态【绘制】  在centOS 7安装mysql 5.7的详细教程  php做exe能调用系统命令吗_执行cmd指令实现方式【详解】  Win11怎么修改DNS服务器 Win11设置DNS加速网络【指南】  品牌网站制作公司有哪些,买正品品牌一般去哪个网站买?  高端建站三要素:定制模板、企业官网与响应式设计优化  文字头像制作网站推荐软件,醒图能自动配文字吗?  html如何与html链接_实现多个HTML页面互相链接【互相】  悟空识字怎么关闭自动续费_悟空识字取消会员自动扣费步骤  如何用免费手机建站系统零基础打造专业网站?  Laravel如何安装Breeze扩展包_Laravel用户注册登录功能快速实现【流程】  *服务器网站为何频现安全漏洞?  Laravel Octane如何提升性能_使用Laravel Octane加速你的应用  Laravel如何优化应用性能?(缓存和优化命令)