<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>

                合規國際互聯網加速 OSASE為企業客戶提供高速穩定SD-WAN國際加速解決方案。 廣告
                # Server->task [TOC] 投遞一個異步任務到`task_worker`池中。此函數是非阻塞的,執行完畢會立即返回。`Worker`進程可以繼續處理新的請求。使用`Task`功能,必須先設置[task\_worker\_num](task\_worker\_num.md),并且必須設置`Server`的`onTask`和`onFinish`事件回調函數。 ~~~ int Server::task(mixed $data, int $dst_worker_id = -1) $task_id = $serv->task("some data"); //swoole-1.8.6或更高版本 $serv->task("taskcallback", -1, function (swoole_server $serv, $task_id, $data) { echo "Task Callback: "; var_dump($task_id, $data); }); ~~~ ## 參數 * `$data`要投遞的任務數據,必須是可序列化的`PHP`變量 * `$dst_worker_id`可以制定要給投遞給哪個`Task`進程,傳入`ID`即可,范圍是`0 - (serv->task_worker_num -1)` ## 返回值 * 調用成功,返回值為整數`$task_id`,表示此任務的`ID`。如果有`finish`回應,`onFinish`回調中會攜帶`$task_id`參數 * 調用失敗,返回值為`false`,`$task_id`可能為`0`,因此必須使用`===`判斷是否失敗 ## 說明 * 未指定目標`Task`進程,調用`task`方法會判斷`Task`進程的忙閑狀態,底層只會向處于空閑狀態的`Task`進程投遞任務。如果所有`Task`進程均處于忙的狀態,底層會輪詢投遞任務到各個進程。可以使用[server->stats](Server-stats.md)方法獲取當前正在排隊的任務數量。 * 1.8.6版本增加了第三個參數,可以直接設置`onFinish`函數,如果任務設置了回調函數,Task返回結果時會直接執行指定的回調函數,不再執行Server的`onFinish`回調 > `$dst_worker_id`在`1.6.11+`后可用,默認為隨機投遞 > `$task_id`是從`0-42億`的整數,在當前進程內是唯一的 > `task`方法不能在`task`進程/用戶自定義進程中調用 此功能用于將慢速的任務異步地去執行,比如一個聊天室服務器,可以用它來進行發送廣播。當任務完成時,在task進程中調用`$serv->finish("finish")`告訴worker進程此任務已完成。當然`swoole_server->finish`是可選的。 task底層使用Unix Socket管道通信,是全內存的,沒有IO消耗。單進程讀寫性能可達100萬/s,不同的進程使用不同的管道通信,可以最大化利用多核。 > AsyncTask功能在1.6.4版本增加,默認不啟動task功能,需要在手工設置task\_worker\_num來啟動此功能 > task\_worker的數量在swoole\_server::set參數中調整,如task\_worker\_num => 64,表示啟動64個進程來接收異步任務 ## 配置參數 swoole\_server->task/taskwait/finish 3個方法當傳入的`$data`數據超過8K時會啟用臨時文件來保存。當臨時文件內容超過`server->package_max_length`時底層會拋出一個警告。此警告不影響數據的投遞,過大的Task可能會存在性能問題。 ~~~ WARN: task package is too big. ~~~ > server->package\_max\_length 默認為2M ## 注意事項 * 使用`task`必須為Server設置`onTask`和`onFinish`回調,否則`swoole_server->start`會失敗 * `task`操作的次數必須小于`onTask`處理速度,如果投遞容量超過處理能力,task會塞滿緩存區,導致worker進程發生阻塞。worker進程將無法接收新的請求 * 使用`addProcess`添加的用戶進程中無法使用`task`投遞任務,請使用`sendMessage`接口與`Task`工作進程通信 ## 代碼示例 ~~~ <?php $serv = new swoole_server("127.0.0.1", 9501, SWOOLE_BASE); $serv->set(array( 'worker_num' => 2, 'task_worker_num' => 4, )); $serv->on('Receive', function(swoole_server $serv, $fd, $from_id, $data) { echo "接收數據" . $data . "\n"; $data = trim($data); $task_id = $serv->task($data, 0); $serv->send($fd, "分發任務,任務id為$task_id\n"); }); $serv->on('Task', function (swoole_server $serv, $task_id, $from_id, $data) { echo "Tasker進程接收到數據"; echo "#{$serv->worker_id}\tonTask: [PID={$serv->worker_pid}]: task_id=$task_id, data_len=".strlen($data).".".PHP_EOL; $serv->finish($data); }); $serv->on('Finish', function (swoole_server $serv, $task_id, $data) { echo "Task#$task_id finished, data_len=".strlen($data).PHP_EOL; }); $serv->on('workerStart', function($serv, $worker_id) { global $argv; if($worker_id >= $serv->setting['worker_num']) { | swoole_set_process_name("php {$argv[0]}: task_worker"); } else { | swoole_set_process_name("php {$argv[0]}: worker"); } }); $serv->start(); ~~~
                  <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>

                              哎呀哎呀视频在线观看