以下を参考にさせていただきました。
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の知らなかった管理項目