

新闻资讯
技术学院在共享主机环境下,php 脚本通过 curl 在循环中连续发起多个耗时请求时,总执行时间会累加并触发 `max_execution_time` 限制(如 120 秒),即使每次请求独立完成——根本原因在于 php 脚本的**整体生命周期未中断**,而非请求本身被“合并”。
你遇到的 Fatal error: Maximum execution time of 120 seconds exceeded 并非由 cURL 超时引起,而是 PHP 解释器自身执行时间超限。你的循环中两次请求分别耗时 32s 和 50s,已累计 82s;若后续还有其他逻辑或网络波动导致延迟,极易突破 120 秒硬性上限——而共享主机通常禁止修改 max_execution_time,因此必须从控制脚本节奏和优化请求模式入手。
仅靠 sleep(1)(如答案所提)虽能轻微缓解服务端限流,但对解决 PHP 总执行超时问题效果有限——1 秒延迟无法显著降低累计耗时。真正有效的策略是:
以下是优化后的安全循环示例:
for ($i = 0; $i <= 200; $i += 100) {
$postData = [
'start' => $i,
'end' => $i + 100
];
$ch = curl_init('https://your-server.com/endpoint');
curl_setopt_array($ch, [
CURLOPT_POST => true,
CURLOPT_RETURNTRANSFER => true,
CURLOPT_TIMEOUT => 45, // ⚠️ 关键:强制单次请求最多等 45 秒
CURLOPT_CONNECTTIMEOUT => 10, // 连接超时设为 10 秒
CURLOPT_HTTPHEADER => ['Content-Type: application/json'],
CURLOPT_POSTFIELDS => json_encode($postData)
]);
$response = curl_exec($ch);
$httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
curl_close($ch);
if ($response === false) {
$error = curl_error($ch);
error_log("cURL failed at offset {$i}: {$error}");
echo "Request {$i} failed.\n";
continue;
}
// 可选:每轮后休眠 2–5 秒,减轻目标服务器压力(尤其面对无速率限制的共享环境)
usleep(2000000); // 等待 2 秒(比 sleep(1) 更精细)
echo "Batch [{$i}, " . ($i + 100) . "] c
ompleted. HTTP {$httpCode}\n";
}总之,PHP 循环中的多次 cURL 请求会线性累加执行时间,这是语言运行机制决定的,无法绕过。唯一稳健路径是:设限(cURL timeout)、降频(pause)、分流(异步化)。