6

这可能是一个太模糊的问题,但我已经解决了几个小时令人费解的服务器错误并将其归结为最奇怪的问题;在这一点上,我只想知道是否有人曾经发生过类似的事情,或者可能对可能发生的事情有任何见解。

以下代码行触发了错误:

if ($Name=='ProxiedIP') { return true; }

这个版本运行没有任何问题:

if ($Name=='proxiedIP') { return true; } 

似乎令牌“ProxiedIP”以某种方式弄脏了一些东西,但我什至无法想到解析器将如何翻译字符串文字,从而使服务器像这样挂起。顺便说一句,我确定$Name!='proxiedIP'$Name!='ProxiedIP'

这是apache错误日志中的条目:

[Fri Jan 18 18:15:12.924419 2013] [core:error] [pid 27676:tid 3427232831232] [client 12.345.67.890:34482] Premature end of script headers: index.php, referer: http://mySite.com/

我搜索了“ProxiedIP”作为我系统上我能想到的每个组件的关键字,但我一无所获。不过,对我来说更重要的问题是字符串如何在比较检查中产生这种影响。有任何想法吗?


还值得注意的是,PHP 错误日志对此完全保持沉默。我在页面顶部启用了错误输出,但脚本从未完成加载,因此这可能是一个因素。这是我设置它的方式:

error_reporting(E_ALL);
ini_set('display_errors', 1);

因为代码在这里工作,它似乎更有可能是特定于平台实现的东西。我在 Gandi.net 的“简单托管”服务的实例上运行它,该服务运行 Varnish 以加速应用程序。值得一提的是,代码正在加载到单独域中的 iframe 中。

我也在对标头进行一些密集的工作,这似乎是问题的最大潜在根源,尽管就我而言奇怪的是触发错误的方式。此外,我知道没有一个名为“ProxiedIP”的通用标头,尽管到目前为止,使用冲突似乎是唯一有意义的事情。无论如何,我没有看到它。

对我来说,真正相关的仅仅是字符串比较导致服务器崩溃的事实。我已经用 PHP 编程超过 10 年了,以前从未发生过这样的事情。我试图了解它是如何发生的背后的后勤工作。


更新:我尝试了以下变体,它仍然产生相同的结果:

if ($Name === (strtoupper("p").'roxiedIP')) { return true; }

有人问我是否会发布完整的代码,但 iframe 端的脚本有 1400 多行,所以这并不可行。我正在调整有问题的部分以尝试在新脚本中运行它,并将发布结果。

4

4 回答 4

2

我认为问题出在变量 $Name 上。检查它是否被正确分配。还要检查导致问题的 if 语句之后的代码。

于 2013-01-19T08:57:14.800 回答
1

实际上,我认为您的问题在于调用函数,即根据返回值,它会做一些“愚蠢”的事情并且 PHP 崩溃。尝试用硬return true或替换 if()return false看看会发生什么。

于 2013-01-19T00:01:49.330 回答
1

当我从你的错误中得到消息时,你正在搞乱框架,如果你的框架的变化会在允许 fw 进行输出之前触发一些输出被调用。只是更详细地阅读它,你在错误的火车上得到它,这不是错误的原因,它是 fw 不神圣状态的开始。

尝试在 php 调试器中运行脚本,而不是使用 var dump。

于 2013-01-19T01:01:52.743 回答
1

感谢您的帖子,但事实证明这是一个非常复杂的场景,其中功能链下几个级别的条件导致了所讨论的任一功能范围之外的意外行为。

实际问题是由于在一个完全独立的进程中解析 debug_backtrace() 数组的输出时进行了条件检查,具有讽刺意味的是,这是为了防止无限递归,而是触发了类似的破坏性级联事件,这些事件超出了分配的内存限制。

我最初发帖是因为我对真正似乎是字符串文字比较做一些我认为不可能的事情感到困惑,并且想了解如果是这样的话,什么条件可以允许它发生。我很高兴原因实际上并不是它看起来的那样。感谢您帮助解决难题。


更新:错误的真正根源在于 PHP 难以翻译包含对其自身的引用的对象或数组。我正在存储转换后的标头、直接标头引用、$_REQUEST[] 和 $_SERVER[] 项,以及在复杂的关联数组中记录消息和相关数据。这些项目之间有很多动态引用,尤其是那些涉及我使用的原生 PHP 全局变量的引用。

PHP传统上在管理自引用实体方面存在问题,尽管已经进行了改进,但我的特殊情况非常复杂,以至于在尝试映射这些对象时将ReflectionClass发送到无限循环中。我已经通过在轮询项目时手动取消引用它们来修复它,但是如果需要在一个公共数组或引用结构中使用多个与 $GLOBALS 相关的变量,则需要注意这一点。

于 2013-01-19T19:21:09.293 回答