前两天公司开发微信上传图片时(使用的thinkphp框架),老是出现没有响应的问题,最终经过查错,发现问题出在我们的服务器在抓取上传的图片时会出现超时的现象,而微信服务器在5s左右接收不到响应就会断开链接,所以导致上传图片没有响应,因此,我将图片抓取的处理重新写到了Test分组中的Async控制器中,为AsyncAction.class.php
class AsyncAction extends Action(){
public function saveImg(){
set_time_limit(0);
ignore_user_abort();//以上两行代码保证微信服务器在断开连接后依然可以继续执行
$url=$_GET['url'];//图片路径
//图片存储等操作******
}
}
在处理微信响应的程序中则可以这样处理,先定义一个异步处理函数,触发上述类中的操作后即断开
//异步调用后台任务
private function async($url,$data){
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch,CURLOPT_TIMEOUT,1);//注意:此处设置1s即断开连接
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_POST,1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
$res=curl_exec($ch);
curl_close($ch);
return $res;
}
则在处理微信服务器的回复时可以先:
$url=***************;//通过微信服务器推送的图片地址 根据自己的业务逻辑可以获取
$async_url=U('Test/Async/saveImg');
$this->async($async_url,array('url'=>$url));//异步存储图片 仅有1s的延迟 不会造成下一句无法执行
$this->response();//回复微信服务器
这种方式可以避免因为复杂操作导致超时,但是异步操作以后也将无法返回异步操作的结果