вторник, 20 сентября 2011 г.

Настройка перегрузки тестовых функций

Не так давно при работе с CMS Битрикс пришлось столкнуться со следующей задачей.

Как известно, для того чтобы Битрикс правильно работал в кодировке UTF-8 требуется, чтобы параметр mbstring.func_overload был выставлен в значение, отличное от 0 (чаще всего в 2).

Обычно этого можно достигнуть либо установкой значения параметра в php.ini, либо в соответствующих файлах .htaccess, либо в vhosts.conf (или файлах настроек конкретных хостов для Apache). Но бывают такие случаи, когда некоторым скриптам или библиотекам (один из примеров - PHPExcel), требуется, чтобы mbstring.func_overload был равен 0.
Как быть и что делать?

Если на хостинге стоит php ниже 5.2.8, то данная проблема решается использованием ini_set(). Если же версия php выше данной - читаем дальше.

Все операции проводились над файлом vhosts.conf httpd.
Допустим, виртуальный хост определен следующей записью:
<VirtualHost *:80>
    ServerName server.ru
 
    DocumentRoot /home/webmaster/server.ru
 
    ScriptAlias /cgi/ "/home/webmaster/cgi/"
    ScriptAlias /cgi-bin/ "/home/webmaster/cgi/"
 
    ErrorLog /var/log/httpd/server_errors.log
 
    Options -Indexes 
    ErrorDocument 404 /404.php
    php_admin_value mbstring.func_overload 2
 
    <IfModule mod_dir.c>
      DirectoryIndex index.php index.html
    </IfModule>
 
    <IfModule mod_expires.c>
      ExpiresActive on
      ExpiresByType image/jpeg "access plus 3 day"
      ExpiresByType image/gif "access plus 3 day"
    </IfModule>
 
</VirtualHost>
Требуется, чтобы для скриптов в некоторой папке no_overload в корне сайта параметр mbstring.func_overload был равен 0.
Для этого воспользуемся директивой <Directory> и изменим запись следующим образом:
<VirtualHost *:80>
    ServerName server.ru
 
    DocumentRoot /home/webmaster/server.ru
 
    ScriptAlias /cgi/ "/home/webmaster/cgi/"
    ScriptAlias /cgi-bin/ "/home/webmaster/cgi/"
 
    ErrorLog /var/log/httpd/server_errors.log
 
    Options -Indexes 
    ErrorDocument 404 /404.php
    php_admin_value mbstring.func_overload 2
 
    <Directory /home/webmaster/server.ru/no_overload>
      DirectoryIndex index.php index.html
      php_admin_value mbstring.func_overload 0
    </Directory>
 
    <IfModule mod_dir.c>
      DirectoryIndex index.php index.html
    </IfModule>
 
    <IfModule mod_expires.c>
      ExpiresActive on
      ExpiresByType image/jpeg "access plus 3 day"
      ExpiresByType image/gif "access plus 3 day"
    </IfModule>
 
</VirtualHost>
Этого достаточно для мирного "сосуществования" двух значений mbstring.func_overload. Но можно пойти и дальше. 

Может случиться так, что скрипты придется расположить в административной панели Битрикса, то есть в папке /bitrix/admin/. Создание в ней еще одной папки (той же no_overload) и применение к ней директивы <Directory>, в общем-то, верное решение, если бы не одно но. На странице скриптов ссылки главного меню относительные, и потому будут выглядеть как /bitrix/admin/no_overload/ и вести на несуществующие страницы. Поэтому воспользуемся директивой <Files> и изменим запись так:
<VirtualHost *:80>
    ServerName server.ru
 
    DocumentRoot /home/webmaster/server.ru
 
    ScriptAlias /cgi/ "/home/webmaster/cgi/"
    ScriptAlias /cgi-bin/ "/home/webmaster/cgi/"
 
    ErrorLog /var/log/httpd/server_errors.log
 
    Options -Indexes 
    ErrorDocument 404 /404.php
    php_admin_value mbstring.func_overload 2
 
    <Directory /home/webmaster/server.ru/bitrix/admin>
      <Files myscript.php>
        php_admin_value mbstring.func_overload 0
      </Files>
    </Directory>
 
    <IfModule mod_dir.c>
      DirectoryIndex index.php index.html
    </IfModule>
 
    <IfModule mod_expires.c>
      ExpiresActive on
      ExpiresByType image/jpeg "access plus 3 day"
      ExpiresByType image/gif "access plus 3 day"
    </IfModule>
 
</VirtualHost>
Итак, теперь для файла myscript.php, что в папке /bitrix/admin/ и только для него mbstring.func_overload выставлен в 0, на всем остальном сайте - в 2. Вот теперь можно работать.

И да - перезапустите httpd после внесения изменений ;)

Больше информации о директивах <Directory> и <Files>.

3 комментария:

  1. Добырй день,

    Спасибо за полезную статью! Помогла но частично. У меня так же стоит задача в папке www/bitrix/adimn сделать папку у который overload должен быть 0. Вне папки Битрикс работает. Но в папке Битрикс ваш метод не работает, так же пробовал через files но тоже не действует.

    Что можете еще посоветовать?

    ОтветитьУдалить
  2. И еще все изменения делаю в файле /home/etc/httpd/bx/conf/default.conf

    ОтветитьУдалить
    Ответы
    1. Добрый день. Вообще, сходу сложно сказать в чем может быть проблема. Залейте на pastebin, например, конфиги, которые правите.

      Удалить