微信傳送百萬模板訊息swoole 定時任務不能非同步task問題
阿新 • • 發佈:2019-01-09
專案中,有遇到一個問題,傳送三百萬條資料,如果用普通的阻塞傳送,一天完成任務(白天),恐怕伺服器都會罷工。
用swoole 測試了下,把task 開到1000個,也就是一秒鐘,可以同時發1000條資料。swoole 最大開啟task 數量為4000,這個根據自身的伺服器的效能來決定,開多少個合適。
這個時候就遇到了個問題,如果用swoole 的非同步定時任務。則會報錯,是因為,官方介紹說明了,非同步不能再非同步。也就是task裡面不能有task任務。
於是想到了,把swoole 當作http伺服器,定時任務觸發的是http請求,再觸發任務,在任務中分配task
程式碼如下:
<?php
class Http{
public $http=null;
public function __construct()
{
$this->http = new swoole_http_server('0.0.0.0',9502);
$this->http->on('start',[$this,'onstart']);
$this->http->on('request',[$this,'onrequest']);
$this->http->on('task',[$this,'ontask' ]);
$this->http->on('finish',[$this,'onfinish']);
$this->http->set([
'task_worker_num'=>1000,
]);
$this->http->start();
}
public function onstart($server){
$this->http->reload();
swoole_timer_tick(10000,function () {
$this->getnet();
});
}
public function ontask(){
$data = file_get_contents('http://www.baidu.com/');
echo '成功';
}
public function onfinish(){
}
public function onrequest($request,$response){
//投遞任務的地方:
for($i=0;$i<300;$i++){
$this->http->task('kkkk');
}
}
public function getnet(){
Swoole\Async::dnsLookup("0.0.0.0", function ($domainName, $ip) {
$cli = new swoole_http_client($ip, 9502);
global $http;
$cli->get('index', function ($cli) {
});
});
}
}
new Http;
?>