Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Системы кеширования PHP (eAccelerator, APC, XCache, Memcache и др.).  (Прочитано 22514 раз)
0 Пользователей и 1 Гость смотрят эту тему.
RXL
Технический
Администратор

Offline Offline
Пол: Мужской

WWW
« : 11-08-2008 18:39 » 

Кто-нибудь пользовался перечисленными в топике или еще какими-нибудь системами кеширования? Интересен опыт и особенности.

На сервере сейчас стоит eAccelerator. На виртуалке попробовал APC, XCache и Memcache. Последний удивил тем, что работает как отдельно стоящий демон: работа по TCP съест же часть выгрыша времени от кеширования.



Вот мои первые впечатления. Все четыре системы - Opensource. Memcache, похоже, работает только на POSIX системах (упоминания о винде не обнаружил), а остальные могут работать как на POSIX, так и есть бинарные сборки под Win32.

http://bart.eaccelerator.net/doc/phpdoc/
По API больше понравился eAccelerator. API простое - только самое нужное. Дока средней паршивости, неудобная, но информация понятна и есть толковые примеры. Он также лучше и удобнее в настройках. Легко и прозрачно можно отделить ключи каждого виртуального сервера в системе, чтобы не было лишних дырок в безопасности и пересечения ключей. В сети о нем встречал отзывы, что не все в порядке у него с управлением памятью - мол сегментация со временем приводит к потере производительности. Пока этого не заметил. Переписал код club.shelek.ru на работу с кешом: среднее время генерации страницы всего 5 мс против 120 без кеша. Против ожидания, что нагрузка на процессор и память возрастет, наблюдаю наоборот - снижение за счет меньшей нагрузки на базу. Приятно. Посмотрим, как покажет себя при длительной эксплуатации.

http://www.php.net/apc
APC очень обилен в настройках. API маленькое. Интересна фича - сохранение массива и восстановление его как набора констант. Редкая по нужности фича.

http://xcache.lighttpd.net/wiki/XcacheApi
XCache ничем хорошим не удивил. Отвратительная дока без единого комментария (можно приравнять к "Черному квадрату"), хотя для базовых функций даны примеры. Настроек мало и, причем, кеширование по умолчанию разрешено, но размер используемой памяти и максимальные размеры пользовательских объектов равны нолю, что по документации означает - "запрещено". API вполне простое.

http://www.php.net/memcache
Memcache минималистичен в настройках, т.к. настройки управления кешированием находятся в отдельном демоне. API у него посложнее, чем у первых трех систем, и поддерживает работу в процедурном и ООП способах (дублированное API). Может иметь несколько кеширующих демонов: как на том же сервере, так и на других. Это какие-то намеки на живучесть или просто возможность пользоваться ресурсами других серверов?



А что есть из коммерческого и есть ли у них плюсы над перечисленными системами?
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
RXL
Технический
Администратор

Offline Offline
Пол: Мужской

WWW
« Ответ #1 : 12-08-2008 19:20 » new

Memcache, как самый сложный, изобилует багами.
http://www.php.net/manual/ru/function.memcache-set.php#84032
http://www.php.net/manual/ru/function.memcache-set.php#83767
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
RXL
Технический
Администратор

Offline Offline
Пол: Мужской

WWW
« Ответ #2 : 13-08-2008 14:50 » 

Нарисовал обобщенный класс для работы с кеш-системами. Только минимум: автоматическое или ручное определение кеш-системы (для memcache нужны доп.параметры), получение значения и сохранение его. Проверено на всех четырех системах.
Может кому пригодится...

Код: (PHP)
<?php

// (c) 2008 Veselchak U

class Cache
{
    var $_cache_type = 'auto'; // дефолтное значение
    var $_memcache = null;

    function __constructor($options = null)
    {
        $this->Cache($options);
    }

    function Cache($options = null)
    {
        // Проверка поддержки кеш-систем
        $cache_systems = array();

        if (function_exists('eaccelerator_get'))
            $cache_systems[] = 'eaccelerator';

        if (function_exists('apc_fetch'))
            $cache_systems[] = 'apc';

        if (function_exists('xcache_get'))
            $cache_systems[] = 'xcache';

        if (class_exists('Memcache'))
            $cache_systems[] = 'memcache';

        $required_cache = isset($options['cache']) ? $options['cache'] : $this->_cache_type;

        if (count($cache_systems) && $required_cache != 'none')
        {
            if ($required_cache == 'auto')
                $this->_cache_type = array_shift($cache_systems); // первое значение в списке
            else if (in_array($required_cache, $cache_systems))
                $this->_cache_type = $required_cache;
            else
                $this->_cache_type = 'none';
        }
        else
            $this->_cache_type = 'none';

        if ($this->_cache_type == 'memcache')
        {
            $failed = true;

            if (isset($options['memcache']) && is_array($options['memcache']))
            {
                $this->_memcache = new Memcache;

                foreach ($options['memcache'] as $server)
                {
                    if (!is_array($server) || !isset($server['host'])) // host должен быть указан
                        continue;

                    $server['port'] = isset($server['port']) ? (int) $server['port'] : ini_get('memcache.default_port');
                    $server['persistent'] = isset($server['persistent']) ? (bool) $server['persistent'] : true;

                    if ($this->_memcache->addServer($server['host'], $server['port'], $server['persistent']))
                        $failed = false;
                }

                if ($failed)
                    $this->_memcache = null;
            }

            if ($failed)
                $this->_cache_type = 'none';
        }
    }

    function get($key)
    {
        $data = null;

        switch ($this->_cache_type)
        {
            case 'none':
                break;
            case 'eaccelerator':
                $data = eaccelerator_get($key);
                break;
            case 'apc':
                $data = apc_fetch($key);
                break;
            case 'xcache':
                $data = xcache_get($key);
                break;
            case 'memcache':
                $data = $this->_memcache->get($key);
                break;
        }

        return $data;
    }

    function put($key, &$data, $ttl)
    {
        switch ($this->_cache_type)
        {
            case 'none':
                break;
            case 'eaccelerator':
                eaccelerator_put($key, $data, $ttl);
                break;
            case 'apc':
                apc_store($key, $data, $ttl);
                break;
            case 'xcache':
                xcache_set($key, $data, $ttl);
                break;
            case 'memcache':
                // Решение set() проблемы с несколькими серверами.
                // http://www.php.net/manual/ru/function.memcache-set.php#84032
                if (!$this->_memcache->replace($key, $data, MEMCACHE_COMPRESSED, $ttl))
                    $this->_memcache->set($key, $data, MEMCACHE_COMPRESSED, $ttl);

                break;
        }
    }
}

?>
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
RXL
Технический
Администратор

Offline Offline
Пол: Мужской

WWW
« Ответ #3 : 15-08-2008 12:33 » 

Turck MMCache
http://turck-mmcache.sourceforge.net/index_old.html
Проект, от которого отпочковался eAccelerator. Проект не развивается уже 5 лет.
Там есть два сравнительных теста.

ionCube PHP Accelerator
http://www.php-accelerator.co.uk/
Еще один PHP-акселератор. Тоже мертвый. Последний релиз в 2005-м.
« Последнее редактирование: 15-08-2008 12:36 от RXL » Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines