PHP:file_get_contentsによるPHP実行が制限されている?

受付中

回答 1

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 6,679

snic518

score 37

PHPのスクリプト内からのHTTPリクエストによるPHP実行について、躓いたことがあったので書かせていただいています。

あるPHPファイルから、同じサーバー内の別のPHPファイルを、
フルパスでfile_get_contentsで呼び出して実行する時、取得できるPHPとそうでないPHPがありました。

//hoge.jp ドメイン内のindex.phpファイルから、同じサーバー内のa.phpとb.phpを実行
//問題ないファイル
echo file_get_contents("http://hoge.jp/a.php");

//Warning failed to open streamが発生するファイル
echo file_get_contents("http://hoge.jp/b.php");

上記実行で、下記のようなエラーログが出ます。

Warning: file_get_contents(http://hoge.jp/b.php): failed to open stream: HTTP request failed! in /var/www/html/index.php on line 6

このとき、a.phpはPHPとしての処理はするものの、基本的に実行の際にファイル出力を伴わないもので、
b.phpは同じサーバー内に何らかのファイル出力を伴うものでした。

//b.phpの中身の例
    $fp = fopen("b_text.html","w");
    fwrite($fp,"hugahuga");
    fclose($fp);

関係としては、index.phpがb.phpを実行し、b.phpが実行されるとb_text.htmlが出力される、というものになるのですが、file_get_contentsでb.phpを実行することが出来ないようなのです。

ちなみに、file_get_contentsだけでなく、cURLを利用してb.phpにアクセスしても同じ結果でした。

ですので、ファイル出力を伴うPHPファイルに対して、スクリプト内からのHTTPリクエストでの実行を許可していない、ということが正解なのかと思いましたが、
PHPの設定を見ても、どれがこれを制限しているのかわからなかったため、質問させていただきました。

allow_url_fopen    は Onです。
その他のphp.iniはあまり変更していません。

現在のPHPのエクステンションは下記です。

/etc/php.d/10-opcache.ini
/etc/php.d/20-bcmath.ini
/etc/php.d/20-bz2.ini
/etc/php.d/20-calendar.ini
/etc/php.d/20-ctype.ini
/etc/php.d/20-curl.ini
/etc/php.d/20-dom.ini
/etc/php.d/20-exif.ini
/etc/php.d/20-fileinfo.ini
/etc/php.d/20-ftp.ini
/etc/php.d/20-gd.ini
/etc/php.d/20-gettext.ini
/etc/php.d/20-gmp.ini
/etc/php.d/20-iconv.ini
/etc/php.d/20-json.ini
/etc/php.d/20-mbstring.ini
/etc/php.d/20-mcrypt.ini
/etc/php.d/20-mysqlnd.ini
/etc/php.d/20-pdo.ini
/etc/php.d/20-phar.ini
/etc/php.d/20-recode.ini
/etc/php.d/20-simplexml.ini
/etc/php.d/20-sockets.ini
/etc/php.d/20-sqlite3.ini
/etc/php.d/20-tidy.ini
/etc/php.d/20-tokenizer.ini
/etc/php.d/20-xml.ini
/etc/php.d/20-xmlwriter.ini
/etc/php.d/20-xsl.ini
/etc/php.d/30-mysqli.ini
/etc/php.d/30-pdo_mysql.ini
/etc/php.d/30-pdo_sqlite.ini
/etc/php.d/30-wddx.ini
/etc/php.d/30-xmlreader.ini
/etc/php.d/40-apcu.ini
/etc/php.d/40-zip.ini
/etc/php.d/50-apc.ini

※includeやrequireでやれ、という話かもしれませんが、b.phpは直接HTTPアクセスで実行されることもあるので、出来ればスクリプト内からのHTTPリクエストで実行できる形にしたいです。

よろしくお願いいたします。

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • CHERRY

    2016/02/03 18:06

    webサーバーのエラーログには何か出てないでしょうか?

    キャンセル

  • snic518

    2016/02/03 18:21

    Webサーバーのエラーログには、下記のような感じのWarningエラーが出ています。

    Warning: file_get_contents(http://hoge.jp/b.php): failed to open stream: HTTP request failed! in /var/www/html/index.php on line 6

    それ以外のエラーログは出ていませんでした。
    (b.php自体の実行エラーは無いです)

    キャンセル

回答 1

0

記載ミスだと思いますがb.phpを fwrite($fp,"hugahuga"); とし、全く同じファイルでmac上で実行できました。
file_get_contentsで出ているエラーは、ファイルが見つからないエラーですので、"http://hoge.jp/b.php"がHTTPでアクセスできないと思われます。ブラウザからアクセスして確認してみてください。
もしかしたらファイル名が違うか、apacheから見えない権限になっているのかもしれません。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/02/03 19:38

    ご指摘ありがとうございます。修正しました。

    b.phpは、単体でブラウザアクセスすると正常に動作します。
    別のスクリプトからの実行がどうやら出来ないらしいのです。

    すみません、apacheから見えない権限、というものを詳しく教えてくださいますでしょうか。
    ファイル権限はindex.phpもb.phpも、出力するファイルもどれも同じはずなのですが…。

    キャンセル

  • 2016/02/04 09:51

    ブラウザからアクセス出来るのなら権限は問題無いです。
    apacheユーザのみread権限が付与されていた場合にも記載されたエラーが出ますのでそれを確認するためにブラウザからのアクセス確認をお願いしました。file_get_contentsはスクリプト実行というよりHTTPリクエストの送信なのでブラウザと挙動が変わるとは思えないんですよね。。
    iniファイル上ではallow_url_fopenがOnだが、設定が反映されてないということはないでしょうか。
    そうでない場合Webサーバがどのようなエラーを返しているか、第三引数に innore_errors:trueを指定して確認してみてください。
    明確な回答ができなくすみません。

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 90.22%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

同じタグがついた質問を見る