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リクエストで実行できる形にしたいです。
よろしくお願いいたします。