PHP中如何实现异步SOAP请求?CodeIgniter框架下的实践问题
PHP多SOAP请求耗时过高优化方案(适配CodeIgniter)
最优低成本方案:cURL并行请求(零额外依赖)
你当前耗时高的核心原因是18个请求串行执行,总耗时是所有请求耗时之和。用curl_multi系列函数可实现多请求并行执行,总耗时仅等于最慢的单个请求耗时,改造成本极低,不需要额外扩展支持,适配所有PHP环境。
改造后示例代码:
// 1. 整理所有SOAP请求的XML数据到数组 $soapXmlList = [ $xml_data1, $xml_data2, // 剩余16个请求的XML依次填入 ]; $targetUrl = 'example_URL'; $multiHandle = curl_multi_init(); $curlHandleList = []; // 2. 批量初始化curl句柄 foreach ($soapXmlList as $key => $xml) { $ch = curl_init($targetUrl); curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: text/xml']); curl_setopt($ch, CURLOPT_POST, 1); curl_setopt($ch, CURLOPT_POSTFIELDS, $xml); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); curl_setopt($ch, CURLOPT_TIMEOUT, 30); // 单请求超时限制,避免卡主整体流程 curl_multi_add_handle($multiHandle, $ch); $curlHandleList[$key] = $ch; } // 3. 执行并行请求 $running = null; do { $execStatus = curl_multi_exec($multiHandle, $running); if ($execStatus > CURLM_OK) { break; } // 避免CPU空转,等待有响应再继续执行 curl_multi_select($multiHandle); } while ($running > 0 && $execStatus === CURLM_OK); // 4. 批量获取响应内容 $responseList = []; foreach ($curlHandleList as $key => $ch) { $responseList[$key] = curl_multi_getcontent($ch); curl_multi_remove_handle($multiHandle, $ch); curl_close($ch); } curl_multi_close($multiHandle); // 后续你原有处理每个请求返回值的逻辑,对应取$responseList里的内容即可 return view("Simulation/step2");
可选方案:异步队列(适合不需要实时返回结果的场景)
如果SOAP请求的结果不需要在当前页面实时展示给用户,可以用异步队列彻底解耦,用户请求无需等待SOAP执行完成:
- 在数据库新建任务表,存储所有SOAP请求参数,标记为待处理状态
- 基于CodeIgniter的CLI命令行功能写消费脚本,后台常驻运行处理任务,执行SOAP请求后更新任务状态
- 当前接口写完任务数据后直接返回视图,前端可通过轮询接口查询任务处理状态和结果
其他注意事项
- 若对方SOAP服务有并发限制,可调整为分批并行,比如每次同时发3-5个请求,分多批次执行,效率仍远高于串行
- 重复请求的SOAP结果可以做缓存,下次无需重复发请求,进一步降低耗时
- 生产环境务必给每个请求加超时限制,避免单个请求异常拖垮整个流程
内容的提问来源于stack exchange,提问作者potato
相关产品推荐
相关产品推荐

