如何使用workerman处理后台耗时 *** 作

如何使用workerman处理后台耗时 *** 作,第1张

mail_workerphp

<php

use Workerman\Worker;

require_once '/Workerman/Autoloaderphp';

// mail worker,和调用端使用Text协议通讯

$mail_worker = new Worker('Text://0000:12345');

// 如果发送邮件很慢,mail进程数可以根据需要多开一些

$mail_worker->count = 80;

$mail_worker->name = 'MailWorker';

$mail_worker->onMessage = function($connection, $mail_data)

{

// 直接返回ok,避免调用端长时间等待

$connection->send('ok');

// 假设发来的是json数据

$mail_data = json_decode($mail_data, true);

// 根据mail_data发邮件,如果需要失败重发,

// 可以把失败的邮件任务放到mysql里面,

// 做个定时器定时扫描失败邮件重新发送

your_send_mail_func($mail_data);

};

if(!defined('GLOBAL_START'))

{

Worker::runAll();

}

在你的项目中这样与mail_worker通讯发邮件。

//$ip = "mail_worker 的ip" ,本机的话为127001

$socket = stream_socket_client("tcp://$ip:12345", $errno, $errmsg, 5);

if(!$socket) echo $errmsg;

$mail_data = array("from"=>"", "to"=>"", "content"=>"");

// 注意,Text协议后面"\n"换行符是必须的

$mail_buffer = json_encode($mail_data)"\n";

// 发送给mail worker

fwrite($socket, $mail_buffer);

这样就可以异步发邮件了,防止主流程被发邮件阻塞,大大加快下单响应时间。

其实下单后能够在网站上实时通知也是个不错的体验,用户这边下单后,商家在网站上立刻得到通知,效果图类似

接入非常简单

这种即时聊天的需要常连接来实现,比较典型的有php的Workerman和nodejs的socketio,

原理是这样的。以socketio为例,访客端发送消息给nodejs[room(房间可以是域名加公司编号),uid(访客id可以是浏览器内核或者代理加ip加 *** 作系统生成),workerid(数据库对应客服的id),type(消息类型 可以是sendmsg,getmsg。。。)],监听到事件后在房间内广播进行推送给对应的workerid进行渲染显示在页面。在发送信息的同时写入到数据库。

nodejs就是一个传话的人但是24小时监听的,逻辑基本都在nodejs中处理。

mail_workerphp

<php

use Workerman\Worker;

require_once '/Workerman/Autoloaderphp';

// mail worker,和调用端使用Text协议通讯

$mail_worker = new Worker('Text://0000:12345');

// 如果发送邮件很慢,mail进程数可以根据需要多开一些

$mail_worker->count = 80;

$mail_worker->name = 'MailWorker';

$mail_worker->onMessage = function($connection, $mail_data)

{

// 直接返回ok,避免调用端长时间等待

$connection->send('ok');

// 假设发来的是json数据

$mail_data = json_decode($mail_data, true);

// 根据mail_data发邮件,如果需要失败重发,

// 可以把失败的邮件任务放到mysql里面,

// 做个定时器定时扫描失败邮件重新发送

your_send_mail_func($mail_data);

};

if(!defined('GLOBAL_START'))

{

Worker::runAll();

}

在你的项目中这样与mail_worker通讯发邮件。

//$ip = "mail_worker 的ip" ,本机的话为127001

$socket = stream_socket_client("tcp://$ip:12345", $errno, $errmsg, 5);

if(!$socket) echo $errmsg;

$mail_data = array("from"=>"", "to"=>"", "content"=>"");

// 注意,Text协议后面"\n"换行符是必须的

$mail_buffer = json_encode($mail_data)"\n";

// 发送给mail worker

fwrite($socket, $mail_buffer);

这样就可以异步发邮件了,防止主流程被发邮件阻塞,大大加快下单响应时间。

其实下单后能够在网站上实时通知也是个不错的体验,用户这边下单后,商家在网站上立刻得到通知,效果图类似

接入非常简单

使用单例,用的时候创建连接即可。

不用在onStart时创建。

在workerman中使用单例模式(在类静态成员中保存对象/数据),在当前进程生命周期内所有请求中都是共享可用的。比如数据库单例,当使用数据库时发现数据库对象还没创建,就立即创建一个,然后保存在数据库类的静态成员中,下次再次使用数据库对象时,直接使用数据库静态成员那个数据库对象即可,这样当前进程内的所有请求就都可以复用这个数据库对象,也就是真正意义上的长连接,没有频繁的数据库连接、权限验证、断开连接等开销,非常高效。

workerman中自带mysql类,也是使用的单例模式,只有在第一次 调用Db::instance(‘db_name’)->query(sql)时才创建一个数据库连接对象,才会去连接数据库。后面再调用Db::instance(‘db_name’)就直接复用了第一次创建的数据库对象,不会在创建。

使用单例用候创建连接即 用onStart创建 workerman使用单例模式(类静态员保存象/数据)前进程命周期内所请求都共享用比数据库单例使用数据库发现数据库象没创建立即创建

以上就是关于如何使用workerman处理后台耗时 *** 作全部的内容,包括:如何使用workerman处理后台耗时 *** 作、即时聊天软件的原理,Web网页的聊天又是怎么实现的呢、怎样使用workerman实现定时任务等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/sjk/9534958.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-29
下一篇 2023-04-29

发表评论

登录后才能评论

评论列表(0条)

保存