1. 程式人生 > >微信傳送百萬模板訊息swoole 定時任務不能非同步task問題

微信傳送百萬模板訊息swoole 定時任務不能非同步task問題

專案中,有遇到一個問題,傳送三百萬條資料,如果用普通的阻塞傳送,一天完成任務(白天),恐怕伺服器都會罷工。

用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; ?>