【发布时间】:2011-10-20 14:50:56
【问题描述】:
我有一个奇怪的问题,但我不知道为什么会这样。先来点背景。我在大约 10 台生产服务器上安装了一个 symfony 1.4 应用程序。它们都运行 PHP 5.3.0,但我不确定是否都以相同的方式配置(这取决于管理员,我只熟悉 php.ini 文件的部分内容)。所以...几天前在其中一台服务器上报告了一个奇怪的错误。在动作类中每次调用 forward 方法后(对于 symfony 不熟悉的人来说,唯一重要的是它会做一些事情并抛出一个继承 sfException 类的 sfStopException)“致命错误:只有变量可以通过参考”错误产生。我已经在网上搜索了原因,这就是我发现的 - the-stickman.com/web-development/php/php-505-fatal-error-only-variables-can-be-passed-by-参考/。我认为这篇文章完美地描述了问题和解决方案。到目前为止一切都很好 - 没什么奇怪的......直到我看到错误的产生位置 - 第 293 行的 .../lib/vendor/symfony/lib/exception/sfException.class.php 代表这种方法:
/**
* Returns an excerpt of a code file around the given line number.
*
* @param string $file A file path
* @param int $line The selected line number
*
* @return string An HTML string
*/
static protected function fileExcerpt($file, $line)
{
if (is_readable($file))
{
// THIS LINE GENERATES THE ERROR
$content = preg_split('#<br />#', highlight_file($file, true));
$lines = array();
for ($i = max($line - 3, 1), $max = min($line + 3, count($content)); $i <= $max; $i++)
{
$lines[] = '<li'.($i == $line ? ' class="selected"' : '').'>'.$content[$i - 1].'</li>';
}
return '<ol start="'.max($line - 3, 1).'">'.implode("\n", $lines).'</ol>';
}
}
所以...考虑到为什么会产生这种类型的错误的解释,我了解问题所在,但我想不出一个好的解决方案。这部分代码实际上对我的应用程序并不重要——它只是在 symfony 堆栈跟踪中呈现 php 文件的代码(我在一个生产服务器上看不到它并不是什么大问题,记住它应该'甚至在那里不可用)。但我发现的唯一解决方案(快速解决方案)只是注释其中的一些代码。现在用户可以使用我的应用程序,但这并不让我高兴,因为我还没有找到一个干净的解决方案(我不喜欢破解我自己的应用程序)。所以......我希望我已经足够好地描述了这个问题,并且有人可以给我至少一些想法......谢谢:)。
编辑:这里是两部分的 php.ini:
- 第 1 部分 - http://pastie.org/2733955
- 第 2 部分 - http://pastie.org/2733961
我可以粘贴更多 php 配置信息,但我需要知道感兴趣的内容 - php.ini 是我熟悉的唯一 php 配置...干杯:)。
【问题讨论】:
-
第 293 行到底是哪一行?
-
标有“这条线会产生错误”的那条
-
这段代码不可能产生那个错误,除非它是旧版本的 PHP 错误。这些函数都不接受任何位置的引用。您可以发布堆栈跟踪吗?
-
嗯,这段代码生成了symfony堆栈跟踪代码sn-ps...这就是为什么它对我来说真的很奇怪。其他服务器都没有此错误... apache 日志显示“致命错误:只能通过引用传递变量”,仅此而已