DbHelp.ru
Маленький Yii блог
Комментарии
Гость: http://ifipog.ixubybad.ru/2017-12-17-vzyat-v-dolg-na-kartu-v-ufe.htm http://mzeoskxv.ruzoworejy.ru/...
Гость: wh0cd1144039 [url=http://albuterol02.us.org/]Albuterol Sulfate[/url] [url=http://dapoxetine911.us.or...
Гость: wh0cd1144039 [url=http://cialis02.us.org/]generic cialis[/url] [url=http://tretinoin911.us.org/]tret...
Гость: wh0cd2594827 [url=http://pyridium911.us.com/]Pyridium[/url] [url=http://clozaril911.us.org/]clozaril...
Гость: order Retrovir in USA delivery NO PRESCRIPTION ; low prices Retrovir in Canada pharmacy without ...



Сервер Ultima Online - Forest Wars (от создателя данного блога)

MemCache и ZendServer

Рубрика: Разбор багов и ошибок

Оцените эту статью:

Рейтинг: 0.00 (0)
5 Апр. 2009
Опубликовать в Twitter Написать в Facebook Опубликовать в своем блоге livejournal.com

Yii Framework Blog img http://dbhelp.ruzendserver2 Надо было мне поэксперементировать с кешем в Yii. Нашел справку как что подключать и сразу приступил к делу. Работал я тогда на своём домашнем компьютере поэтому Yii поднимал на Zend Server-е.

---

Проблема вот в чем. Пытаюсь подключить кеш, все по человечески делаю. Захожу в конфиг и добавляю:

        'cache'=>array(
'class'=>'system.caching.CMemCache',
),

конечно можно указать перечень серверов и тп - но это не обязательно. по умолчанию коннект будет к localhost по порту 11211.

После этого обновляю экран своего приложения - и вуаля, ничего больше не работает. Перед собой я вижу абсолютно белый экран и некаких сообщений об ошибке.

Лезу в логи ZendServer-а и вижу интересное сообщение:

    * PHP Error:
Call to undefined method Memcache::addServer()

Мол метод addServer не найден. Поискав в php.net (http://ua2.php.net/manual/ru/function.memcache-addserver.php) я понял что никакой ошибки нет и данный метод существует.

Поэтому пришлось капать глубже. А именно в framework/caching/CMemCache.php именно в этом файле вызывается данный метод.

   public function init()
{
parent::init();
if(!extension_loaded('memcache'))
throw new CException(Yii::t('yii','CMemCache requires PHP memcache extension to be loaded.'));

$servers=$this->getServers();
$cache=$this->getMemCache();

if(count($servers))
{
foreach($servers as $server)
{
$cache->addServer($server->host,$server->port,$server->persistent,
$server->weight,$server->timeout,$server->status);
}
}
else
$cache->addServer('localhost',11211);
}

Как видим ничего замысловатого. Сначало проверяется подключен ли у нас memcache. Если нет - получаем исключение с ошибкой на экран, если нет - идет проверка. Проверяет заполнено ли поле серверов в конфиге, если нет - подставляет значение по умолчанию и выполняет:

$cache->addServer('localhost',11211);

Вот оно проблемное место. С первого взгляда все окей, вот только чего ж оно вылетает. Решение пришло в голову после чашки чая. Оказывается что метод addServer добавился в memcache только со второй ветки (2.0.1) о чем нам говорит ченж лог - http://pecl.php.net/package-changelog.php?package=memcache

А в ZendServer-е последней версии почему то не установлено. В моё удивление там вообще установлена первая версия! (1.0.0) которая хрен знает на сколько устарела. 

Мое решение вот такое:

   public function init()
{
parent::init();
if(!extension_loaded('memcache'))
throw new CException(Yii::t('yii','CMemCache requires PHP memcache extension to be loaded.'));

$servers=$this->getServers();
$cache=$this->getMemCache();

if(count($servers))
{
// если мы используем несколько серверов - уведомляем что надо обновить
// либсу memcache до версии 2.0.1
if (!method_exists($cache, 'addServer'))
throw new CException(Yii::t('yii','Update you memcache to 2.0.1 version. Method addServer not found.'));

foreach($servers as $server)
{
$cache->addServer($server->host,$server->port,$server->persistent,
$server->weight,$server->timeout,$server->status);
}
} else {
// т.к. сервер один - нет смысла создавать очередь. поэтому что б
// всё заработало - меняем addServer на connect
$cache->connect('localhost',11211);
}
}

Если в конфиге обнаружено много кеш серверов для использования, а библиотека нам не позволяет использовать addServer - тогда на экран исключение с просьбой обновить либсу. Если в конфиге не указанно не одного сервера - значит нет смысла использовать addServer для localhost, и делаем просто connect.

Для тех кто собирается использовать много кеш-серверов и ZendServer - лучше обновить либсу до 2.0.1 хотя бы. Для тех кому достаточно кеш сервера localhost - тогда можем и не обновлять.



Если хотите опубликовать этот материал у себя - пожалуйста, разместите ссылку на страницу откуда вы его взяли.
Другие yii статьи:

  1. Для начала вам потребуется скачать последний релиз FCKeditor. Разархивируйте скачанный файл и поместите его в папку fckeditor (которую предварительно ... "Как подключить FCKeditor"

  2. Мы постоянно совершенствуем свои приложения позволяя пользователям загружать свои документы, аватарки и др. Хочешь упростить все эти функции? Читай обзор ... "Обзор дополнения CFile"

  3. Я рад сообщить о выходе новой версии любимого фреймворка. next Вышла стабильная версия Yii 1.1.4, включающая более 60 исправлений и улучшений. JQuery UI ... "Yii Framework 1.1.4"

[guest] idle sign

Было сказано: Понедельник, 13 Июль 2009

«Нашол» в первом абзаце на самом деле — «нашел».

[adm] zolter

Было сказано: Понедельник, 13 Июль 2009

Спасибо.

Если не трудно используйте в будущем Ctrl+Enter для выделения ошибок.

Оставить комментарий


Код:
Имя: