我继承了一个每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有关,但我不确定。
答案 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();
}
...