【问题标题】:Only variables can be passed by reference in sfException在 sfException 中只能通过引用传递变量
【发布时间】: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 日志显示“致命错误:只能通过引用传递变量”,仅此而已

标签: php symfony1


【解决方案1】:

改变 $content = preg_split('#&lt;br /&gt;#', highlight_file($file, true));
$content = preg_split('#&lt;br /&gt;#', ($hf = highlight_file($file, true)) );
这应该可以解决问题。 (如果没有,那么我们离答案更近了一步。)

老实说,我不知道它为什么会大发雷霆。根据文档,preg_split 的第二个参数是按值传递的。哎呀,该 sn-p 中的这些函数都不需要通过引用传递。但是话又说回来,您确实说过这只是发生在 一个 服务器上,因此可能是配置错误。

【讨论】:

  • 我已经尝试过您的建议,但没有奏效。我现在已经评论了该部分,结果是我的堆栈跟踪没有代码 sn-ps 来显示错误的确切位置......我也认为这应该是一个配置问题,但我不是很熟悉 PHP 配置,除了 php.ini,这是我可以在这里添加的唯一内容。明天上班时要做的第一件事:)
猜你喜欢
  • 2013-06-21
  • 1970-01-01
  • 1970-01-01
  • 2013-05-21
  • 1970-01-01
  • 2012-12-24
  • 2014-02-10
相关资源
最近更新 更多