我需要创建一个函数,该函数返回 URL 是否可访问或有效。
我目前正在使用类似以下内容来确定有效的网址:
static public function urlExists($url)
{
$fp = @fopen($url, 'r');
if($fp)
{
return true;
}
return false;
}
似乎会有更快的东西,也许只是获取页面标题或其他东西。
您可以按如下方式使用curl:
$ch = curl_init($url);
curl_setopt($ch, CURLOPT_NOBODY, true); // set to HEAD request
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); // don't output the response
curl_exec($ch);
$valid = curl_getinfo($ch, CURLINFO_HTTP_CODE) == 200;
curl_close($ch);
您可以检查http状态代码。
您可以使用以下代码来检查 url 是否返回 2xx 或 3xx http 代码,以确保 url 有效。
<?php
$url = "http://stackoverflow.com/questions/1122845";
function urlOK($url)
{
$url_data = parse_url ($url);
if (!$url_data) return FALSE;
$errno="";
$errstr="";
$fp=0;
$fp=fsockopen($url_data['host'],80,$errno,$errstr,30);
if($fp===0) return FALSE;
$path ='';
if (isset( $url_data['path'])) $path .= $url_data['path'];
if (isset( $url_data['query'])) $path .= '?' .$url_data['query'];
$out="GET /$path HTTP/1.1\r\n";
$out.="Host: {$url_data['host']}\r\n";
$out.="Connection: Close\r\n\r\n";
fwrite($fp,$out);
$content=fgets($fp);
$code=trim(substr($content,9,4)); //get http code
fclose($fp);
// if http code is 2xx or 3xx url should work
return ($code[0] == 2 || $code[0] == 3) ? TRUE : FALSE;
}
echo $url;
if (urlOK($url)) echo " is a working URL";
else echo " is a bad URL";
?>
希望这有帮助!
您可能只能发送某种 HTTP 请求。然后您可以检查 HTTP 状态代码。
确保仅发送“HEAD”请求,这不会拉回所有内容。这应该足够了,而且足够轻。
我写这个是因为curl 不适合我,并且目标服务器正在为HEAD 请求发送403。 这里 wget 将尝试下载文件的前 24 个字节。
private function urlExists($url):bool
{
$command = 'wget '.$url.' -t 1 --header="Range: bytes=0-24" -q --directory-prefix "'.$this->tempDir.'"';
$res = [];
$resultCode = 1000; //any int other than 0
exec($command, $res, $resultCode);
return $resultCode === 0;
}