Memcache

添加说明

用户贡献的说明 5 个说明

4
rob4226 at yahoo dot com
2 年前
感谢 GitHub 上的 nono303,我们可以在 Windows 上运行此 PHP 扩展和 memcached!这对开发环境来说非常棒,可以与生产的 Unix 服务器相匹配。我正在 Windows 10 机器上使用 PHP 8.0 和此 memcache 扩展,memcached 服务器运行在 localhost 上,并且运行良好。

我无法发布链接,但此扩展的 dll 位于以下仓库中:nono303/PHP-memcache-dll

实际的 Windows 版 memcached 服务器位于以下仓库中:nono303/memcached
13
xrobau at gmail dot com
6 年前
请注意,Memcache 3.0.8 模块与 PHP 7(或更高版本)不兼容。

有一个关于此问题的未解决错误 - 请参阅 https://bugs.php.net/bug.php?id=72887,在撰写本文时已超过一年 - 但是,此模块的开发似乎已被放弃,MemcacheD 模块现在是通过 PHP 访问 Memcache 的唯一方式。

如果您正在编写一个新的工具,并且想使用 Memcache,请使用 MemcacheD 库。如果您正在尝试修复旧工具,您要么必须坚持使用 PHP 5.6,要么花时间重新编写代码以使用 MemcacheD。
16
gabriel dot maybrun at demandmedia dot com
9 年前
注意:最近,我被要求从 PECL memcache 迁移到 PECL memcached,并且遇到了一个主要问题 - memcache 和 memcached 以不同的方式序列化数据,这意味着使用一个库写入的数据不一定可以用另一个库读取。

例如,如果您使用 memcache 写入一个对象或一个数组,它会被 memcached 解释为一个整数。如果您使用 memcached 写入它,它会被 memcache 解释为一个字符串。

简而言之 - 您无法在 memcache 和 memcached 之间安全切换,除非进行缓存刷新或隔离的缓存环境。

<?php
$memcache
= new Memcache;
$memcacheD = new Memcached;
$memcache->addServer($host);
$memcacheD->addServers($servers);

$checks = array(
123,
4542.32,
'a string',
true,
array(
123, 'string'),
(object)array(
'key1' => 'value1'),
);
foreach (
$checks as $i => $value) {
print
"Checking WRITE with Memcache\n";
$key = 'cachetest' . $i;
$memcache->set($key, $value);
usleep(100);
$val = $memcache->get($key);
$valD = $memcacheD->get($key);
if (
$val !== $valD) {
print
"Not compatible!";
var_dump(compact('val', 'valD'));
}

print
"Checking WRITE with MemcacheD\n";
$key = 'cachetest' . $i;
$memcacheD->set($key, $value);
usleep(100);
$val = $memcache->get($key);
$valD = $memcacheD->get($key);
if (
$val !== $valD) {
print
"Not compatible!";
var_dump(compact('val', 'valD'));
}
}
-1
Lajos Veres
6 年前
3.0.8 实际上与 PHP 7 不兼容,但这个 fork 似乎可以正常工作
https://github.com/websupport-sk/pecl-memcache

对于新项目,memcacheD 听起来更安全,但这个 fork 可能有助于使一些遗留项目保持运行。

Debian 包管理器选择了这个版本:https://github.com/websupport-sk/pecl-memcache/commit/4991c2fff22d00dc81014cc92d2da7077ef4bc86

基于此
http://ppa.launchpad.net/ondrej/php/ubuntu/pool/main/p/php-memcache/ https://packages.debian.org/sid/php/php-memcache
-24
匿名
9 年前
我运行了 Gabriel 上面的测试,但结果不同。我确实发现了对象之间的差异。例如
'val' => string(7) "4542.32"
'valD' => double(4542.32)

但是,我认为这可以解决。相当容易。

测试的主要问题是使用了一个端口。我在另一个端口上运行了另一个 memcached 实例,并稍微更改了代码。我使用了这段代码,并且取得了更好的效果

$servers = array(array('localserv', 11212));
$memcache = new Memcache;
$memcacheD = new Memcached;
$memcache->addServer('localserv', 11211);
$memcacheD->addServers($servers);
$memcacheD->setOption(Memcached::OPT_BINARY_PROTOCOL, true);

$checks = array(
123,
4542.32,
'a string',
true,
array(123, 'string'),
(object)array('key1' => 'value1'),
);
foreach ($checks as $i => $value) {
print "正在使用 Memcache 进行写入测试\n";
$key = 'cachetest' . $i;
$memcache->set($key, $value);
usleep(100);
$val = $memcache->get($key);
$valD = $memcacheD->get($key);
if ($val !== $valD) {
print "不兼容!";
var_dump(compact('val', 'valD'));
} else {
print "兼容性测试通过\n";
}

print "正在使用 MemcacheD 进行写入测试\n";
$key = 'cachetest' . $i;
$memcacheD->set($key, $value);
usleep(100);
$val = $memcache->get($key);
$valD = $memcacheD->get($key);
if ($val !== $valD) {
print "不兼容!";
var_dump(compact('val', 'valD'));
} else {
print "兼容性测试通过\n";
}
}
To Top