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
相关产品推荐
相关产品推荐

