プログラミング

PHP関数 url_exists(), url_head()

2005年9月20日

 PHPのfile_exists()はリモートファイルでは使えない。そこで、リモートファイル(現在の所、'http://xxx/xxx'のみ)で扱えるurl_exists()とurl_head()を作成した。
 作っている途中で"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);
}

コメント

コメントはありません

コメント送信