cakePHP内存缓存逻辑不起作用

时间:2011-08-12 10:52:24

标签: php cakephp windows-7 memcached telnet

我的问题是我的cakePHP应用程序中的memcache逻辑在我的本地系统上没有工作,因为我在这里设置它,通过从现有的队友设置中获取代码。我已经检查过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(),假设$ 6来自第690行的D:\ cake1.2 \ cake \ libs \ configure.php中的不兼容上下文

     

...以及类似的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";放在代码中,我在我的系统上得到了这个结果 -

enter image description here

我从这些数据中解释了什么?我在“开始时间”部分中收到了警告 - 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
}

所以,我进入了CakeMemcache()类的set()函数,最后有这一行

return @$this->_Memcache_cluster_new->set($key, $var, 0, time()+$expires);

这会返回false,我不知道从这里调试什么。

令我困惑的另一件事是app_model.php中的memcacheCommon()有这些行 -

$this->Memcache = new CakeMemcache();
$this->Memcache->_connect();

在CakeMemcache() - &gt; _connect()中,有这些行 -

$this->_Memcache_standalone =& new Memcache();
$this->_Memcache_cluster_new =& new Memcache();

我不确定他们到底做了什么。

非常感谢任何指示......谢谢

更多详情

我已经以某种方式丢失了早期的memcache.php文件,使用它我得到了上面的图形内存缓存使用显示(已经发布了我上面得到的输出图片)。我后来从http://pecl.php.net/package/memcache/3.0.6下载了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;后,我得到了 - &gt;

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 个答案:

答案 0 :(得分:2)

我可以看到,你在Windows机器上,所以telnet命令是:

telnet 127.0.0.1 11211

注意空间而不是冒号。这可能有助于您调试memcache连接

答案 1 :(得分:0)

耶!我找到了解决方案!!我在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开始工作,后来我意识到这就是原因。