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

PHP脚本提交POST请求时运行极慢,是什么原因?该如何优化?

PHP脚本优化方案

核心性能瓶颈

你脚本的耗时主要来自100次API请求串行执行,每次请求都要等待上一次返回才发起,叠加循环内大量重复执行的冗余操作,导致总耗时等于所有单次请求耗时的总和。

具体优化措施

  • 将循环内不变的操作全部外移:$email、$batch、时区设置、当前日期、API地址、请求头这些内容在整个循环中不会变化,移到循环外只执行1次即可,避免重复计算
  • 替换串行请求为cURL并发请求:使用curl_multi_*系列函数同时发起所有请求,总耗时仅和最慢的单次请求有关,100次请求通常可以压缩到2秒内完成
  • 改用json_encode()生成请求体:手动拼接JSON容易因为参数中的特殊字符(比如双引号、换行)导致请求格式错误,json_encode()会自动处理转义,性能也更优
  • 修复逻辑缺陷:原代码只会输出最后一次请求的HTTP状态码,优化后可以保留所有请求的返回结果

优化后示例代码

<?php
if (isset($_GET["email"], $_GET["batch"])) {
    // 循环外一次性初始化不变参数
    date_default_timezone_set('Asia/Shanghai'); // 不要用UTC+8这种写法,PHP官方推荐用时区标识符
    $bar = ['493038', '493014', '493762']; // 最多100个bar id
    $email = $_GET['email'];
    $batch = $_GET['batch'];
    $today = date("Y-m-d"); // 注意原代码写的Y-d-m是年-日-月格式,如果是笔误可以改成Y-m-d
    $url = "https://someapilink/api";
    $headers = [
        "Content-Type: application/json;charset=UTF-8",
        "Accept: application/json, text/plain, */*"
    ];
    $mh = curl_multi_init();
    $curlHandles = [];
    // 批量初始化所有curl句柄
    foreach ($bar as $barid) {
        $curl = curl_init($url);
        curl_setopt($curl, CURLOPT_POST, true);
        curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
        curl_setopt($curl, CURLOPT_HTTPHEADER, $headers);
        // 用json_encode生成请求体,自动转义特殊字符
        $data = json_encode([
            'email' => $email,
            'bar' => $barid,
            'batch' => $batch,
            'date' => $today
        ]);
        curl_setopt($curl, CURLOPT_POSTFIELDS, $data);
        curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, false);
        curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false);
        curl_multi_add_handle($mh, $curl);
        $curlHandles[] = $curl;
    }
    // 执行并发请求
    $running = null;
    do {
        curl_multi_exec($mh, $running);
        curl_multi_select($mh);
    } while ($running > 0);
    // 收集所有请求结果
    $httpCodes = [];
    foreach ($curlHandles as $index => $ch) {
        $result = curl_multi_getcontent($ch);
        $httpCodes[] = [
            'barid' => $bar[$index],
            'http_code' => curl_getinfo($ch, CURLINFO_HTTP_CODE),
            'result' => $result
        ];
        curl_multi_remove_handle($mh, $ch);
        curl_close($ch);
    }
    curl_multi_close($mh);
    // 输出结果,可根据需求调整
    echo "所有请求执行完成,状态码如下:<br>";
    foreach ($httpCodes as $item) {
        echo "barid: {$item['barid']},HTTP状态码:{$item['http_code']}<br>";
    }
}
?>

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 05:24:01