我有一个奇怪的问题,我找不到为什么会这样。一些背景优先。我在大约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的两部分:答案 0 :(得分:0)
更改
$content = preg_split('#<br />#', highlight_file($file, true));
到$content = preg_split('#<br />#', ($hf = highlight_file($file, true)) );
那应该是诀窍。 (如果没有,那么我们将更接近答案。)
虽然说实话,我不确定为什么它会变得合适。根据文档,preg_split
的第二个参数按值传递。哎呀,该片段中的所有功能都不需要通过引用传递。但话说回来,你确实说过这只发生在一个的服务器上,所以可能是配置错误。