質問をすることでしか得られない、回答やアドバイスがある。

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

新規登録して質問してみよう
ただいま回答率
85.48%
PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Q&A

1回答

16637閲覧

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

snic518

総合スコア39

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

0グッド

0クリップ

投稿2016/02/03 08:51

編集2016/02/03 10:36

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

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

PHP

1//hoge.jp ドメイン内のindex.phpファイルから、同じサーバー内のa.phpとb.phpを実行 2//問題ないファイル 3echo file_get_contents("http://hoge.jp/a.php"); 4 5//Warning failed to open streamが発生するファイル 6echo file_get_contents("http://hoge.jp/b.php");

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

apache

1Warning: 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は同じサーバー内に何らかのファイル出力を伴うものでした。

PHP

1//b.phpの中身の例 2 $fp = fopen("b_text.html","w"); 3 fwrite($fp,"hugahuga"); 4 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のエクステンションは下記です。

php

1/etc/php.d/10-opcache.ini 2/etc/php.d/20-bcmath.ini 3/etc/php.d/20-bz2.ini 4/etc/php.d/20-calendar.ini 5/etc/php.d/20-ctype.ini 6/etc/php.d/20-curl.ini 7/etc/php.d/20-dom.ini 8/etc/php.d/20-exif.ini 9/etc/php.d/20-fileinfo.ini 10/etc/php.d/20-ftp.ini 11/etc/php.d/20-gd.ini 12/etc/php.d/20-gettext.ini 13/etc/php.d/20-gmp.ini 14/etc/php.d/20-iconv.ini 15/etc/php.d/20-json.ini 16/etc/php.d/20-mbstring.ini 17/etc/php.d/20-mcrypt.ini 18/etc/php.d/20-mysqlnd.ini 19/etc/php.d/20-pdo.ini 20/etc/php.d/20-phar.ini 21/etc/php.d/20-recode.ini 22/etc/php.d/20-simplexml.ini 23/etc/php.d/20-sockets.ini 24/etc/php.d/20-sqlite3.ini 25/etc/php.d/20-tidy.ini 26/etc/php.d/20-tokenizer.ini 27/etc/php.d/20-xml.ini 28/etc/php.d/20-xmlwriter.ini 29/etc/php.d/20-xsl.ini 30/etc/php.d/30-mysqli.ini 31/etc/php.d/30-pdo_mysql.ini 32/etc/php.d/30-pdo_sqlite.ini 33/etc/php.d/30-wddx.ini 34/etc/php.d/30-xmlreader.ini 35/etc/php.d/40-apcu.ini 36/etc/php.d/40-zip.ini 37/etc/php.d/50-apc.ini

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

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

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

CHERRY

2016/02/03 09:06

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

2016/02/03 09: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自体の実行エラーは無いです)
guest

回答1

0

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

投稿2016/02/03 10:27

orangina

総合スコア10

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

snic518

2016/02/03 10:38

ご指摘ありがとうございます。修正しました。 b.phpは、単体でブラウザアクセスすると正常に動作します。 別のスクリプトからの実行がどうやら出来ないらしいのです。 すみません、apacheから見えない権限、というものを詳しく教えてくださいますでしょうか。 ファイル権限はindex.phpもb.phpも、出力するファイルもどれも同じはずなのですが…。
orangina

2016/02/04 00:51

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問