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

使用php-curl-class从多CURL请求收集指定错误码URL数组的问题

解决PHP Curl Multi请求中重复收集错误URL的问题

嘿,我来帮你拆解问题并给出修复方案!你的代码里几个逻辑问题导致了重复URL的出现,咱们一步步理清楚:

问题根源分析

  1. 重复添加URL:你在判断错误码后,同时用了$errors[] = $instance->url和array_push($errors, $instance->url)——这两行都会把当前URL插入数组,直接造成单次请求就重复添加一次。
  2. 无效的遍历操作:success回调是每个请求成功后单独触发的,你不需要在回调里遍历整个$out数组,这会导致之前处理过的请求被重复检查,进而重复插入URL。
  3. 变量引用与冗余逻辑:$out变量没有通过引用传递到回调里,而且其实你完全不需要维护这个数组来存储所有响应,直接处理当前请求的响应即可。

修复后的完整代码

require __DIR__ . '/vendor/autoload.php';
use \Curl\MultiCurl;

$curl_opts = [CURLOPT_VERBOSE => true];
$errors = [];

$multi_curl = new MultiCurl();

// 简化后的success回调逻辑
$multi_curl->success(function ($instance) use (&$errors) {
    $response = $instance->response;
    // 先确保response是对象且error属性存在
    if (isset($response->error) && $response->error == '2') {
        echo '检测到错误码2' . PHP_EOL;
        // 仅添加一次当前请求的URL
        $errors[] = $instance->url;
    }
});

// 设置CURL选项
foreach($curl_opts as $key => $value) {
    $multi_curl->setOpt($key, $value);
}

$multi_curl->complete(function($instance) {
    echo '请求完成' . PHP_EOL;
});

// 添加待请求的URL
$multi_curl->addGet('http://example.com');
$multi_curl->addGet('http://example2.com');
$multi_curl->addGet('http://example3.com');
$multi_curl->addGet('http://example4.com');

$multi_curl->setConcurrency(3);
$multi_curl->start();

// 所有请求完成后再打印最终的错误URL数组
print_r($errors);
// var_dump($multi_curl);

关键修改说明

  • 移除重复插入逻辑:删掉了array_push($errors, $instance->url),只保留$errors[] = $instance->url确保单次请求只添加一次URL。
  • 简化回调逻辑:直接处理当前请求的$instance->response,不再遍历所有已完成请求,避免重复检查导致的重复添加。
  • 修正变量引用:给$errors加上引用符号&,确保回调内的修改能同步到外部的数组;同时移除了不必要的$out和$con变量。
  • 调整打印时机:把print_r($errors)移到所有请求完成后(start()之后),这样你能看到最终完整的无重复错误URL数组,而不是每次回调都打印中间状态。

这样修改后,符合错误码条件的URL只会被添加一次,最终就能得到你期望的数组啦!

内容的提问来源于stack exchange,提问作者Richard

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 08:48:01