无法加载Zend / Loader.php。试图找出原因?

时间:2008-09-02 12:16:51

标签: php zend-framework

我继承了一个每3或4天崩溃的客户端网站。它是使用我不知道的zend-framework构建的。

以下代码:

<?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有关,但我不确定。

6 个答案:

答案 0 :(得分:3)

首先我认为你的包含路径应​​该有一个尾部斜杠。以下是我的一个例子:

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

您的引导程序文件将包含在另一个文件(可能是index.php文件)中。这意味着如果您的包含路径是相对的(如我的)而不是绝对路径,那么如果包含bootstrap.php的文件发生更改,则查找Loader.php的路径会发生变化。

例如,我的Zend应用程序中有两个index.php文件,一个用于前端,另一个用于管理区域。这些索引文件每个都需要有自己的bootstrap.php,它们具有不同的相对路径,因为它们被不同的索引文件包含在内,这意味着它们必须相对于原始请求的索引文件,而不是它们在<>中定义的引导文件< /强>

这可以解释为什么你的问题是间歇性的,可能有另一个文件包括偶尔偶尔使用的某个引导程序。我将搜索所有网站文件中的'bootstrap.php'并查看所有包含/要求此文件的地方。

答案 1 :(得分:1)

它只是偶尔发生这一事实让我觉得这不是一个编程问题,而是更多的系统管理员问题 - 如果它是实现中的缺陷,你会发现它会一直失败,因为错误是“没有相应的文件和目录”。两个猜测

  • 有多个前端Web服务器,其中一个配置错误(缺少Zend Framework)。

  • PEAR包含目录是网络安装的,偶尔会在短时间内消失。

这可能是一个更隐蔽的文件系统问题,但人们会认为这不仅会影响一个文件。

答案 2 :(得分:1)

我遇到了同样的问题,但问题在于对文件的许可。我为所有RWX提供了chmod,现在一切都很好。

所以也许其他人会遇到与我相同的问题,那么这就是解决方案。

此致

答案 3 :(得分:0)

它有时会起作用,所以PHP的结尾没有任何固有的错误(如果路径错了它永远不会工作......但确实如此,是吗?)。那么是什么导致Loader.php定期无法访问?我怀疑是权限问题。正在使Loader.php或其无法访问的目录的东西。也许一个cron作业是设置/重置权限?先检查一下。查看工作时的权限以及不工作时的权限。

答案 4 :(得分:0)

在我的情况下,Zend / Loader.php不在PEAR目录中。它应该在那里,但我的网络服务器有点原始。但您也可以将它插入库/ Zend目录中。

但实际上这并不能解决为什么有时会出现问题。

答案 5 :(得分:0)

当我使用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();
        }
...