需要做一个多用户群发模板消息的功能。多个用户同时给自己上千个会员发送模板消息。
还有定时发送任务。但是这里有个问题。在发送任务稍微多点比如几百上千的时候。发送的数据会有延迟1-2个小时甚至更久才能发送出去。请教下是哪儿出了问题?
以下是代码。
// 开启的端口
$worker = new Worker();
// 启动多少服务进程
$worker->count = 100;
// worker名称,php start.php status 时展示使用
//$worker->name = 'redis';
$worker->onWorkerStart = function () {
$redis = new Rediss;
$redis->pconnect('127.0.0.1', 6379);
$Weixin = new Weixin();
$queue = array("sendmsg","tuikuanmsg","renewsendmsg");
//$queue = "sendmsg";
while($redis){
$time = time();
$ret = $redis->blPop($queue, 60);
if($ret && count($ret) == 2 && $ret[1]) {
$info = json_decode($ret[1],true);
$wxfdid=$info["wxfdid"];
$appid=$info["appid"];
$secret=$info["secret"];
$token = checkAccessTokenFD($redis,$wxfdid,$appid,$secret);
if(!$token) {
echo "token miss";
continue;
}
if($ret[0] == "sendmsg"){
if($info["sendtype"] == 1 || $info["sendtype"] == 3 || ($info["sendtype"] == 2 && ($info["sendtime"]-$time) <= 3)){
$Weixin->sendMsg($info, $token);
if($info["sendtype"] == 3){
$info["sendtype"] = 2;
$info["materialstitle"] = "【再次通知】".$info["materialstitle"];
$info["title"] = "【再次通知】".$info["title"];
$info["mbtitle"] = "【再次通知】".$info["mbtitle"];
$redis->lPush("sendmsg", json_encode($info));
}
}elseif($info["sendtype"] == 2 && ($info["sendtime"]-$time) > 3){
$redis->lPush("sendmsg", $ret[1]);
}
}elseif($ret[0] == "tuikuanmsg"){
$Weixin->tuikuanMsg($info, $token);
}elseif($ret[0] == "renewsendmsg"){
$Weixin->renewSendMsg($info, $token);
}
}
}
};
Worker::runAll();
这是代码
服务器的带宽 10M,内存 8G,CPU 8核
有谁能帮助解决下问题。有偿
可以针对每个进程的任务记录日志看下,这种耗时任务可以多开进程处理
我上面写了100个进程呢,但是发送300-500个数据都要延迟1个小时左右。不知道什么情况
不太明白你的redis是什么意思,但感觉问题就出在 $ret = $redis->blPop($queue, 60);阻塞了
REDIS里面记录了数据,这儿是把所有REDIS的数据取出来,然后发送模板消息。 $ret = $redis->blPop($queue, 60);这儿应该怎么处理呢?
异步队列后台去执行, blpop 阻塞肯定延迟
我的写了WHILE循环呢。也阻塞?