cli模式下執行thinkphp
1、cd 項目根目錄
2、php index.php admin/index/index --執行 模塊/控制器/方法名
異步消息隊列
1、服務器端核心代碼
/** * 腳本任務系統 */ public function server() { $serv = new \swoole_server("0.0.0.0", 8082); //日志會記錄你錯誤的數據 $serv->set(array('task_worker_num' => 20, 'log_file' => './swoole.log')); $serv->on('Receive', function ($serv, $fd, $from_id, $data) { $task_id = $serv->task($data); }); //執行任務模塊 $serv->on('Task', function ($serv, $task_id, $from_id, $data) { //1秒執行一次 $num = 0; $timer_id = $serv->tick(1000, function ($id) use ($serv,$data,$num) { $url = "http://notify.yingxiaom.top/index.php/admin/index/test"; $result = $this->request_post($url); if($result == 'SUCCESS'){ echo "1"; file_put_contents("b.txt","1",FILE_APPEND); $serv->clearTimer($id); } }); //10秒后銷毀 $serv->after(1000*60*2, function () use ($serv,$timer_id) { $serv->clearTimer($timer_id); }); $serv->finish($data); }); //任務結束 $serv->on('Finish', function ($serv, $task_id, $data) { echo "AsyncTask[$task_id] Finish: $data" . PHP_EOL; }); $serv->start(); } /* author@zhou * 功能:發送數據 * return */ public function request_post($url ='',$param ='') { $postUrl = $url; $curlPost = $param; $ch = curl_init();//初始化curl curl_setopt($ch, CURLOPT_URL,$postUrl);//抓取指定網頁 curl_setopt($ch, CURLOPT_HEADER, 0);//設置header curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);//要求結果為字符串且輸出到屏幕上 curl_setopt($ch, CURLOPT_POST, 1);//post提交方式 curl_setopt($ch, CURLOPT_POSTFIELDS, $curlPost); curl_setopt($ch, CURLOPT_HTTPHEADER, array('Content-Type: application/json; charset=utf-8','Content-Length: ' . strlen($curlPost))); curl_setopt($ch,CURLOPT_SSL_VERIFYPEER,false); curl_setopt($ch,CURLOPT_SSL_VERIFYHOST,false); $data = curl_exec($ch);//運行curl // var_dump(curl_errno($ch));die; curl_close($ch); return $data; }
2、客戶端代碼
/** * description:客戶端 */ public function client() { $phone = I("phone"); $client = new \swoole_client(SWOOLE_SOCK_TCP, SWOOLE_SOCK_SYNC); $ret = $client->connect("127.0.0.1", 8082); if(empty($ret)){ echo 'error!connect to swoole_server failed'; } else { if($phone){ $client->send($phone);//手機號 } echo "SUCCESS"; } }
3、注意事項
定時任務執行接口請求時返回 SUCCESS 清除定時
定時器會在單位時間內統一清除
worker_num 默認為cpu核數 (1-4倍最合理)
task_worker_num設置 每秒最大請求數 * 單個任務耗時(單位s) / worker_num
單個task的處理耗時,如100ms,那一個進程1秒就可以處理1/0.1=10個task
task投遞的速度,如每秒產生2000個task
2000/10=200,需要設置task_worker_num => 200,啟用200個task進程
通用傳參方式:
格式 :function () use ($param1,$param2)
$serv->after(1000*60*2, function () use ($serv,$timer_id) {
$serv->clearTimer($timer_id);
});