[SOLVED] Работа с кешем. Особенности ZendServer

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



        'cache'=>array(


            'class'=>'system.caching.CMemCache',


        ),

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

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

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

Quote

    * 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/…ackage=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 - тогда можем и не обновлять.