PHPでURLが実際に存在するか確認する で、いろいろ勉強したのでメモ

以下を参考にさせていただきました。

URLが実際に存在するかどうかを調べる方法(PHP) | PIXTURE STUDIO

function url_exists($url) {
  $header = @get_headers($url);
  if(preg_match('#^HTTP/.*\s+[200|302]+\s#i', $header[0])) {
    return true;
  }
  return false;
}

$urlには自宅サーバで運用しているWEBサイトのページURLを設定します。

 $url = 'http://subdomain.example.com/example.html';

が、しかし!
get_headersがfalseしか返しません。エラーが出ているということですね。

このトラブルの原因と解決方法を知りたい人は、記事の一番下の方まで一気に読み飛ばしてください。
途中の紆余曲折は「いろいろ勉強してためになった」というエピソードなので…。

上記のページに以下のような部分が記述されておりました。

PHPの初期設定ファイルであるphp.ini中で、allow_url_fopen=Offが設定されている場合は上記の関数は常にエラーとなりfalseを返してしまいます。

で、php.iniの設定を調べてみると・・・
まんまとallow_url_fopen=Offでした…。
デフォルトではOnらしいですが、なぜでしょう。

で、これを

ini_set("allow_url_fopen",1);

で変更できないか試たんですが、変わらず。

で、追跡調査をしてみると、allow_url_fopenはINI_ALLからINI_SYSTEMに変更されたんだとか。
私もよくわからないかったのですが、以下のページから抜粋すると・・・
PHP/patch/allow_url_fopenをINI_ALLに変更 – yohgaki's wiki

詳しいバージョンは忘れましたがPHP 4.3.xとPHP 5.0.xのリリースバージョンでphp.ini設定のallow_url_fopen設定がINI_ALL(スクリプト、ディレクトリ設定ファイル、サーバ設定ファイルのどれからも変更可能)からINI_SYSTEM(サーバ設定ファイルからのみ設定変更が可能)に変更されています。

ということらしいです。つまりはスクリプトからini_setで変更できないってことですね。

デフォルトで「On」ならば「On」に変更しちゃってもいいでしょう、という判断のもと、SSHで

 # vi /etc/php.ini
 
; allow_url_fopen=Off
allow_url_fopen=On

と変更しちゃいました。

が、しかし、問題解決できず。

phpinfo()のConfigurationを見ると、「Local Value」「Master Value」というのがありまして、php.iniで変更した値は、Master Valueの方に反映されているようです。

Directive Local Value Master Value
allow_url_fopen Off On

で、プログラムなどが参照する値はだいたいLocal Valueの方のようで・・・、つまりこれでもまだダメ。

Local Valueは.htaccessかhttpd.confなどで設定されているとのこと。
さんざん、調べて検索かけてみたけども、それらしき設定をしている箇所が見つからず。
もうあきらめかけていたところで、以下のページを発見。

Serversman@VPS Blueonyxでfile_get_contentsが使えない場合:運営ブログ|三ツ星トラフィックエクスチェンジ

実は使用しているサーバーはBlueQuartzの後継、BlueOnyx。
なので上記ページの内容がそのまま使えるのでは・・・、とトライしたところ、ビンゴ!

管理画面からお手軽にしっかり変更できちゃったのでした。
脱力。

では、ちゃんとURLが存在しているかどうかの確認ができたのかというと、実はこれでもできませんでした(笑)。
というのは、今回のトラブルの解決にphp.iniはまったく関係していなかったから…。

まず解決の糸口は…
別のWEBサイトのURLで試したところ、普通にtrueを返してきたこと。

では、そのWEBサイトURLと最初に試したURLの違いは何か。
サーバー自身(localhost)に存在するファイルか、別のサーバーに存在するファイルか。
この時点で答えがわかってしまった…。
hostsの設定…。

再度SSHでサーバーにログインして、hostsファイルを開きます。

 # vi /etc/hosts 

ローカルのIPアドレスと目的のURLのドメイン(サブドメイン)を追加。

 192.168 xxx xxx  subdomain.example.com 

はい、あっさりと解決しました。

今回、図らずも勉強できたこと

  • get_headers関数
  • ini_set関数
  • allow_url_fopenの役割
  • php.iniの設定変更とその内容
  • BlueOnyxの知らなかった管理項目
PHP, 備忘録 | , , , , , |