Логика кеша cakePHP не работает
Моя проблема в том, что логика memcache внутри моего приложения cakePHP не работает в моей локальной системе с тех пор, как я ее здесь настроил, принимая код из существующих настроек товарищей по команде. Я проверил, что сервис Memcached запущен в моей системе, и phpinfo() показывает, что раздел memcache включен.
Но такие вещи не работают -
$this->Memcache->set($key,$value);
CakePHP использует свою оболочку для Memcache, v. 0.3.
Если я буду отлаживать, как это -
echo "<pre>";
echo "checking";
error_reporting(-1);
$this->Memcache->set($key,$countryNetworkWiseReportData,3600);
echo "finished";
exit;
Я получил -
checkingfinished
Строгие стандарты: Нестатический метод Cache::write() не должен вызываться статически, предполагая $this из несовместимого контекста в D:\cake1.2\cake\libs\configure.php в строке 690... и подобные строгие стандартные уведомления для Cache::getInstance() и т. д.
Но обратите внимание, что уведомления появляются после "checkfinished", поэтому я запутался, если это действительно актуально.
Я попробовал команду -
telnet 127.0.0.1:11211
Который дает -
Connecting To 127.0.0.1:11211...Could not open connection to the host, on port 23: Connect failed
Также попробовал -
telnet localhost:11211 (in case firewall issues prevent connection to 127.0.0.1)
Но получил ту же ошибку.
Я также попробовал этот скрипт под названием memcache.php. я кладу $arr= "127.0.0.1:11211";
в коде, и я получил этот результат в моей системе -
Что я интерпретирую из этих данных? Я получаю предупреждение в разделе Время начала - Warning: date(): It is not safe to rely on the system's timezone settings. You are *required* to use the date.timezone setting or the ...
,
Пока что мне кажется, что соединение с портом 11211 по умолчанию по какой-то причине не разрешено в моем коде проекта cakePHP. Но опять же, как тогда memcache.php может подключаться к серверу memcache и отображать эти данные.
Более подробная информация
Спасибо Тудору Константину, занимающемуся telnet 127.0.0.1 11211
больше не выдает никакой ошибки, показывает пустой экран... что, я думаю, нормально.
Я проверил далее в коде, у нас есть модельные функции, которые имеют такую логику -
if(!$this->memcacheCommon())
{
$this->log('Error in memcache', LOG_DEBUG);
die('Error in memcache');
}
//like in others system, in my system too, it passes above condition
$memcachedata = $this->Memcache->get($key);
//does not return data in my system, because $this->Memcache->set($key,$data); never sets the data correctly.
if(got data from memcache)
{
//Return that data
}
else
{
//Get data from database
$this->Memcache->set($key,$data); //does not the data in my setup - set() function returns false
}
Итак, я вошел в функцию set() класса CakeMemcache(), и в конце есть эта строка
return @$this->_Memcache_cluster_new->set($key, $var, 0, time()+$expires);
это возвращает ложь, и я не знаю, что отлаживать отсюда.
Еще одна вещь, которая сбивает меня с толку - это memcacheCommon() внутри app_model.php, где есть такие строки:
$this->Memcache = new CakeMemcache();
$this->Memcache->_connect();
А внутри CakeMemcache()->_connect() есть эти строки -
$this->_Memcache_standalone =& new Memcache();
$this->_Memcache_cluster_new =& new Memcache();
Я не уверен, что именно они делают.
Буду признателен за любые указатели... спасибо
Подробнее
Я как-то потерял более ранний файл memcache.php, используя который я получил вышеупомянутый графический дисплей использования memcache (выложил рис вывода, который я получил выше). Позже я скачал memcache-3.0.6 с http://pecl.php.net/package/memcache/3.0.6 и попытался запустить файлы example.php и memcache.php, которые присутствуют в архиве.
Во-первых, запуск example.php выдает мне следующую ошибку:
Notice: memcache_connect(): Server localhost (tcp 11211) failed with: A connection attempt failed because the connected party did not properly respond after a period of time, or established connection failed because connected host has failed to respond.
Warning: memcache_connect(): Can't connect to localhost:11211, A connection attempt failed because the connected party did not properly respond after a period of time, or established connection failed because connected host has failed to respond.
Connection to memcached failed
Я проверил, что сервис memcached запущен (в списке сервисов windows). Также telnet localhost 11211
не выдает никакой ошибки и показывает пустое командное окно.
Во-вторых, запуск memcache.php и ввод учетных данных дает мне следующее при нажатии на все вкладки (Обновить данные, Просмотр статистики хоста, переменные) -
Notice: Use of undefined constant values - assumed 'values' in path\to\file\memcache.php on line 57
Cant connect to:v:a
Строка 57 была -
function get_host_port_from_server($server){
$values = explode(':', $server);
if (($values[0] == 'unix') && (!is_numeric( $values[1]))) {
return array($server, 0);
}
else {
return values; //line 57
}
}
Почему это были ценности, я скачал их с http://pecl.php.net/package/memcache/3.0.6. После того как я изменил его на return $values;
Я получил ->
Cant connect to:mymemcache-server1:11211
, Я точно не помню, как раньше мне удалось получить этот серверный график memcache (я разместил фото выше).
В-третьих, в командной строке после подключения через telnet введите команду stats
дает следующее -
STAT pid 1584
STAT uptime 2856
STAT time 1315981346
STAT version 1.2.1
STAT pointer_size 32
STAT curr_items 0
STAT total_items 0
STAT bytes 0
STAT curr_connections 1
STAT total_connections 3
STAT connection_structures 2
STAT cmd_get 0
STAT cmd_set 0
STAT get_hits 0
STAT get_misses 0
STAT bytes_read 7
STAT bytes_written 0
STAT limit_maxbytes 67108864
END
2 ответа
Ура! Я нашел решение!! Это начало работать после того, как я изменился localhost
в 127.0.0.1
в /app/config/fcore.php
файл.
Сделаны следующие изменения -
# Memcache server constants
define('MEMCACHE_SERVER', 'localhost:11211');
define('MEMCACHE_SERVER_CLUSTER', 'localhost:11211');
define('MEMCACHE_SERVER_CLUSTER_NEW', 'localhost:11211');
в
# Memcache server constants
define('MEMCACHE_SERVER', '127.0.0.1:11211');
define('MEMCACHE_SERVER_CLUSTER', '127.0.0.1:11211');
define('MEMCACHE_SERVER_CLUSTER_NEW', '127.0.0.1:11211');
О, я так сильно страдал из-за этого, и я думаю, что я не мог в своей жизни исправить это.
К счастью, наша команда создала новый репозиторий для проекта с 127.0.0.1
вместо localhost
и когда я взял контрольный пункт, memcache начал работать, и позже я понял, что это было причиной.
Как я вижу, вы находитесь на машине с Windows, поэтому команда telnet:
telnet 127.0.0.1 11211
Обратите внимание на пробел вместо двоеточия. Это может помочь вам отладить подключение к memcache