<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          淺析如何使用好swoole毫秒級定時器功能?

          2021-11-10 02:59

          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í)行!

          往期精選

          swoole進程初識

          Swoole的多進程模塊

          詳細帶你了解什么是swoole 熱重啟?

          PHP使用swoole實現(xiàn)多線程爬蟲

          Swoole來實現(xiàn)實時異步任務(wù)隊列

          ThinkPHP5.0結(jié)合Swoole開發(fā)WebSocket在線聊天

          你的點贊關(guān)注是對我最大的支持,求一鍵三連:分享朋友圈、點贊、在看

          瀏覽 33
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          評論
          圖片
          表情
          推薦
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  99热亚洲精品 | 亚洲怡红院av | 95嫩模主播酒店约 | 日韩中文字幕组 | 99久久精品人妻无码一区二区蜜桃 |