【问题标题】:Strange behaviour with cascading includes (2 servers acts differently)级联的奇怪行为包括(2 个服务器的行为不同)
【发布时间】: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


【解决方案1】:

您使用的是什么版本控制软件?过去我们在使用 Perforce 时遇到过问题,我们从 dev 集成到 prod,并且文件没有被复制到所有负载均衡器。第一次排除故障很棘手,因为它似乎是一个不一致的 PHP 错误,并且取决于您正在检查的生产服务器,该文件很可能在那里。

【讨论】:

  • 我们使用的是 Subversion,但我们通过 FTP 手动将文件放到网上。
猜你喜欢
  • 1970-01-01
  • 2012-02-09
  • 2020-12-13
  • 1970-01-01
  • 1970-01-01
  • 2021-10-01
  • 2014-04-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多