#php #symfony1
#php #symfony1
Вопрос:
У меня странная проблема, и я не могу понять, почему это происходит. Сначала немного предыстории. У меня есть приложение symfony 1.4, установленное примерно на 10 производственных серверах. Все они запускают PHP 5.3.0, но я не уверен, что все настроены одинаково (это зависит от администраторов, и я знаком только с частями файла php.ini). So… Несколько дней назад на одном из серверов было сообщено о странной ошибке. После каждого вызова метода forward в классе action (единственное, что важно в нем для людей, не знакомых с symfony, — это то, что он выполняет какие-либо действия и выдает исключение sfStopException, которое наследует класс sfException) генерируется ошибка «Фатальная ошибка: только переменные могут передаваться по ссылке». Я искал причину в Интернете, и вот что я нашел — the-stickman.com/web-development/php/php-505-fatal-error-only-variables-can-be-passed-by-reference /. Я думаю, что этот пост прекрасно описывает проблему и решение. Пока все в порядке — ничего странного… Пока я не увидел, где была сгенерирована ошибка — …/lib/vendor/symfony/lib/exception/sfException.class.php в строке 293, которая обозначает этот метод:
/**
* 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>';
}
}
Итак … имея в виду объяснение, почему генерируется ошибка такого типа, я понимаю, в чем проблема, но я не могу придумать хорошего решения. На самом деле эта часть кода не является чем-то важным для моего приложения — она просто отображает код php-файлов в трассировке стека symfony (не так уж и плохо, что я не вижу его на одном производственном сервере, имея в виду, что он даже не должен быть доступен там). Но единственное решение (быстрое), которое я нашел, — это просто прокомментировать часть этого кода. Теперь пользователи могут использовать мое приложение, но это не делает меня счастливым, потому что я не нашел чистого решения (мне не нравится взламывать мое собственное приложение). Итак… Я надеюсь, что я достаточно хорошо описал проблему, и кто-нибудь может дать мне хотя бы несколько идей… Спасибо :).
РЕДАКТИРОВАТЬ: и вот php.ini в двух частях:
— часть 1 —http://pastie.org/2733955
— часть 2 —http://pastie.org/2733961
Я могу вставить больше информации о конфигурации php, но мне нужно знать, что будет представлять интерес — php.ini — единственная конфигурация php, с которой я вроде как знаком… Приветствия :).
Комментарии:
1. Какая именно строка является 293-й?
2. Тот, который помечен как «ЭТА СТРОКА ГЕНЕРИРУЕТ ОШИБКУ»
3. Этот код не может генерировать эту ошибку, если только это не ошибка PHP в старой версии. Ни одна из этих функций не принимает ссылки ни в одной позиции. Можете ли вы опубликовать трассировку стека?
4. Ну, этот код генерирует фрагменты кода трассировки стека symfony… Вот почему это действительно странно для меня. Ни на одном из других серверов нет этой ошибки… В журнале apache написано «Фатальная ошибка: только переменные могут передаваться по ссылке», и это все
Ответ №1:
Изменить $content = preg_split('#<br />#', highlight_file($file, true));
Для $content = preg_split('#<br />#', ($hf = highlight_file($file, true)) );
и это должно сработать. (А если нет, то мы будем на один шаг ближе к ответу.)
Хотя, честно говоря, я не уверен, почему это вызвало бы истерику. Согласно документации, второй параметр preg_split
передается по значению. Черт возьми, ни одна из этих функций в этом фрагменте не требовала передачи по ссылке. Но опять же, вы сказали, что это происходит только на одном из серверов, так что это может быть ошибка конфигурации.
Комментарии:
1. Я пробовал ваш совет, но он не сработал. Я прокомментировал этот раздел, и в результате в моих трассировках стека нет фрагментов кода, чтобы точно показать, где возникает ошибка… Я также думаю, что это должно быть проблемой конфигурации, но я не очень знаком с конфигурацией PHP, кроме php.ini, и это единственное, что я могу здесь добавить. Первое, что нужно сделать завтра, когда я буду на работе 🙂