php異步可控併發執行耗時任務

記一次項目開發中遇到的問題以及解決方法:

問題:由於項目需定時執行一項非常耗時的任務,由於執行時間太長導致超時沒有真正執行任務。

解決方法:使用curl的curl_multi_*族函數實現簡單的併發.。參考網址

1,引入參考網址的Curl_request類和Curl類;

2,我自己的關鍵調用代碼如下,相當於分頁查詢數據庫並執行:

public function index() {
        $count = Db::name('mytable')
            ->field('id')
            ->where('status', 'between', [0,1])
            ->union('SELECT id FROM mytable WHERE status BETWEEN 4 AND 6')
            ->count();
        //每次取數據條數
        $limit = $step = 2000;
        //計算總頁數
        $pages = ceil($count/$step);
        if ($pages > 0) {
            $curl = new Curl();
            $url = $this->request->domain() . '/task/express_info_task/execute';
            for ($page = 1; $page <= $pages; $page++) {
                $request = new CurlRequest($url . '?page=' . $page . '&limit=' . $limit);
                $curl->add($request);
            }

            $curl->execute();
            echo $curl->display_errors();
        }
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章