情况如下:
客户修改信息的时候要同时把数据同步到第三方,但是api接口处理数据速度比较慢,为了保证客户体验所以使用了fwrite方法做异步处理
异步处理
//异步提交工单
public function postToCrm($order_id){
$fp = fsockopen('localhost',80);
if(!$fp){
// echo 1;
}else{
$param = array(
'id' => $order_id,
);
$data = http_build_query($param);
$out = "POST /cel/index.php/admin/Async/setCrmOrder HTTP/1.1\r\n"; //模拟POST请求
$out .= "Host: localhost\r\n";
$out .= "Content-Type: application/x-www-form-urlencoded\r\n";//POST数据
$out .= "Content-Length: ". strlen($data) ."\r\n";//POST数据的长度
$out.="Connection: Close\r\n\r\n";//长连接关闭
$out .= $data; //传递POST数据
stream_set_blocking($fp,true);
stream_set_timeout($fp,1);
fwrite($fp, $out);
// usleep(1000);
fclose($fp);
}
}
这是异步处理时用到ignore_user_abort这个方法
然后作各种数据请求,处理,最后提交到第三方
结果如下:
导致主线程中需要修改其他数据的时候被回滚了
但是如果不做异步处理的话反倒一切正常,只是处理比较慢
请教各位大神这个如何解决,谢谢
建议在服务器挂一个队列,不稳定的操作放到队列去处理。