首先说一下我的应用场景。
目的是借助微信压缩视频,当用户给公众号发送视频后,服务器下载并保存视频,这个处理过程可以会超过5s。
微信服务器在五秒内收不到响应会断掉连接,并且重新发起请求,总共重试三次,如果在调试中,发现用户无法收到响应的消息,可以检查是否消息处理超时。
关于重试的消息排重,有msgid的消息推荐使用msgid排重。事件类型消息推荐使用FromUserName + CreateTime 排重。
------------摘自微信公众平台开发者
所以我的服务器会收到微信服务器发来的重复请求,视频也重复下载。
简单的解决办法
收到消息,检测msgid是否在Redis中,不存在把msgid存入Redis同时下载视频,存在不处理。
//msgid未写入
if (!$this->redis()->get('msgid_' . $msgid)) {
$this->redis()->setex('msgid_' . $msgid, 15, $msgid);
$this->downVideo($openid);//下载视频
}
private function redis()
{
$redis = new \Redis();
$redis->connect('127.0.0.1, '6379');
$redis->auth('yourpassword');
$redis->select(6);
return $redis;
}
网友评论