【发布时间】:2011-10-21 03:35:04
【问题描述】:
我们重现了在我们的一个生产服务器上发生的一种错误。这是怎么回事:
我们有 3 个 PHP 文件
test1.php:
Test 1
<?php require_once('test2.php'); ?>
test2.php:
Test 2
<?php require_once('test3.php'); ?>
test3.php
Test 3
include_path在两台服务器上都是一样的,点不包含在里面还有其他原因:
php_value include_path /var/www/xxxxxx/php/ZendFramework/1.11.x/:/var/www/xxxxxx/php/
在我们的开发服务器上一切都很好(输出Test 1 Test 2 Test 3),在线,当我们上传文件时,我们第一次加载/test1.php,没问题,第二次调用等等我们得到:
测试 1 测试 2
警告:require_once(test3.php) [function.require-once]: 失败 打开流:第 2 行中没有这样的文件或目录
致命错误:require_once() [function.require]:打开失败 需要'test3.php' (include_path='/var/www/xxxxxx/php/ZendFramework/1.11.x/:/var/www/xxxxxx/php/') 在第 2 行
除了 include_path 之外,还有什么我们应该知道的会影响 PHP 中包含文件的行为吗?我必须区分可能发生的情况,因为我目前无权访问服务器配置文件。以及为什么它第一次在生产服务器上工作并在之后失败?我只是无法解释它可能是什么。
编辑:我们有时也会在错误消息中看到奇怪的字符(以及每次刷新时的变化):
[...] 第 4 行 °µ4ª 中没有这样的文件或目录
【问题讨论】:
-
您似乎已验证您尝试在两种环境中以相同方式设置
include_path,但ini_get('include_path')是否验证它们确实相同? -
是的,我们已经验证了这一点,我不得不提一下,我们尝试包含的文件无论如何都不在包含路径中,我们希望包含彼此位于同一目录中的当前网站文件。
-
现在我明白了。记录的行为是,在查看包含路径后,php 会查看调用文件的目录和工作目录。而且您会看到这种行为的偏差,这很奇怪。两台服务器都运行相同的 PHP 版本?
-
奇怪的是,我们发现 APC 存在问题。当我在生产服务器上上传时,第一次执行成功,然后在剩余时间发生“致命错误”,这让我想到了某种缓存问题。我们将 APC 更新到了最新版本,一切正常。
标签: php include require include-path