PHP関数 url_exists(), url_head()
2005年9月20日
PHPのfile_exists()はリモートファイルでは使えない。そこで、リモートファイル(現在の所、'http://xxx/xxx'のみ)で扱えるurl_exists()とurl_head()を作成した。
作っている途中で"if ( !@fopen($URL,'r') )"でエラートラップすることでURLが有効かどうか調べられることに気がついたが、その時点で殆ど完成していたので完成させてメモを取っておくことにした。
作っている途中で"if ( !@fopen($URL,'r') )"でエラートラップすることでURLが有効かどうか調べられることに気がついたが、その時点で殆ど完成していたので完成させてメモを取っておくことにした。
/////////////////////////////////////
// functions url_head & url_exists //
// ver 0.10 by katsumi //
/////////////////////////////////////
function url_head($myUrl,&$myStatus,&$myHeader){
//check URL and resolve host, port and URI
if (substr($myUrl,0,7)!='http://') return false;
$myUri=substr($myUrl,7);
if (($i=strpos($myUri,'/',0))===false) return false;
$myPort=80;
$myHost=substr($myUri,0,$i);
$j=strpos($myUri,':',0);
if ((!($j===false)) && ($j<$i))
{
$myPort=(int)substr($myUri,$j+1,$i-$j-1);
$myHost=substr($myUri,0,$j);
}
$myUri=substr($myUri,$i);
//get header information from browser
$headers = apache_request_headers();
while (list($header, $value) = each ($headers)) {
switch (strtolower($header)) {
case 'accept':
$accept=$value;
break;
case 'accept-language':
$acceptlanguage=$value;
break;
case 'user-agent':
$useragent=$value;
break;
default:
break;
}
}
//create header for HTTP request
$t="HEAD $myUri HTTP/1.0\r\n";
$t=$t."Conection: Close\r\n";
$t=$t."Accept: $accept\r\n";
$t=$t."Accept-Language: $acceptlanguage\r\n";
$t=$t."User-Agant: $useragent\r\n";
$t=$t."Host: $myHost\r\n";
$t=$t."\r\n";
//obtain HEAD information
$myStatus=0;
if (!($fp = @fsockopen($myHost,$myPort, $errno, $errstr, 30))) return false;
fwrite($fp,$t);
$t='';
while (!feof($fp))
{
$t=fgets($fp,1024);
if (substr($t,strlen($t)-2)=="\r\n") $t=substr($t,0,strlen($t)-2);
if (substr($t,0,5)=='HTTP/')
{ // "HTTP/1.1 200 OK" or something like this
if (($i=strpos($t,' ',0))===false) continue;
if (($j=strpos($t,' ',$i+1))===false) continue;
$myStatus=(int)substr($t,$i+1,$j-$i-1);
} else { // headers
if (($i=strpos($t,': ',0))===false) continue;
$myHeader[substr($t,0,$i)]=substr($t,$i+2);
}
}
fclose($fp);
if ($myStatus===0) return false;
if ($myStatus>=400) return false;
return true;
}
function url_exists($myUrl){
return url_head($myUrl,$myStatus,$myHeader);
}
// functions url_head & url_exists //
// ver 0.10 by katsumi //
/////////////////////////////////////
function url_head($myUrl,&$myStatus,&$myHeader){
//check URL and resolve host, port and URI
if (substr($myUrl,0,7)!='http://') return false;
$myUri=substr($myUrl,7);
if (($i=strpos($myUri,'/',0))===false) return false;
$myPort=80;
$myHost=substr($myUri,0,$i);
$j=strpos($myUri,':',0);
if ((!($j===false)) && ($j<$i))
{
$myPort=(int)substr($myUri,$j+1,$i-$j-1);
$myHost=substr($myUri,0,$j);
}
$myUri=substr($myUri,$i);
//get header information from browser
$headers = apache_request_headers();
while (list($header, $value) = each ($headers)) {
switch (strtolower($header)) {
case 'accept':
$accept=$value;
break;
case 'accept-language':
$acceptlanguage=$value;
break;
case 'user-agent':
$useragent=$value;
break;
default:
break;
}
}
//create header for HTTP request
$t="HEAD $myUri HTTP/1.0\r\n";
$t=$t."Conection: Close\r\n";
$t=$t."Accept: $accept\r\n";
$t=$t."Accept-Language: $acceptlanguage\r\n";
$t=$t."User-Agant: $useragent\r\n";
$t=$t."Host: $myHost\r\n";
$t=$t."\r\n";
//obtain HEAD information
$myStatus=0;
if (!($fp = @fsockopen($myHost,$myPort, $errno, $errstr, 30))) return false;
fwrite($fp,$t);
$t='';
while (!feof($fp))
{
$t=fgets($fp,1024);
if (substr($t,strlen($t)-2)=="\r\n") $t=substr($t,0,strlen($t)-2);
if (substr($t,0,5)=='HTTP/')
{ // "HTTP/1.1 200 OK" or something like this
if (($i=strpos($t,' ',0))===false) continue;
if (($j=strpos($t,' ',$i+1))===false) continue;
$myStatus=(int)substr($t,$i+1,$j-$i-1);
} else { // headers
if (($i=strpos($t,': ',0))===false) continue;
$myHeader[substr($t,0,$i)]=substr($t,$i+2);
}
}
fclose($fp);
if ($myStatus===0) return false;
if ($myStatus>=400) return false;
return true;
}
function url_exists($myUrl){
return url_head($myUrl,$myStatus,$myHeader);
}