<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ??碼云GVP開源項目 12k star Uniapp+ElementUI 功能強大 支持多語言、二開方便! 廣告
                大部分時候我們項目的業務邏輯是同步阻塞運行的,但是有些時候會遇到一些耗時較大的操作,比如向十萬個用戶群發通知郵件,我們的程序不可能等待十萬次循環后再執行其他操作,這種時候我們會采用異步操作,由 worker 進程向 task 進程發送任務,task 進程處理完全部任務之后通過onFinish回調函數通知 worker 進程。例如,我們在后臺操作向十萬個用戶群發通知郵件,操作完成后操作的狀態顯示為發送中,這時我們可以繼續其他操作。等郵件群發完畢后,操作的狀態自動改為已發送。 接下來我們演示使用 ThinkPHP5 和 Swoole 的 task 模塊來演示異步多任務處理。 創建 ThinkPHP5 自定義命令行 1.創建命令行類 - 創建application/console/AsyncTask.php文件 ~~~ <?php namespace app\Console; use think\console\Command; use think\console\Input; use think\console\Output; class AsyncTask extends Command { protected $server; // 命令行配置函數 protected function configure() { // setName 設置命令行名稱 // setDescription 設置命令行描述 $this->setName('task:start')->setDescription('Start Task Server!'); } // 設置命令返回信息 protected function execute(Input $input, Output $output) { $this->server = new \swoole_server('0.0.0.0', 9501); // server 運行前配置 $this->server->set([ 'worker_num' => 4, 'daemonize' => false, 'task_worker_num' => 4 # task 進程數 ]); // 注冊回調函數 $this->server->on('Start', [$this, 'onStart']); $this->server->on('Connect', [$this, 'onConnect']); $this->server->on('Receive', [$this, 'onReceive']); $this->server->on('Task', [$this, 'onTask']); $this->server->on('Finish', [$this, 'onFinish']); $this->server->on('Close', [$this, 'onClose']); $this->server->start(); } // 主進程啟動時回調函數 public function onStart(\swoole_server $server) { echo "Start\n"; } // 建立連接時回調函數 public function onConnect(\swoole_server $server, $fd, $from_id) { echo "Connect\n"; } // 收到信息時回調函數 public function onReceive(\swoole_server $server, $fd, $from_id, $data) { echo "message: {$data} form Client: {$fd} \n"; // 投遞異步任務 $task_id = $server->task($data); echo "Dispath AsyncTask: id={$task_id}\n"; // 將受到的客戶端消息再返回給客戶端 $server->send($fd, "Message form Server: {$data}, task_id: {$task_id}"); } // 異步任務處理函數 public function onTask(\swoole_server $server, $task_id, $from_id, $data) { echo "{$task_id}, Task Completed \n"; //返回任務執行的結果 $server->finish("$data -> OK"); } // 異步任務完成通知 Worker 進程函數 public function onFinish(\swoole_server $server, $task_id, $data) { echo "AsyncTask[{$task_id}] Finish: {$data} \n"; } // 關閉連時回調函數 public function onClose(\swoole_server $server, $fd, $from_id) { echo "Close\n"; } } ~~~ 2.修改配置文件 - 文件所在 application/command.php ~~~ <?php return [ 'app\console\AsyncTask', ]; ~~~ 接下來就可以通過命令行來啟動異步多任務處理 $ > `php think task:start` 這個時候我們使用 telnet 進行測試 `telnet 127.0.0.1 9501` 連接上服務器后,輸入hello回車,發送消息給 TCP 服務器,將受到一下回執 ![](https://box.kancloud.cn/60b9b89450bfdc005101aaf645694153_706x292.png) 同時服務器端會顯示出異步任務操作的具體流程 ![](https://box.kancloud.cn/5d0a78abd6fb4a17102537152520d66b_491x129.png) 當 TCP 服務器啟動時會自動輸出Start,當客戶端連接上服務器的時候自動輸出Connect,這時客戶端向服務器發送hello,服務器接受到數據之后先顯示出message: hello form Client: 1,意思是收到來自客戶端id 為1的數據hello,同時把數據提交給異步任務,顯示出Dispath AsyncTask: id=0,異步任務處理函數收到任務時執行任務,顯示出0, Task Completed,表示任務已經完成,同時使用onFinish函數通知Worker進程已經完成異步任務
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看