用workman-json-rpc做了一個微信發(fā)送大量模板消息的程序??蛻舳舜a如下
$address_array = array(
'tcp://127.0.0.1:2015'
);
// 配置服務端列表
RpcClient::config($address_array);
$Weixin = RpcClient::instance('Weixin');
$Common = new Common;
//獲取公眾號消息模板ID
$templateid = $Common->configsFromName("wxmbtzid");
//獲取是先發(fā)現(xiàn)模板消息還是先發(fā)送客服消息
$usekfmessage = $Common->configsFromName("usekfmessage");
$config = get_addon_config('third');
$wxconfig = $config["wechat"];
$appid = $wxconfig["app_id"];
$access_token = getAccessToken();
//發(fā)送消息
foreach ($param as $k => $value){
$Weixin->asend_sendMsg($usekfmessage,$templateid,$access_token,$value);
}
//接受消息,斷開連接
foreach ($param as $k => $value){
$data[$k] = $Weixin->arecv_sendMsg($usekfmessage,$templateid,$access_token,$value);
}
我做了發(fā)現(xiàn)WORKERMAN執(zhí)行經常報錯recvData empty。
然后在服務端查看狀態(tài)
發(fā)現(xiàn)有一條連接斷開了。這種需要怎么處理,我現(xiàn)在才發(fā)送了4條連接,就斷開了一條。我需要的是一次性要發(fā)送1000條以上才行。請問大家有沒有什么好的辦法
recvData empty
說明業(yè)務執(zhí)行太慢了,超時了。
如果你的業(yè)務很慢,不建議用JsonRpc,用消息隊列更好一些。
@1:我的意思是說呢,我需要發(fā)1W條,但是用發(fā)1000條的時間就能發(fā)出去1W條。我想了2個辦法,1個是// 啟動多少服務進程
//$worker->count = 10;第一個辦法就是發(fā)布多條訂閱,然后您覺得哪一種辦法可行性高一點呢。
有時候一些項目運行在apache或者php-fpm環(huán)境,無法使用workerman/redis-queue項目,可以參考如下函數(shù)實現(xiàn)發(fā)送
function redis_queue_send($redis, $queue, $data, $delay = 0) {
$queue_waiting = 'redis-queue-waiting';
$queue_delay = 'redis-queue-delayed';
$now = time();
$package_str = json_encode([
'id' => rand(),
'time' => $now,
'delay' => 0,
'attempts' => 0,
'queue' => $queue,
'data' => $data
]);
if ($delay) {
return $redis->zAdd($queue_delay, $now + $delay, $package_str);
}
return $redis->lPush($queue_waiting.$queue, $package_str);
}
其中,參數(shù)$redis
為redis實例。例如redis擴展用法類似如下:
$redis = new Redis;
$redis->connect('127.0.0.1', 6379);
$queue = 'user-1';
$data= ['some', 'data'];
redis_queue_send($redis, $queue, $data);
這個是我原來的一個訂閱的。
$worker->onWorkerStart = function () {
$client = new Client('redis://127.0.0.1:6379');
$client->subscribe('sendmsg', function($data){
$Weixin = new Weixin();
$starttime = time();
foreach ($data as $k => $value){
$result = $Weixin->sendMsg($value);
var_dump($result);
}
$endtime = time();
echo $endtime-$starttime;
});
};
按照上面的說法,我需要發(fā)布10條訂閱嗎?,代碼如下
$worker->onWorkerStart = function () {
$client = new Client('redis://127.0.0.1:6379');
$client->subscribe('sendmsg', function($data){
$Weixin = new Weixin();
$starttime = time();
foreach ($data as $k => $value){
$result = $Weixin->sendMsg($value);
var_dump($result);
}
$endtime = time();
echo $endtime-$starttime;
});
$client->subscribe('sendmsg2', function($data){
$Weixin = new Weixin();
$starttime = time();
foreach ($data as $k => $value){
$result = $Weixin->sendMsg($value);
var_dump($result);
}
$endtime = time();
echo $endtime-$starttime;
});
};