PHPのget_file_contents()でWebサイトのソースを取得しようとしたらWarningが出て失敗する

投稿者: | 2017/11/10

PHPでネットから情報を拾うアプリを作ろうとしたところ、get_file_contents($url) のように書いたところで Warning が出た。

PHP Warning: file_get_contents(http://example.com): failed to open stream: no suitable wrapper could be found in /home/~~

調べてみると、php.ini の allow_url_fopen=OFF→ONに変更すれば良いとのことで変更してみたけれど解消せず。最終的には解消したものの、少しハマったので、同じように困っている人の参考になれば、と思いながら、情報共有します。

cPanelを使っているレンタルサーバーだと、同じ状況になるかもしれません。

 

まずは php.ini を修正

JETBOX で初めて cPanel を触ったので勝手がわかりにくかったのですが、「MultiPHP INI Editor」を開くと、サイトごとの php.ini を編集できるようなので、対象のディレクトリを選んで allow_url_fopen を 有効に。

結果は・・・変わらない。Home Directory だけでなく、念のため他のレベルの php.ini も変更してみたが、依然 Warning が出て動かず。

すべてのサイトで phpinfo() を実行して ini ファイルのパスを確認してみると、どのサイトも「/opt/cpanel/ea-php56/root/etc/php.ini」という同じパス。cpanel で仮想的に管理している ini ファイルを見に行っているらしい。

ここから課題は「get_file_contents()が動かない」から「php.ini が変更できない」に変わった。

JETBOY サポートに問い合わせ

cPanel 内部の問題のようなので、JETBOY サポートさんに丸投げしてみた。JETBOYのデフォルトの PHP バージョンが「PHP5.6(native)」なんだけど、このバージョンだと MultiPHP INI Editor が対応していないらしい。native ではない PHP5.6 以降なら対応しているので、PHP Selector から変更してほしいとのこと。

デフォルトで使えないって、ちょっと設計がイマイチ・・・?

PHP のバージョンを上げてみた

サポートさんに言われた通り、cPanel の「PHP Selector」からPHPのバージョンを変更した。PHP バージョンのリストから 7.1 を選んで「Set as current」をポチ。

phpinfo() をもう一度実行してみると、allow_url_fopen が有効になって、get_file_contents() が動いた!

せっかくだからブログのネタにしよう。エラーメッセージ取り直したかったので、MultiPHP INI Editor から allow_url_fopen を無効にして、get_file_contents() を実行したら・・・

エラーが出ない。

phpinfo() を見てみると、allow_url_fopen が有効のまま。

あれ???php.ini 変えたのに、反映されてない。

MultiPHP マネージャー を変更してみた

また JETBOY のサポートさんに聞いてみようかと思ったけれど、その前に自分で調べてみるかと、それっぽいところを探してみると、cPanel の「MultiPHP マネージャー」に違和感が。

各サイトの PHP バージョンが 5.6 のままになっていました。ホームディレクトリから7.1が継承されていないのかしら・・・。

左のチェックボックスにすべてチェックし、右にあるリストから「ea-php71」を選択して適用。

もう一度、MultiPHP INI Editor から allow_url_fopen を切り替えながら get_file_contents() を実行すると、想定通りに動くようになりました。

 

まとめ

MultiPHP の機能を使うときは、バージョンに要注意ですね。

cPanel は操作が簡単だけれど、思ってもみないところでトラブルに巻き込まれるもんなんですね。実体が見れないのって、もどかしいもんです。

 

参考になったら、下の「役に立った!」ボタンをクリックしてください!

コメントを残す

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください