Zend/Loader.phpのロードに失敗しました。理由を調べてみませんか?

StackOverflow https://stackoverflow.com/questions/39364

  •  09-06-2019
  •  | 
  •  

質問

3 ~ 4 日ごとにクラッシュするクライアント サイトを継承しました。これは、私には知識のない zend フレームワークを使用して構築されています。

次のコード:

<?php
    // Make sure classes are in the include path.
   ini_set('include_path', ini_get('include_path') . PATH_SEPARATOR . 'lib' . PATH_SEPARATOR . 'app' . DIRECTORY_SEPARATOR . 'classes');

    // Use autoload so include or require statements are not needed.
    require_once 'Zend/Loader.php';
    Zend_Loader::registerAutoload();

    // Run the application.
    App_Main::run('production');

次のエラーが発生します:

[Tue Sep 02 12:58:45 2008] [error] [client 78.***.***.32] PHP Warning: require_once(Zend/Loader.php) [function.require-once]: failed to open stream: No such file or directory in /srv/www/vhosts/example.co.uk/httpdocs/bootstrap.php on line 6 
[Tue Sep 02 12:58:45 2008] [error] [client 78.***.***.32] PHP Fatal error: require_once() [function.require]: Failed opening required 'Zend/Loader.php' (include_path='.:.:/usr/share/php5:/usr/share/php5/PEAR') in /srv/www/vhosts/example.co.uk/httpdocs/bootstrap.php on line 6 

これを修正するにはどこから始めればよいのかさえわかりません。私の PHP の知識レベルは中級ですが、前述したように、Zend の経験はありません。また、元の開発者に連絡することもできません。

興味深いのは、サイトのページがヒットするたびにコードが実行されるにもかかわらず、エラーが発生するのは時々だけであるということです。

include_path と何か関係があるはずだと思いますが、よくわかりません。

役に立ちましたか?

解決

まず、インクルードパスの末尾にスラッシュを付ける必要があると思います。これが私の例です:

    set_include_path('../library/ZendFramework-1.5.2/library/:../application/classes/:../application/classes/excpetions/:../application/forms/'); 

ブートストラップ ファイルは別のファイル (おそらく、index.php ファイル) にインクルードされます。これは、インクルード パスが絶対パスではなく (私の場合のように) 相対パスである場合、bootstrap.php を含むファイルが変更されると、Loader.php が検索されるパスも変更されることを意味します。

たとえば、Zend アプリには 2 つのindex.php ファイルがあり、1 つはフロントエンド用、もう 1 つは管理領域用です。これらのインデックス ファイルはそれぞれ、異なるインデックス ファイルにインクルードされているため、異なる相対パスを持つ独自の bootstrap.php が必要です。 定義されているブートストラップ ファイルではなく、元の要求されたインデックス ファイルを基準とする必要があります。.

これは、問題が断続的である理由を説明する可能性があります。時々しか使用されないブートストラップを含む別のファイルがどこかにある可能性があります。すべてのサイト ファイルで「bootstrap.php」を検索し、このファイルが含まれている、またはこのファイルを必要としているすべての場所を確認します。

他のヒント

この問題が散発的にしか発生しないという事実から、これはプログラミングの問題というよりは、システム管理者の問題であると考えられます。実装の欠陥である場合、エラーが「そのようなファイルはありません」であることを考慮すると、一貫して失敗することが予想されます。またはディレクトリ」。2つの推測

  • 複数のフロントエンド Web サーバーがあり、そのうちの 1 つが誤って構成されています (Zend Framework が欠落しています)。

  • PEAR インクルード ディレクトリはネットワークにマウントされているため、短期間消えることがあります。

これは、より危険なファイル システムの問題である可能性がありますが、これは 1 つのファイルだけではなく、複数のファイルに影響を与えると考えられるでしょう。

私も同じ問題を抱えていましたが、問題はファイルへのアクセス許可にありました。すべての RWX に chmod を与えましたが、今ではすべて問題ありません。

もしかしたら他の人も私と同じ問題を抱えているかもしれませんが、その場合はこれが解決策でした。

よろしく

時々動作するので、PHP 側で本質的に問題があるわけではありません (パスが間違っていたら、決して動作しません...)でもそうなりますよね?)。では、Loader.php が定期的にアクセスできなくなる原因は何でしょうか?権限の問題が疑われると思います。何かが原因で Loader.php またはそれが存在するディレクトリにアクセスできなくなります。おそらく cron ジョブがアクセス許可を設定/リセットしているのでしょうか?まずそれを確認してください。機能している場合の権限と機能していない場合の権限を確認してください。

私の場合、Zend/Loader.php は PEAR ディレクトリにありませんでした。そこにあるはずですが、Webサーバーが少し不安定でした。ただし、library/Zend ディレクトリに挿入することもできます。

しかし、実際のところ、これは問題が時々しか発生しない理由の答えにはなりません。

PHPUnit 3.5.5 を使用しているときにもこのエラーが発生しました。メインのアプリケーション スクリプトは zend フレームワークを正常にロードしましたが、テスト クラスでエラーが発生しました。

私の解決策は、テストクラスに次のものを追加することでした

   ini_set('include_path', ini_get('include_path') . PATH_SEPARATOR . 'lib' . PATH_SEPARATOR . 'app' . DIRECTORY_SEPARATOR . 'classes');

    require_once 'ThemeWidgets.php';
    require_once 'PHPUnit/Framework.php';

    require_once '../../library/Zend/Loader/AutoLoader.php';


    class ThemeWidgetsTest extends PHPUnit_Framework_TestCase
    {

        public function setUp() {
            Zend_Loader_Autoloader::getInstance();
        }
...
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top