You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.01 08:15:03