アプリ版:「スタンプのみでお礼する」機能のリリースについて

いつもお世話になっております。

Windows環境で開発したPHPアプリをCentOS環境に移行しようとしているのですが、
件名のとおり、PHPのrequireの動作がWindowsとCentOSで違うことから、
原因を調べております。お知恵を拝借したいと思います。

例えば、以下の構成で親プログラム(myApp.php)から子(myparts/main.php)を読み込もうとしています。

ドキュメントルート/test/myApp.php
ドキュメントルート/parts/mypartsA/main.php

●myApp.php
<?php
echo ("##### myApp is starting now !!! </br>");
require_once('/parts/mypartsA/main.php');
?>

●mypartsA/main.php
<?php
echo ("#### mypartsA is required </br>");
?>And myApp.php and mypartsA/main.php are in following structure.

結果として、

●Windowsでは、以下が表示されますが・・・
##### myApp is starting now !!!
#### mypartsA is required

●CentOSでは、以下のとおりエラーになります。
PHP Warning: require_once(/parts/mypartsA/main.php) [<a href='function.require-once'>function.require-once</a>]: failed to open stream: No such file or directory
in /var/www/html/test/myApp.php on line 12
PHP Fatal error: require_once() [<a href='function.require'>function.require</a>]: Failed opening required (/parts/mypartsA/main.php’(include_path='.:/php/includes:/usr/share/pear:/usr/share/pear/PEAR:/var/www/html') in /var/www/html/test/myAPP.php on line 12

解決策として、以下のようにすればエラーが解消することは分かっているのですが・・・
require_once($_SERVER['DOCUMENT_ROOT']./parts/mypartsA/main.php);
なるべく既存のアプリに手を入れたくないので、
何故Windowsではできて、何故CentOSではできないのかを知りたいと思います。

とりあえず、PHP.iniのinclude_pathを調べてみましたが、
表記方法の違いはあるものの、に意味的な違いが見つかりません。

●Windowsでの設定
.;C:\PHP;C:\PHP\pear;C:\Apache2.2.22\htdocs

●CentOSでの設定
.:/php/includes:/usr/share/pear:/usr/share/pear/PEAR:/var/www/html

この他何をポイントに調べていったらよいか教えていただければと思います。
よろしくお願いします。

A 回答 (4件)

CentOSというかLinux全般では先頭の「/」はシステムのルートディレクトを指定しますので


それで参照がうまくいっていないのだとおもいます。
先頭の「/」を外すかカレントディレクトリをあらわす「./」を使用して

require_once('parts/mypartsA/main.php');

もしくは

require_once('./parts/mypartsA/main.php');

のように記述してみてください。
    • good
    • 0
この回答へのお礼

ありがとうございます。

お礼日時:2013/03/22 16:17

include_pathの設定をするか、自ファイルの近くに置いて相対パスでrequireするのが妥当

    • good
    • 0
この回答へのお礼

ありがとうございます。

お礼日時:2013/03/22 16:17

document_rootが php.ini のinclude_path に登録されているなら、先頭の / を削るだけで、windowsでもlinuxでも動作するはず。

本来先頭の / 無し記述で、include_path 内のファイルを指定するとマニュアルにある。
http://jp.php.net/manual/ja/function.include.php

この回答への補足

パスを指定した場合は、include_path は無視されます。と書いてありますね。

続けて、たとえば ../ ではじまるファイル名を指定した場合は、 親ディレクトリからそのファイルを探します。とも書いてあります。

私のアプリケーションの場合、myApp.phpというプログラムを最初に動かしているので、カレントディレクトリがtestで、親ディレクトリはその上の/(ドキュメントルート)だと思っていました。

つまり、親ディレクト(この場合はドキュメントルート)から、parts/mypartsAとたどって、main.phpを探し当てることを期待したわけですが、Windowsはこの期待どおり動くにに対し、CentOSは期待どおりに動いていないことが不思議で質問させていたきました。

補足日時:2013/03/22 18:31
    • good
    • 0
この回答へのお礼

ありがとうございます。

お礼日時:2013/03/22 17:22

>親ディレクトリはその上の/(ドキュメントルート)


No1回答者さんの記述にもあるけど、/ 開始のルート解釈が違います。

マニュアルuser note に windows IISの場合 / 開始のファイルを virtual host のトップ開始と解釈するとある。
http://jp2.php.net/manual/ja/function.include.ph …

しかし、windows apache だと、/始まりの時は、include_path から探す。(xampp1.7 で include_path にドキュメントルート以外のみ登録して検証、登録されていないドキュメントルート下のファイルには、/ 開始では読み込みできないが、include_path内のファイルには、/ 開始で読み込みできた)

linux系列OS だと、/ 開始は、サーバー本体のルートから探しに行く。

ということで、
今回の場合は、include_pathが記述の通りなら parts/mypartsA/main.php とするか、 ../parts/mypartsA/main.php を指定することで、どのOSでもドキュメントルート以下が同じ構成なら動く。
    • good
    • 0
この回答へのお礼

やはりOSによって違う振る舞いをするようですね。腹をくくって既存のアプリを修正することにします。
ありがとうとございました。

お礼日時:2013/03/25 08:44

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!