php 异步处理使用ignore_user_abort后导致数据库被锁

情况如下:
客户修改信息的时候要同时把数据同步到第三方,但是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这个方法
clipboard.png

然后作各种数据请求,处理,最后提交到第三方

结果如下:
clipboard.png

导致主线程中需要修改其他数据的时候被回滚了
clipboard.png

但是如果不做异步处理的话反倒一切正常,只是处理比较慢

请教各位大神这个如何解决,谢谢

阅读 1.5k
1 个回答

建议在服务器挂一个队列,不稳定的操作放到队列去处理。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题