如何提升PHP页面性能?现有PHP代码GET请求加载耗时10秒
我来帮你拆解下代码慢的原因,一步步优化——既然你说代理本身速度快,直播链接加载只要1秒,那瓶颈肯定出在PHP处理文件和请求的方式上。下面是具体的优化方案:
1. 简化info.txt读取逻辑,去掉冗余操作
原代码把文件每一行存入数组再extract,完全是多余的操作,而且用@屏蔽错误会导致文件读取失败时静默卡壳。我们直接读取并过滤有效行:
// 读取文件时自动忽略换行符和空行,去掉@以便捕获错误 $lines = file("info.txt", FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES); if (!$lines || count($lines) < 2) { die("无法从info.txt读取代理或Cookie配置"); } // 直接取对应行,不用循环和extract $proxy = $lines[0]; $sessionCookie = $lines[1];
2. 优化HTTP请求配置,设置超时避免阻塞
file_get_contents默认没有设置合理的超时,很容易因为请求卡住拖慢整个流程。我们为单个请求创建上下文,而非全局设置,同时添加连接和读取超时:
$n = str_replace("/num?", "", $_SERVER['REQUEST_URI']); $apiUrl = "http://**********/$n"; // 创建请求上下文,配置超时和代理 $context = stream_context_create([ 'http' => [ 'proxy' => $proxy, 'request_fulluri' => true, 'header' => [ "Cookie: PHPSESSID=$sessionCookie", "Connection: close" // 关闭长连接,减少等待时间 ], 'connect_timeout' => 1, // 连接代理超时1秒 'timeout' => 3, // 总请求超时3秒 'ignore_errors' => true, // 允许获取错误状态码的响应 'protocol_version' => 1.1 // 使用HTTP/1.1提升效率 ] ]); // 获取API数据,检查返回值避免后续错误 $data = file_get_contents($apiUrl, false, $context); if (!$data) { die("API请求失败"); }
3. 去掉不必要的数组操作,减少内存开销
原代码用$url[$n]这类带索引的数组完全没必要,因为每次请求只处理一个$n,直接用普通变量即可:
// 解码JSON并检查有效性 $values = json_decode($data, true); if (!is_array($values) || !isset($values['results']['otherurl'])) { die("API返回格式错误"); } // 跳转并立即终止脚本,避免多余执行 $redirectUrl = $values['results']['otherurl']; header("Location: " . $redirectUrl); exit;
4. 进阶:用CURL替代file_get_contents(性能更优)
CURL比file_get_contents更灵活,错误处理更完善,性能也更好,适合HTTP请求场景:
$ch = curl_init($apiUrl); curl_setopt_array($ch, [ CURLOPT_PROXY => $proxy, CURLOPT_HTTPHEADER => ["Cookie: PHPSESSID=$sessionCookie"], CURLOPT_CONNECTTIMEOUT => 1, CURLOPT_TIMEOUT => 3, CURLOPT_RETURNTRANSFER => true, CURLOPT_FOLLOWLOCATION => false, // 如果目标是HTTPS,根据实际情况调整SSL验证 CURLOPT_SSL_VERIFYPEER => false, CURLOPT_SSL_VERIFYHOST => false ]); $data = curl_exec($ch); $httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE); // 检查请求是否成功 if ($data === false || $httpCode !== 200) { die("API请求失败: " . curl_error($ch)); } curl_close($ch); // 后续JSON解码和跳转逻辑同上
额外优化建议
- 缓存配置文件:如果info.txt里的代理和Cookie不经常变化,用APCu缓存配置(有效期1小时),避免每次请求都读文件:
if (apcu_exists('proxy_config')) { $config = apcu_fetch('proxy_config'); $proxy = $config['proxy']; $sessionCookie = $config['cookie']; } else { // 读取info.txt的逻辑... apcu_store('proxy_config', ['proxy' => $proxy, 'cookie' => $sessionCookie], 3600); } - 开启OPcache:在php.ini中启用OPcache,缓存编译后的PHP代码,减少每次请求的编译开销。
- 检查代理格式:确保代理地址是正确的格式(如
http://ip:port),格式错误会导致连接超时。
完整优化后的代码示例(用CURL版本)
<?php // 读取或缓存代理配置 if (apcu_exists('proxy_config')) { $config = apcu_fetch('proxy_config'); $proxy = $config['proxy']; $sessionCookie = $config['cookie']; } else { $lines = file("info.txt", FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES); if (!$lines || count($lines) < 2) { die("无法读取代理配置"); } $proxy = $lines[0]; $sessionCookie = $lines[1]; apcu_store('proxy_config', ['proxy' => $proxy, 'cookie' => $sessionCookie], 3600); } // 处理请求参数 $n = str_replace("/num?", "", $_SERVER['REQUEST_URI']); $apiUrl = "http://**********/$n"; // CURL请求API $ch = curl_init($apiUrl); curl_setopt_array($ch, [ CURLOPT_PROXY => $proxy, CURLOPT_HTTPHEADER => ["Cookie: PHPSESSID=$sessionCookie"], CURLOPT_CONNECTTIMEOUT => 1, CURLOPT_TIMEOUT => 3, CURLOPT_RETURNTRANSFER => true, CURLOPT_FOLLOWLOCATION => false, CURLOPT_SSL_VERIFYPEER => false, CURLOPT_SSL_VERIFYHOST => false ]); $data = curl_exec($ch); $httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE); if ($data === false || $httpCode !== 200) { die("API请求失败: " . curl_error($ch)); } curl_close($ch); // 解码并跳转 $values = json_decode($data, true); if (!is_array($values) || !isset($values['results']['otherurl'])) { die("无效的API响应"); } header("Location: " . $values['results']['otherurl']); exit; ?>
内容的提问来源于stack exchange,提问作者waylan
相关产品推荐
相关产品推荐

