Fastcgi 500 ошибка на preg_match_all в PHP - PullRequest
1 голос
/ 29 марта 2010

Я пытаюсь настроить какой-то экзотический код PHP (я не эксперт), и я получаю сообщение FastCGI Error 500 в строке PHP, содержащей 'preg_match_all'.

Когда я закомментирую строку, страница возвращается с 200 (но не так, как предполагалось).

Код анализирует содержимое PHP, HTML и JavaScript, загруженное из базы данных, и создает их для возврата к завершенной странице.

Теперь, разместив около error_log записей, я мог бы определить, что строка с preg_match_all является причиной 500. Однако строка загружается несколько раз во время загрузки страницы и в других случаях, строка не вызывает ошибку.

Вот как это выглядит точно:

preg_match_all ("/(<([\w]+)[^>]*>)((?:.|\n)*)(<\/\\2>)/",
                $part['data'], $tags, PREG_PATTERN_ORDER|PREG_OFFSET_CAPTURE);

Строка темы - это фрагмент текста, который выглядит следующим образом:

<script> ... some javascript functions ... </script>

Редактировать: Это код, который работает и работает правильно в другом месте, так что это вполне может быть настройка PHP или разница в среде. Я использую PHP 5.2.13 на IIS6 с FastCGI.

Редактировать: Ничего не упоминается в файлах журнала. По крайней мере, в тех, которые я проверял:

  • Журналы IIS
  • Журналы событий
  • PHP Log

Редактировать: jab11 указал на проблему , но решения пока нет:

Любые мысли или указания приветствуются.

Ответы [ 2 ]

1 голос
/ 29 марта 2010

Есть ли шанс, что $part['data'] может быть очень большим? Я имел обыкновение получать 500 ошибок на preg_match_all, когда использовал его на строках больше 100 КБ.

0 голосов
/ 29 марта 2010

Это прекрасный пример, почему плохая идея обрабатывать HTML с помощью регулярных выражений. Я готов поспорить, что вы столкнулись с переполнением стека, поскольку исходная строка HTML содержит некоторые незамкнутые теги, что заставляет регулярное выражение пробовать все виды перестановок в своей тщетной попытке найти закрывающий тег (</\2>). В HTML-файле размером 32 КБ легко выкинуть свое регулярное выражение из тележки. Возможно, стек другого размера на другом сервере, поэтому он работает на одном, но не на другом.

Быстрый тест:

Я применил регулярное выражение к исходному коду этой страницы (после удаления закрывающего тега </html>). RegexBuddy быстро потерял сознание примерно на минуту, а затем сопоставил теги <head> и <body> (успешно). Отладка регулярного выражения с <html> показала, что ему потребовалось 970257 шагов к движку регулярного выражения, чтобы определить, что оно не может соответствовать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...