PHP爬虫本地请求API正常 共享主机返回internal server error如何解决
错误定位方法
首先你当前没有捕获具体错误信息,先按以下步骤拿到准确报错原因:
- 开启PHP全量错误日志:在代码最顶部加入以下配置,指定错误日志写入到当前目录的独立文件,避免共享主机默认日志路径不可读
error_reporting(E_ALL); ini_set('display_errors', 1); ini_set('log_errors', 1); ini_set('error_log', __DIR__ . '/php_spider_error.log'); - 补充Curl请求错误判断:当前代码没有捕获Curl执行异常和接口返回状态,在
curl_exec后追加判断逻辑$data = curl_exec($curl); // 捕获Curl执行错误 if(curl_errno($curl)){ $err_log = date('Y-m-d H:i:s') . " 股票ID{$n}请求错误:" . curl_error($curl) . PHP_EOL; file_put_contents(__DIR__ . '/curl_error.log', $err_log, FILE_APPEND); } // 捕获接口非200状态码 $http_code = curl_getinfo($curl, CURLINFO_HTTP_CODE); if($http_code !== 200){ $err_log = date('Y-m-d H:i:s') . " 股票ID{$n}返回状态码:{$http_code}" . PHP_EOL; file_put_contents(__DIR__ . '/curl_error.log', $err_log, FILE_APPEND); } - 排查共享主机隐性限制:90%以上的共享主机会限制出站请求频率、并发数、单进程总请求数,连续发起600次外部接口调用大概率会触发主机商的WAF或限流规则,直接中断进程返回500错误,这也是本地运行正常但线上报错的核心常见原因。
- 排查内存/执行时间溢出:虽然php.ini配置了较高的执行时间和内存限制,但多数共享主机的FPM、Apache/Nginx会单独配置进程最大生命周期、输出大小限制,不受php.ini配置覆盖,连续请求积累的内存占用、过大的页面输出都可能触发进程被强制终止。
解决方案
根据常见触发原因,可按优先级尝试以下修复方案:
- 新增请求间隔规避限流:每次请求结束后增加0.5-1秒的等待时间,既规避共享主机出站限流,也避免给API服务端造成压力,在
curl_close后加一行:sleep(1); // 可调整为usleep(500000) 即间隔500毫秒 - 复用Curl连接降低资源消耗:避免每次循环初始化/销毁Curl资源,减少内存和连接开销:
// 循环外初始化Curl $curl = curl_init(); curl_setopt($curl, CURLOPT_USERAGENT, 'Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:47.0) Gecko/20100101 Firefox/47.0'); curl_setopt($curl, CURLOPT_RETURNTRANSFER, true); curl_setopt($curl, CURLOPT_ENCODING, "gzip"); curl_setopt($curl, CURLOPT_TIMEOUT, 60); curl_setopt($curl, CURLOPT_IPRESOLVE, CURL_IPRESOLVE_V4); foreach ($namads as $namex => $n) { curl_setopt($curl, CURLOPT_URL, 'http://members.tsetmc.com/tsev2/data/InstTradeHistory.aspx?i=' . $n . '&Top=400&A=1' ); $data = curl_exec($curl); // 错误判断、数据处理逻辑 print_r($data); echo "<br>"; // 重置Curl配置,避免上一次请求的参数残留 curl_reset($curl); sleep(1); } curl_close($curl); - 分批处理+结果落盘:不要一次性跑完全部600个请求,每次跑30-50个就记录进度,下次继续执行;同时不要直接把所有结果输出到浏览器,改为写入到本地CSV/文本文件,避免触发响应大小限制。
- 确认主机规则:如果以上调整都无效,可以联系共享主机服务商确认出站请求的限制规则,若确实是规则拦截,可升级到无出站限制的VPS/云主机。
内容的提问来源于stack exchange,提问作者TheVVVil
相关产品推荐
相关产品推荐

