淺析如何使用好swoole毫秒級定時器功能?
swoole中提供了一個定期器的用法
$server->tick(1000,?function()?use?($server,?$fd)?{
????????$server->send($fd,?"hello?world");
????});
開始的時候我是這么用的,看下代碼
$serv?=?new?Swoole\Server("0.0.0.0",?9501);
$serv->set(array(
????'worker_num'?=>?1,????//worker?process?num
));
$serv->on('connect',?function?($serv,?$fd){
????echo?"客戶端?".$fd."連接成功?\n";
});
$serv->on('receive',?function?($serv,?$fd,?$reactor_id,?$data)?{
????echo?"客戶端?".$fd."發(fā)來消息:".$data."\n";
????$serv->send($fd,?'Swoole已經(jīng)介紹到您發(fā)送的消息:?'.$data);
});
$serv->on('close',?function?($serv,?$fd)?{
????echo?"客戶端?{$fd}關(guān)閉連接\n";
});
$serv->on('WorkerStart',?function?($serv,?$worker_id){
????$serv->tick(2000,?function(){
????????echo?"執(zhí)行定時器任務(wù)?".time()."?\n";
????});
});
$serv->start();
開始使用定時器的時候我放到了 onWorkStart 中執(zhí)行,這樣做的話可以保證在單個worker進程的情況下定時器可以正常運行,但是對于swoole來說讓它單進程工作顯然辱沒了它的 "才華" ,于是我將 work_num 設(shè)置為2 然后意外就發(fā)生啦,如圖

我們可以看到有兩個定期器在工作一個任務(wù)執(zhí)行了相同的兩次,于是這種方法是不對的,當然我們可以在 onWorkStart 中通過判斷 worker_id 來避免這種情況,但是后來我發(fā)現(xiàn)其實還有另外一種相對來說好點的方法,就是使用 用戶自定義進程來做
bool?Server->addProcess(Process?$process);
代碼如下:
$serv?=?new?Swoole\Server("0.0.0.0",?9501);
$serv->set(array(
????'worker_num'?=>?2,????//worker?process?num
));
//創(chuàng)建自定義進程
$process?=?new?Swoole\Process(function($process)?use?($serv)?{
????$serv->tick(2000,?function(){
????????echo?"執(zhí)行定時器任務(wù)?".time()."?\n";
????});
});
$serv->addProcess($process);
$serv->on('connect',?function?($serv,?$fd){
????echo?"客戶端?".$fd."連接成功?\n";
});
$serv->on('receive',?function?($serv,?$fd,?$reactor_id,?$data)?{
????echo?"客戶端?".$fd."發(fā)來消息:".$data."\n";
????$serv->send($fd,?'Swoole已經(jīng)介紹到您發(fā)送的消息:?'.$data);
});
$serv->on('close',?function?($serv,?$fd)?{
????echo?"客戶端?{$fd}關(guān)閉連接\n";
});
$serv->start();執(zhí)行效果:

ok!完美執(zhí)行!
往期精選

ThinkPHP5.0結(jié)合Swoole開發(fā)WebSocket在線聊天
你的點贊關(guān)注是對我最大的支持,求一鍵三連:分享朋友圈、點贊、在看
評論
圖片
表情
