如何使用PHP检查远程文件是否存在?
2022-08-30 07:44:28
我能找到的最好的,一个类型的东西,使页面加载非常慢。if
fclose
fopen
基本上,我试图做的是以下内容:我有一个网站列表,我想在它们旁边显示他们的图标。但是,如果一个网站没有,我想用另一个图像替换它,而不是显示一个损坏的图像。
我能找到的最好的,一个类型的东西,使页面加载非常慢。if
fclose
fopen
基本上,我试图做的是以下内容:我有一个网站列表,我想在它们旁边显示他们的图标。但是,如果一个网站没有,我想用另一个图像替换它,而不是显示一个损坏的图像。
您可以通过CURLOPT_NOBODY指示 curl 使用 HTTP HEAD 方法。
或多或少
$ch = curl_init("http://www.example.com/favicon.ico");
curl_setopt($ch, CURLOPT_NOBODY, true);
curl_exec($ch);
$retcode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
// $retcode >= 400 -> not found, $retcode = 200, found.
curl_close($ch);
无论如何,您只节省了HTTP传输的成本,而不是TCP连接建立和关闭。而且作为小图标,你可能看不到太大的改善。
如果结果太慢,则在本地缓存结果似乎是一个好主意。HEAD 检查文件的时间,并在标头中返回该文件。您可以像浏览器一样操作并获取图标的CURLINFO_FILETIME。在缓存中,您可以将URL = > [图标,时间戳]。然后,您可以比较时间戳并重新加载图标。
正如Pies所说,你可以使用cURL。你可以让 cURL 只给你标题,而不是正文,这可能会让它更快。错误的域可能总是需要一段时间,因为您将等待请求超时;您可以使用 cURL 更改超时长度。
下面是一个示例:
function remoteFileExists($url) {
$curl = curl_init($url);
//don't fetch the actual page, you only want to check the connection is ok
curl_setopt($curl, CURLOPT_NOBODY, true);
//do request
$result = curl_exec($curl);
$ret = false;
//if request did not fail
if ($result !== false) {
//if request was ok, check response code
$statusCode = curl_getinfo($curl, CURLINFO_HTTP_CODE);
if ($statusCode == 200) {
$ret = true;
}
}
curl_close($curl);
return $ret;
}
$exists = remoteFileExists('http://stackoverflow.com/favicon.ico');
if ($exists) {
echo 'file exists';
} else {
echo 'file does not exist';
}