пятница, 26 августа 2011 г.

500 - PHP regular expression limit reached joomla

Проблема

Опубликовал на сайте под управлением CMS Joomla объёмный материал (более 10 тыс. слов). При попытке просмотреть его со стороны fronend получил сообщение об ошибке
500 - PHP regular expression limit reached joomla

Решение

PHP выделяет 100 000 байт для использования функций поиска по регулярным выражениям (в формате PCRE). Это ограничение и является причиной ошибки.
Необходимо увеличить количество памяти, выделяемое для работы с регулярными выражениями. Требуемый объем памяти зависит от объема обрабатываемого текста.
Я увеличил лимит до 150 000 байт.
За выделяемый для обработки регулярного выражения объем памяти отвечает директива pcre.backtrack_limit из конфигурационного файла php.ini.
Её можно изменить непосредственно редактируя конфигурационный файл php.ini, файл .htaccess либо через команду ini_set из php скрипта. Я выбрал последний вариант, так как доступ к конфигурационным файлам сервера провайдера у меня отсутствует.
В CMS Joomla я поместил команду в файл configuration.php:
ini_set('pcre.backtrack_limit', 150000);

Результат

После изменения конфигурации php ошибка исчезла.

PS

А ещё можно разбить большой текст на страницы. Такая возможность реализована во всех версиях Joomla - в текстовом редакторе вставьте "Разрыв страницы".

PPS

Если вы часто изменяете конфигурацию через панель управления Joomla (что приводит к потере вручную внесенных в файл configuration.php изменений), то предпочтительным способом является установка директивы через файл конфигурации веб сервера Apache .htaccess.
В файл .htaccess, расположенный в корне сайта, необходимо добавить команду:
php_value pcre.backtrack_limit 150000

6 комментариев:

  1. Самый дебильный способ добавлять эту опцию в configuration.php. Первое же сохранение конфигурации в панели управления Joomla! все затрет.

    ОтветитьУдалить
    Ответы
    1. php.ini на многих хостингах недоступен.
      Ваши предложения?

      Удалить
    2. Директивы php.ini можно изменять также через файл конфигурации веб сервера Apache .htaccess:
      php_value pcre.backtrack_limit 150000

      Удалить
  2. у меня в конфиге нету строчки ini_set('pcre.backtrack_limit', 150000) и даже намека на подобное =(
    как выйти из ситуации в таком случаи?

    ОтветитьУдалить
    Ответы
    1. Строку ini_set('pcre.backtrack_limit', 150000) в конфиг нужно именно добавить.
      Команда ini_set позволяет установить(изменить) опции конфигурации для выполняемого php скрипта. (локально, а не глобально для сервера).

      Удалить
  3. Подобная проблема существует если меню сильно разрастается, у меня в меню и подменю было около 1000 пунктов, так столкнулся с такой же проблемой, Убрав некоторые позиции - все обратно запустилось.

    ОтветитьУдалить