Блог - Linux, программирование, Я!

phpТюнинг PHP — установка XCache на Ubuntu

Каждый раз, когда вы открываете страничку динамического веб-приложения, веб-сервер обращается к PHP, который загружает запрошенный .php файл и все include и require, затем парсит их, компилирует в промежуточный байт-код ( opcode) и исполняет. Причем в больших проектах процесс включения всех include файлов может занимать весьма продолжительное время.
Поэтому были разработаны многочисленные PHP-кешеры. Наиболее популярные из них - APC (Alternative PHP Cache), XCache и eAcelerator. Все они позволяют сохранять и повторно использовать скомпилированный байт-код PHP, что позволяет экономить время на сборку всех включений и их компиляцию, экономит процессорное время и оперативную память (причем весьма значительно). Помимо этого, они позволяют хранить в кеше переменные PHP и обращаться к ним при следующем вызове скрипта. Какой из этих кешеров использовать - не особо принципиально, по производительности они не сильно отличаются. Я выбрал XCache т.к. на него никто не ругается как на eAcelerator и я уже работал с APC и было интересно попробовать что-то новое

Так вот, приступим. Установка XCache довольно простая, но тем не менее:

Устанавливаем пакет php5-xcache:

[codesyntax lang="bash"]sudo apt-get install php5-xcache[/codesyntax]

Редактируем конфиг расширения PHP xcache.ini

[codesyntax lang="bash"]sudo nano /etc/php5/conf.d/xcache.ini[/codesyntax]

Там исправляем строчки:

размер opcode кеша. Ставьте около 64Мб. Вообще, если у вас на сайте много различных PHP скриптов с большим количеством различных include, то нужно ставить значение побольше. Если сайт всего один - можно оставить маленькое значение.
xcache.size = 64M

размер кеша данных/переменных. Если в качестве кешера данных используете именно xCache, то ставьте побольше. Если используете Memcached, то установите 0
xcache.var_size = 32M

указываем количество процессоров (или ядер) на вашем компьютере
xcache.count = 2

Убедитесь, что есть строчка
xcache.cacher = On

Для просмотра статистики использования, оценки эффективности и управления кешем имеется веб-интерфейс администратора. В Ubuntu он устанавливается вместе с пакетом и находится в папке /usr/share/xcache в поддиректориях admin и coverage. Так что скопируйте эти папки в директорию веб-сервера, затем настройте доступ к ним в том-же xcache.ini
xcache.admin.user = "user"
xcache.admin.pass = "5f4dcc3b5aa765d61d8327deb882cf99"
;xcache.admin.pass = ""

Здесь первая опция - логин пользователя, вторая - md5 хеш пароля (можно сделать, например, тут). Можно оставить пароль пустым.

Сохраняем, перезапускаем веб-сервер/php

[codesyntax lang="bash"] sudo /etc/init.d/apache2 restart[/codesyntax]

Админка:

xcache панель администратора

phpinfo()
xcache phpinfo

P.S.: после установки кешера отвалился Zend Debuger с сообщением " Debugger compile handler overriden, cannot continue"... Конечно странно ставить кешер и дебагер на одну тачку, но все-же.. Чтобы это пофиксить рекомендуют

[codesyntax lang="bash"]sudo nano /etc/php5/conf.d/zend_debugger.ini[/codesyntax]

и там закомментировать строчку zend_debugger.expose_remotely=allowed_hosts
Эта опция

The zend_debugger.expose_remotely directive determines whether the debugger will expose itself (i.e. signal its presence) to remote clients. This is required if you want the Zend Studio Browser Toolbar to automatically detect pages that can be debugged. Select ‘always’, ‘never’, or ‘allowed_hosts’ (this only exposes the hosts in the allowed host list)

Т.е. указывает в каких случаях Zend Debuger должен выдавать свое присутствие (посредством специального HTTP заголовка).Таким образом, эта опция становится в положение ‘always’, но зато хотябы будет работать... Тем не менее, это явно баг а не фича!

  1. 2010-05-09 17:03:47 | #

    Сделал xcache.size = 64M и xcache.var_size = 32M сайт уходит в «502 Bad Gateway». Установлен Nginx может быть из-за этого?
    Если меняю значения xcache.size и xcache.var_size на другие то сайт работает но команда php -v выдает кроме стандартного вывода:

    php -v
    /dev/zero: No space left on device
    Failed creating file mappping
    PHP Fatal error: Failed creating file mappping in Unknown on line 0
    PHP Fatal error: XCache: Cannot create shm in Unknown on line 0

    Segmentation fault

    В общем сделал пока xcache.size = 16M и xcache.var_size = 16M, так ошибок не появляется. Но всё-таки интересно как это можно исправить?

    • 2010-05-14 01:13:08 | #

      /dev/zero: No space left on device

      Возможно у вас отсутствует устройство /dev/zero

      Можно попробовать заменить xcache.mmap_path = "/dev/zero" например на xcache.mmap_path = "/tmp/xcache"

      Ну и xcache.var_size есть смысл ставить больше 0 только если используешь функции вроде xcache_set() xcache_get()

      • 2012-10-20 16:33:02 | #

        У меня нет устройства такого, когда ставлю в /tmp/zero то как только файл достигает определенного размера (xcache.size+xcache.var_size) то сайт выдает 500. Причем не важно какими будут xcache.size и xcache.var_size, хоть по 1M все равно.

    • 2010-05-14 01:33:59 | #

      Кстати, возможно это происходит из за недостатка оперативной памяти. Вот еще можно почитать http://forum.lighttpd.net/topic/7188

      В частности рекомендуют увеличить значение параметра ядра kernel.shmall
      посмотреть текущее значение можно
      sysctl -A | grep kernel.shm

  2. Павел
    2010-11-12 19:36:13 | #

    Доброе время суток. не могу понять в чем проблема. Все установил, созад хост для хкэш и запустил веб интерфейс выдает очень много ошибок вот такого рода:

    Undefined index: avail in /www/xcache.local/www/admin/xcache.tpl.php on line 58
    …..

    Попытался порыться пхп коде, ничего не могу сообразить. Может где нужно указать дополнительный путь? Заранее спасибо

    • 2010-11-12 23:16:09 | #

      Нагуглил вот чего:
      http://forum.lighttpd.net/topic/100639
      Предлагают для начала убедиться что xcache правильно установился с помощью < ?php phpinfo() ?> или из командной строки сделать php -m | grep XCache Если установлен, вставить в тот самый xcache.tpl.php в самое начало

                              $ebits = ini_get('error_reporting');
      error_reporting($ebits ^ E_NOTICE);
                            
  3. Павел
    2010-11-19 11:52:33 | #

    Ух спасибо большое ))) ошибок раз в 20 уменьшилось )))

    Теперь только вот это мучает:

    Warning: Division by zero in /www/xcache.local/www/admin/xcache.tpl.php on line 63 Warning: number_format() expects parameter 1 to be double, string given in /www/xcache.local/www/admin/xcache.tpl.php on line 86 Warning: number_format() expects parameter 1 to be double, string given in /www/xcache.local/www/admin/xcache.tpl.php on line 87 Warning: Invalid argument supplied for foreach() in /www/xcache.local/www/admin/xcache.php on line 169

    Капец.. че за фигня такая (((

    • 2010-11-19 15:37:58 | #

      Эх… Просто админка у XCache настолько криво написана.

      Ну уберите вывод ошибок вообще: вместо
      $ebits = ini_get('error_reporting');
      error_reporting($ebits ^ E_NOTICE);

      поставьте
      error_reporting(E_ERROR);
      Тогда предупреждения не будет показывать — только фатальные ошибки

      • Павел
        2010-11-26 21:58:06 | #

        хеххехе ) ) отличный выход. Помню раньше ставил себе eaccelerator ) никаких проблем не было ) вот решил новенького попробовать )
        благодарен за такой шикарный блог, и терпимое отношение к моим нубовским вопросам. Вы нормальный человек ), не то что остальные:
        задрото-проогаммеро-гопари )))

        Желаю вам миллионы кликов по google рекламе )))

        Павел Третьяков

  4. Ekim
    2011-12-19 13:11:44 | #

    Привет.
    У меня вопрос про кэширование опкода. Допустим, XCache закэшировал php-код, затем я поменял что-то в коде и залил на сервак. Как XCache узнает, что файлик обновился?

    • 2011-12-19 14:18:37 | #

      Не ручаюсь на 100%, т.к. в документации описания этого момента не нашел, но, видимо, XCache просто делает stat() каждому файлу перед использованием его кеша и если время модификации изменилось, то на лету обновляет опкод.
      Чтобы сказать на 100% нужно полистать сорцы…

    • 2011-12-19 15:07:42 | #

      Ну да, сравниваются параметры mtime и size из структуры stat() для PHP файла
      http://xcache.lighttpd.net/browser/trunk/xcache.c?rev=798#L331

      И, возможно, даже md5 сумма от содержимого php файла http://xcache.lighttpd.net/browser/trunk/xcache.c?rev=798#L144

  5. Ekim
    2012-01-14 13:33:00 | #

    поставил XCache. всё круто.
    вопрос такой: если памяти не хватает, то XCache умеет автоматически удалять редко используемый кэш для более частых запросов (что-то типа горячего кэша)?

    • 2012-01-14 22:22:15 | #

      А хз, в документации не написано, а код, отвечающий за сохранение опкода генерируется каким-то автогенератором, в котором ничего не понятно. Но скорее всего нет.

  6. 2012-08-12 18:48:38 | #

    Здравствуете! Если можно, опишите подробнее как закомментировать zend_debugger.expose_remotely=allowed_hosts
    Заранее спасибо!

    • 2012-08-13 14:46:50 | #

      Забавный вопрос…
      Открываете конфиг в редакторе и заменяете

      zend_debugger.expose_remotely=allowed_hosts
      на
      ; zend_debugger.expose_remotely=allowed_hosts
      (т.е. символ комментария ; в начале строки)
      Ну или вообще ее удаляете.
      Как сейчас не знаю, но когда я последный раз использовал PHP то предпочитал xdebug а не zend debugger

  7. 2012-08-14 07:38:36 | #

    Просто после установки xcache сайт перестал открываться, тоже не помогло

    • 2012-08-14 14:51:35 | #

      Если на сервере НЕ установлен zend debugger, то ясное дело что не поможет.
      Нужно смотреть лог ошибок PHP.

  8. 2012-08-14 07:39:49 | #

    zend_debugger.expose_remotely=allowed_hosts