在PHP中,判断远程图片是否存在的需求是常见的,尤其是在实现图片预览功能时。通常,图片可能存储在不同的服务器上,我们需要在不直接下载图片的情况下,检查图片的链接是否有效。以下详细介绍了几种在PHP中判断远程图片是否存在方法的知识点。
方法一使用cURL检查远程图片是否存在:
```php
function file_exists($url) {
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_NOBODY, true); // 不需要下载图片内容
curl_setopt($ch, CURLOPT_FAILONERROR, true);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$response = curl_exec($ch);
curl_close($ch);
// 不管图片是否存在,方法一总是返回FALSE
return $response !== false;
}
```
这个方法利用了PHP的cURL库,通过设置CURLOPT_NOBODY为true,不下载任何内容,从而节省带宽和时间。方法一的问题在于,无论图片是否存在,总是返回FALSE。
方法二使用file_get_contents检查远程图片是否存在:
```php
function file_exists2($url) {
if (file_get_contents($url, false, null, 0, 1)) {
return 1;
} else {
return 0;
}
}
```
这个方法尝试读取远程图片的第1个字节,如果读取成功则返回1,否则返回0。但是这种方法在Linux系统下可能会出现问题,不论图片是否存在,总是返回TRUE。
方法三使用cURL检查远程图片是否存在(改进版):
```php
function file_exists($url) {
$curl = curl_init($url);
curl_setopt($curl, CURLOPT_NOBODY, true);
$result = curl_exec($curl);
$found = false;
if ($result !== false) {
// 再检查HTTP响应码是否为200
if (curl_getinfo($curl, CURLINFO_HTTP_CODE) == 200) {
$found = true;
}
}
curl_close($curl);
return $found;
}
```
这个改进的方法不仅使用了cURL,还检查了HTTP响应码是否为200,即HTTP OK,从而判断远程图片是否实际存在。
使用get_headers()方法存在效率问题,因此建议不使用该方法作为解决方案。
使用fsockopen()方法检查远程图片是否存在:
```php
$url = "***";
$info = parse_url($url);
$fp = fsockopen($info['host'], 80, $errno, $errstr, 30);
fputs($fp, "GET {$info['path']} HTTP/1.1\r\n");
fputs($fp, "Host: {$info['host']}\r\n");
fputs($fp, "Connection: close\r\n\r\n");
$headers = [];
while (!feof($fp)) {
$line = fgets($fp);
if ($line != "\r\n") {
$headers[] = $line;
} else {
break;
}
}
// 关闭socket
fclose($fp);
// 根据HTTP响应码判断文件是否存在
```
通过fsockopen()打开一个socket连接到远程服务器,并发送HTTP请求,然后读取响应头。通过响应头中的状态码判断远程图片是否存在,例如200或304表示存在,而302或301表示重定向,404表示不存在。
使用fopen()方法检查远程图片是否存在:
```php
$url = '***';
if (@fopen($url, 'r')) {
echo 'FileExists';
} else {
echo 'FileDoNotExits';
}
```
这个方法尝试以只读的方式打开远程文件,如果文件可以被打开,说明远程图片存在,否则不存在。使用fopen()方法是一个简便的方式,但它可能存在安全性问题,因此使用时需要加上@符号来抑制可能出现的警告和错误。
CURL方法检查远程图片是否存在:
```php
$url2 = '***';
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url2);
curl_setopt($ch, CURLOPT_HEADER, 1);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 10);
$contents = curl_exec($ch);
curl_close($ch);
// 根据响应内容判断文件是否存在
if (preg_match("/404/", $contents)) {
echo '文件不存在';
}
```
这个方法同样使用了PHP的cURL库。通过设置CURLOPT_RETURNTRANSFER为true,函数不会输出内容,而是返回,之后通过正则表达式匹配响应内容中是否包含404,来判断远程图片是否存在。需要注意的是,这种方法可能需要处理各种不同的HTTP状态码,不仅仅是404。
判断远程图片是否存在的方法有很多,每种方法都有其优缺点。通常,基于cURL的方法提供较为准确和灵活的判断方式,但在实际应用中需要根据不同的服务器环境和需求选择最合适的实现方法。