本文旨在解决php脚本在循环检查多个远程文件链接时遇到的`err_connection_reset`问题。通过分析传统`get_headers`方法的局限性,我们提出并详细演示了如何利用php的curl多请求功能(`curl_multi_*`)实现高效、并行且健壮的链接状态检查,从而避免连接重置错误,并显著提升脚本性能。
在开发PHP脚本以检查远程服务器上文件的存在性时,开发者常会遇到一个常见但棘手的问题:当脚本尝试连续检查大量URL时,可能会收到ERR_CONNECTION_RESET错误,甚至导致后续无法通过浏览器访问这些链接。即使引入sleep()函数进行延迟,也往往无法彻底解决问题。这通常是由于服务器端的连接限制、防火墙规则或客户端在短时间内发起了过多同步请求,导致服务器主动断开连接。
原始问题中使用的get_headers()函数,虽然在检查单个URL时非常方便,但其本质是一个同步阻塞操作。这意味着每次请求都会等待服务器响应,然后才能发起下一个请求。当脚本在短时间内对同一服务器发起大量此类请求时,可能会触发以下问题:
为了克服get_headers()的局限性,PHP的cURL扩展提供了一套强大的多请求(curl_multi_*)API,允许开发者并行处理多个HTTP请求。这种方式具有以下显著优势:
资源优化: cURL多请求可以在一定程度上复用连接,减少了连接建立和关闭的开销。使用cURL多请求处理多个URL的基本步骤如下:
以下是使用cURL多请求并行检查多个文件URL的示例代码:
0; $x--) {
// 构建文件URL
$combinedUrl = 'http://update.example.com/Files/Updates/6.' . $revisionNumber . '.' . $minorNumber . '.' . $x . '/application7_' . $revisionNumber . '_' . $minorNumber . '_' . $x . '_de_FullInstallerx64.exe';
// 初始化单个cURL句柄
$curl = curl_init();
// 设置URL
curl_setopt($curl, CURLOPT_URL, $combinedUrl);
// 获取文件时间(可选)
curl_setopt($curl, CURLOPT_FILETIME, true);
// 只发送HEAD请求,不下载内容,高效检查文件存在性
curl_setopt($curl, CURLOPT_NOBODY, true);
// 将响应作为字符串返回,而不是直接输出
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
// 包含响应头信息
curl_setopt($curl, CURLOPT_HEADER, true);
// 设置连接超时和请求超时,防止长时间等待
curl_setopt($curl, CURLOPT_CONNECTTIMEOUT, 5); // 连接超时5秒
curl_setopt($curl, CURLOPT_TIMEOUT, 10); // 总请求超时10秒
// 将单个cURL句柄添加到多请求句柄中
curl_multi_add_handle($multiCurl, $curl);
// 存储句柄及其关联的build号,以便后续处理
$curlHandles[] = ['curl' => $curl, 'build' => $x];
}
// 执行所有cURL请求直到完成
$stillRunning = null;
do {
// 循环执行cURL请求,直到所有请求都处理完毕
// curl_multi_exec是非阻塞的,会处理所有可用的请求
$mrc = curl_multi_exec($multiCurl, $stillRunning);
} while ($stillRunning > 0 && $mrc == CURLM_OK); // 确保没有错误发生
// 遍历所有句柄,处理请求结果
foreach ($curlHandles as $item) {
$curl = $item['curl'];
$build = $item['build'];
file_put_contents('log.txt', "Checking Build: " . $build . "\n", FILE_APPEND);
// 获取HTTP状态码
$httpCode = curl_getinfo($curl, CURLINFO_HTTP_CODE);
// 获取实际请求的URL
$effectiveUrl = curl_getinfo($curl, CURLINFO_EFFECTIVE_URL);
if ($httpCode === 404) {
// HTTP 404 Not Found 表示文件不存在
$exists = "no";
file_put_contents('log.txt', $effectiveUrl . " - " . "does not exist. \n", FILE_APPEND);
} else if ($httpCode >= 200 && $httpCode < 300) {
// HTTP 2xx 状态码表示请求成功,文件存在
$exists = "yes";
file_put_contents('log.txt', $effectiveUrl . " - " . "exists. \n", FILE_APPEND);
} else {
// 其他状态码,例如 5xx 服务器错误,或者连接失败等
$exists = "unknown";
file_put_contents('log.txt', $effectiveUrl . " - " . "status: " . $httpCode . " (could not verify existence). \n", FILE_APPEND);
}
// 从多请求句柄中移除当前cURL句柄并关闭它
curl_multi_remove_handle($multiCurl, $curl);
curl_close($curl); // 显式关闭单个cURL句柄
}
// 关闭cURL多请求句柄
curl_multi_close($multiCurl);
}
// 调用函数执行检查
// checkAllUrls(); // 在实际应用中调用此函数当PHP脚本需要高效、健壮地检查大量远程链接时,get_headers()等同步方法因其效率低下和容易触发服务器端限制而不再适用。通过采用PHP的cURL多请求机制,开发者可以实现请求的并行处理,显著提升脚本性能,有效避免ERR_CONNECTION_RESET等连接问题,并对请求过程拥有更细粒度的控制。理解并正确运用curl_multi_*函数是构建高性能网络请求处理脚本的关键。
# php
# 防火墙
# 浏览器
# app
# curl
# dns
# cdn
# 状态码
# 资源优化
# 网络问题
# 并发请求
# php脚本
相关文章:
建站之星24小时客服电话如何获取?
如何用腾讯建站主机快速创建免费网站?
已有域名和空间如何快速搭建网站?
魔方云NAT建站如何实现端口转发?
攀枝花网站建设,攀枝花营业执照网上怎么年审?
网站制作和推广的区别,想自己建立一个网站做推广,有什么快捷方法马上做好一个网站?
南京网站制作费用,南京远驱官方网站?
网站制作说明怎么写,简述网页设计的流程并说明原因?
建站之星后台搭建步骤解析:模板选择与产品管理实操指南
装修招标网站设计制作流程,装修招标流程?
建站之星安装路径如何正确选择及配置?
如何快速上传建站程序避免常见错误?
网站制作公司排行榜,四大门户网站排名?
制作营销网站公司,淘特是干什么用的?
如何解决VPS建站LNMP环境配置常见问题?
建站VPS配置与SEO优化指南:关键词排名提升策略
公司网站设计制作厂家,怎么创建自己的一个网站?
专业公司网站制作公司,用什么语言做企业网站比较好?
网站规划与制作是什么,电子商务网站系统规划的内容及步骤是什么?
如何在Golang中使用encoding/gob序列化对象_存储和传输数据
企业宣传片制作网站有哪些,传媒公司怎么找企业宣传片项目?
建站之星后台密码遗忘如何找回?
微课制作网站有哪些,微课网怎么进?
已有域名能否直接搭建网站?
,如何利用word制作宣传手册?
Python lxml的etree和ElementTree有什么区别
网站制作多少钱一个,建一个论坛网站大约需要多少钱?
如何选择高效响应式自助建站源码系统?
小捣蛋自助建站系统:数据分析与安全设置双核驱动网站优化
如何做静态网页,sublimetext3.0制作静态网页?
如何在Tomcat中配置并部署网站项目?
家庭服务器如何搭建个人网站?
建站之星客服服务时间及联系方式如何?
建站VPS推荐:2025年高性能服务器配置指南
如何快速选择适合个人网站的云服务器配置?
如何在IIS服务器上快速部署高效网站?
建站之星后台管理系统如何操作?
常州企业网站制作公司,全国继续教育网怎么登录?
网站制作网站,深圳做网站哪家比较好?
如何用y主机助手快速搭建网站?
建站之星安装后界面空白如何解决?
大连网站制作费用,大连新青年网站,五年四班里的视频怎样下载啊?
相册网站制作软件,图片上的网址怎么复制?
网站制作大概要多少钱一个,做一个平台网站大概多少钱?
建站之星免费模板:自助建站系统与智能响应式一键生成
定制建站价位费用解析与套餐推荐全攻略
建站之星代理平台如何选择最佳方案?
实现点击下箭头变上箭头来回切换的两种方法【推荐】
红河网站制作公司,红河事业单位身份证如何上传?
如何制作公司的网站链接,公司想做一个网站,一般需要花多少钱?
*请认真填写需求信息,我们会在24小时内与您取得联系。