- ベストアンサー
PHP PEARのWeeks.phpの場所
- Fatal error: require_once() [function.require]: Failed opening required 'Calendar/Month/Weeks.php' (include_path='.:/php/includes:/usr/share/php/smarty') in /opt/lampp/htdocs/samples/chapter6/6-4/calendar_pear.php on line 8 というエラーが出ているので調べています。
- PEARのCalendar/Month/Weeks.phpは、デフォルトではどこにインストールされるものなんでしょうか? PEARはインストールしてあって、pear install Calendar-0.5.5もやっていて、pear install Calendarと打つとpear/Calendar is already installed and is the same as the released version 0.5.5 install failedと、既にインストールされてます、と出ます。
- /usr/share/php/PEARが存在することは確認したのですが、find . "Weeks.php"と打っても「find: `Weeks.php': そのようなファイルやディレクトリはありません」と出ます。調べる方法があれば教えてください。よろしくお願いします。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
およよ。include_path は シェルの環境変数の PATH とは違います。 PHPの設定です。 設定ファイル php.ini を確認してください。 質問者さんの環境では次のように書かれているのではないかと思います。 include_path = ".:/php/includes:/usr/share/php/smarty" 次のように書き換えてみてください。 include_path = ".:/php/includes:/usr/share/php/smarty:/usr/share/php" で、多分WebサーバはApacheでモジュールで動いているんじゃないか と思いますので、Apache を再起動してください。 php.ini の在り処は、コマンドラインで php が利用できれば、 次のようにして調べられます。 php -i | grep "Configuration File" あるいは phpinfo() 関数の出力からも確認できます。 Webでアクセスできるphpファイルに以下のように書き、 ブラウザでアクセスしてみてください。 <?php phpinfo(); ?> 「Configuration File (php.ini) Path 」(バージョンによって表記が微妙にちがうかも)の ところを読めばphp.ini の場所がわかります。 なお、phpinfo() の出力から、システムの内情がわかりますから、 第三者からアクセスされないように配慮し、用が済んだらすぐに 消してください。 それから、php.ini をいじれない場合は、PHPのスクリプト内で設定することもできます。 以下の例は include_path の設定を読み取って、追加して、再設定しています。 $include_path = ini_get('include_path'); ini_set('include_path', $include_path . ':/usr/share/php'); require_once('Calendar/Month/Weeks.php') より前に書いてみてください。 あとApacheの設定ファイルでセットする方法もありますが、 割愛します。 http://www.php.net/manual/ja/ini.core.php#ini.include-path http://www.phpbook.jp/install/phpini/index4.html http://maihy.com/hp/phptech/phptech_incpath.html
その他の回答 (2)
- tomaju
- ベストアンサー率76% (84/110)
ANo.1 です。 ちなみに手元に CentOS 5.x の環境があるのですが、 パッケージの php-pear だと、/usr/share/pear の下に PHPのファイル群が入っており、 include_path に /usr/share/pear が含まれています。 Archive/ Calendar/ Console/ ... PEAR/ PEAR.php ... pear config-show で確認できる php_dir が、 include_path に含まれていればいいのかなと思っています。
- tomaju
- ベストアンサー率76% (84/110)
pear の list-files でパッケージに含まれるファイルを一覧できました。 pear list-files Calendar | grep Weeks とかやってみてはいかがでしょうか。 > /usr/share/php/PEARが存在することは確認したのですが、find . "Weeks.php"と打っても cd /usr/share/php/PEAR find . "Weeks.php" を実行したということでしょうか。 これは -name がいるんじゃないかと思います。 find . -name "Weeks.php" エラーメッセージに (include_path='.:/php/includes:/usr/share/php/smarty') とあります。 /usr/share/php/PEAR の下に PEARのパッケージがインストールされているとしたら、 include_path に /usr/share/php/PEAR が含まれていませんから、 見つからないと思います。
お礼
ありがとうございます。 結果から申しますと、まだ解決しておりません。 仰る通り、pear list-files Calendar | grep Weeksで、 php /usr/share/php/Calendar/Month/Weeks.php が見つかりました!(PEARと同じフォルダにあったなんて!…すみません) それで .bashrc を PATH=$PATH:/opt/lampp/bin:/usr/share/php:/usr/share/php/Calendar:/php/includes:/usr/share/php/smarty export PATH にして、source .bashrcを実行しました。その後の PATH は PATH=/usr/lib/lightdm/lightdm:/usr/local/sbin:/usr/local/bin:/usr/sbin :/usr/bin:/sbin:/bin:/usr/games:/opt/lampp/bin:/usr/share/php/PEAR:/op t/lampp/bin:/usr/share/php/Calendar/:/opt/lampp/bin:/usr/share/php/Cal endar:/php/includes:/usr/share/php/smarty:/opt/lampp/bin:/usr/share/ph p/Calendar:/php/includes:/usr/share/php/smarty:/opt/lampp/bin:/usr/sha re/php:/php/includes:/usr/share/php/smarty:/opt/lampp/bin:/usr/share/p hp:/usr/share/php/Calendar:/php/includes:/usr/share/php/smarty になりました(何回も実行したので重複して膨れ上がっています…)。 それで PATH を確保したはずなのに Fatal error: require_once() [function.require]: Failed opening required 'Calendar/Calendar.php' (include_path='.:/php/includes:/usr/share/php/smarty') in /usr/share/php/Calendar/Month/Weeks.php on line 51 というエラーが出ます。 今度はWeeks.phpの51行目にエラーがあるようですので開きますと 40 /** 41 * Allows Calendar include path to be redefined 42 * @ignore 43 */ 44 if (!defined('CALENDAR_ROOT')) { 45 define('CALENDAR_ROOT', 'Calendar'.DIRECTORY_SEPARATOR); 46 } 47 48 /** 49 * Load Calendar base class 50 */ 51 require_once CALENDAR_ROOT.'Calendar.php'; となっています。もうヤケで元々のファイルcalendar_pear.phpの中で //require_once("Calendar/Month/Weeks.php"); require_once("/usr/share/php/Calendar/Month/Weeks.php"); require_once("/usr/share/php/Calendar/Calendar.php"); と呼んでみました。けれども、まったく同じエラー Fatal error: require_once() [function.require]: Failed opening required 'Calendar/Calendar.php' (include_path='.:/php/includes:/usr/share/php/smarty') in /usr/share/php/Calendar/Month/Weeks.php on line 51 が出ます…。 私が出来るのはここまでです…。 ちなみに、pear config-showは PEAR directory php_dir /usr/share/php でした。 何か私の手順が間違っておりますでしょうか? 何かヒントとなるようなことありませんか? 補足があればいたします。 どうかよろしくお願いします。
お礼
ありがとうございます! 結果から申しますと、 $include_path = ini_get('include_path'); ini_set('include_path', $include_path . ':/usr/share/php'); が効いたようで、やっと先に進むことができました! php.iniファイルは、想像もつかなかったところにありました。 Configuration File (php.ini) Path => /etc/php5/cli Loaded Configuration File => /etc/php5/cli/php.ini 早速sudo vi /etc/php5/cli/php.iniで開いてみました。 viの/include_pathで検索してみましたが、 include_path = ".:/php/includes:/usr/share/php/smarty" という行はありませんでした。代わりに ;;;;;;;;;;;;;;;;;;;;;;;;; ; Paths and Directories ; ;;;;;;;;;;;;;;;;;;;;;;;;; ; UNIX: "/path1:/path2" ;include_path = ".:/usr/share/php" という行がありましたので、この行のコメントを外してから include_path = ".:/php/includes:/usr/share/php/smarty:/usr/share/php" に変更して保存しました。 lamppを使っているので sudo /opt/lampp/lampp stop で一度止めて、 sudo /opt/lampp/lampp start で再起動しました。ブラウザも一応のために再起動しました。 それでも、まったく同じエラーが出ました: Fatal error: require_once() [function.require]: Failed opening required 'Calendar/Calendar.php' (include_path='.:/php/includes:/usr/share/php/smarty') in /usr/share/php/Calendar/Month/Weeks.php on line 51 なぜかinclude_pathに反映されていません…。 しかし!例のini_set()をrequire_once()の前に貼りますと Strict Standards: Non-static method Calendar_Engine_Factory::getEngine() should not be called statically, assuming $this from incompatible context in /usr/share/php/Calendar/Calendar.php on line 210 というエラーが30個くらいでしょうか、出てきまして、その後に念願の 日 月 火 水 木 金 土 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 が出てきました。つまり、include_pathは通っていて、Calendar.phpは読めています。お陰様です。 新たなエラーは今回の質問とは関係ないと思われますので、別で質問することとします。 「プロ」グラマーですね。include_path一つとってもこんなに深いんですね。 私も真剣に勉強してみます。 本当にありがとうございました!