Тайны PHP оптимизатора XCache

English-speaking guests, please read below.

Установил на сервере для PHP оптимизатор XCache. Уж больно wordpress тормознутый… Казалось бы, что проще? Включил плагин, пару строчек в конфигурацию черкнул и готово… Но не тут-то было… Ни с того ни с сего начали сыпаться ошибки вида:

xcache.var_size is either 0 or too small to enable var data caching

и это сыплется при любых попытках сохранить что-либо в кэш из кода.

Рыл интернет. Читал вдоль и поперёк сайт разработчиков. Ни крошки информации. Форумы рыл. Везде одно и то же – у многих людей выскакивает данная проблема. И никто так и не получил ответа. Психанул и залез в исходники плагина. Очень быстро нашёл, что xотел. Выяснилось. Ну неужели сложно было черкнуть строчку на сайте?

Что же я выяснил? Если xcache работает в php-cli, то кэш отрубается вовсе. Делается это внутри кода так: xcache.size = xcache.size_var = 0. Если php запущен как fast-cgi, то xсache  работает как ни в чём не бывало… Если в xcache.ini параметр xcache.test = On, то xcache будет работать всегда, даже в cli версии. Вот такой хитрый расклад.

Если вы получаете такую ошибку при работе php с apache, то видимо у вас эта связка сконфигурирована не как fast-cgi, и php работает как cli со всеми вытекающими отсюда бедами. Если у вас не предвидится (или просто нет желания) перехода на fast-cgi, то ставьте xcache.test = On и всё заработает.

Я подозреваю, что такой подход был выбран из-за того, что xcache очень агрессивно кеширует байт-код php и попросту не проверяет был ли скрипт изменён (по крайней мере в течение некоторого времени). Это приводит к тому, что если вы редактируете php файл, то изменений в работе скрипта вы не увидите, т.к. xcache вместо ваших писулек подставит данные из кеша. В режиме работы сервера (через fast-cgi) – это простительно, т.к. на серверах обычно стоит окончательная версия скрипта и он не меняется так часто, как при разработке. А вот при разработке вы постоянно что-то меняете в скрипте и вы попросту не увидите ожидаемого результата (вы же проверяете в консоли в режиме php-cli), т.к. работать будет совсем другой код из кеша :)

В общем, желаю удачи всем кто столкнулся с этой проблемой и с моей записью о том как её решить. Думаю таких людей будет много, т.к. в рунете не нашёл полноценного объяснения этому безобразию.

- – - – - – - – - -

Here is the section for english readers. :)

If you got error from xcache like this one: «xcache.var_size is either 0 or too small to enable var data caching«, but yours xcache.size_var is much bigger than zero and you don’t know how to solve it, then you at right place. :) After analysing of xcache sources I found that xcache was disabled for php’s CLI mode and cache always enabled for fast-cgi mode. Except one case: when xcache.test = On (check your ini files for it). This option enables xcache for CLI also. This information was not found on xcache developers site, so I share it with you (also lot of forums have this queston without answer).

If you got this error on your production server, then this can mean, that your php backend works with httpd server in non fast-cgi mode. So, if you are not planning to switch on fast-cgi, then just enable «test» option in your ini-file.

But be aware, it seems that xcache time-to-time doesn’t determines, is your script was modified or not, therefore during developement you can observe some side effects, like  your «just modified» php script runs incorrect… This is a result of xcache work in cli mode – it executes cached bytecode, but not your «just modified» script! This is a reason why xcache was disabled for CLI mode (I think so) – just to save your nerves during development. :)

Have a nice coding. :)

Запись опубликована в рубрике Blog с метками , . Добавьте в закладки постоянную ссылку.

4 комментария: Тайны PHP оптимизатора XCache

  1. Dram говорит:

    Тоже эта ошибка-Ваш способ ее не победил. Та и выдает:

    Warning: xcache_set() [function.xcache-set]: xcache.var_size is either 0 or too small to enable var data caching in /var/www/dram/data/www/сайт.ru/components/com_qcache/backends/xcache.php on line 18

    Warning: xcache_get() [function.xcache-get]: xcache.var_size is either 0 or too small to enable var data caching in /var/www/dram/data/www/сайт.ru/components/com_qcache/backends/xcache.php on line 10

    Warning: xcache_unset() [function.xcache-unset]: xcache.var_size is either 0 or too small to enable var data caching in /var/www/dram/data/www/сайт.ru/components/com_qcache/backends/xcache.php on line 23

    • stunpix говорит:

      php работатет как cli или как fast-cgi в связке с веб-сервером? xcache.test = On имеет смысл только для cli, для fcgi проблемы вообще не должно быть. Перезапускали сервер после изменения конфига?

  2. Dram говорит:

    Как fast-cgi. Проблема только на сайте под Джумлой 1,0,15, на остальных под Джумлой 1,5 проблем нет

    • stunpix говорит:

      Я обдумал эту задачу и если чесно, то сложно понять причину. Судя по исходникам xcache, причина может быть только в cli режиме. Это debug сообщение выводится сразу после проверки не запущен ли php в cli режиме. Ещё вероятно, в джумле 1.5 пофиксили этот баг, т.к. я встречал этот вопрос на багтрекере джумлы. А вообще странно – как вы получили эту ошибку в режиме fcgi? Она существует только в cli режиме судя по исходникам другого и быть не может…

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *

*

Можно использовать следующие HTML-теги и атрибуты: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>

Spam protection by WP Captcha-Free