PHP Conference Japan 2024

Memcache 函数

目录

添加注释

用户贡献的注释 13 条注释

ed at me3inc dot com
18 年前
关于安装 memcache 扩展

我在连接它时遇到了各种各样的麻烦,因为在我阅读的所有说明中,我从未获得最后一步,也是最重要的一步——您必须拥有一个 php.ini,并在其中包含“extension=memcache.so”。

所以,步骤
首先 - 使用 --enable-memcache 进行 ./configure。这应该显示在您 phpinfo() 的顶部(即使 memcache 扩展的任何内容都无法工作)。

第二
要么 pecl install memcache

下载源代码
tar -xzvf [thesourcetarball]
phpize
./configure
make
make install

最后:将 extension=memcache.so 添加到您的 php.ini 中。(如果您没有,它应该放在调用 php 的根目录中,即 /usr/local/lib)

调用 phpinfo(),您应该会看到一个 memcache 部分。
mogmios at gmail dot com
17 年前
在使用非标准位置为 Apache/PHP 安装 memcache 模块时,似乎无法在配置构建时定义位置。您会收到一条错误消息,抱怨无法找到 php_session.h。我修改了 configure 以尝试 PREFIX 位置,这似乎工作正常。

if test -f "${prefix}/include/php/ext/session/php_session.h"; then
session_inc_path="${prefix}/include/php"
elif test -f "$abs_srcdir/include/php/ext/session/php_session.h"; then
session_inc_path="$abs_srcdir/include/php"
elif test -f "$abs_srcdir/ext/session/php_session.h"; then
session_inc_path="$abs_srcdir"
elif test -f "$phpincludedir/ext/session/php_session.h"; then
session_inc_path="$phpincludedir"
fi
iliya at pisem dot net
18 年前
另一个“智能”缓存聚合器
https://svn.shadanakar.org/onPHP/ trunk/core/Cache/AggregateCache.class.php
可用于多个缓存连接器 - memcached、文件系统等。
(手动删除空格)
Ron
19 年前
这是一个简单的 memcached 聚合器类,它将缓存分布在多个缓存服务器之间。如果服务器发生故障,负载将自动重新分配。它使用持久连接。

构造函数采用数组的数组,其中每个内部数组表示一个服务器,并具有一个“server”(字符串)属性,它是 memcached 服务器的 IP 地址或主机名,以及一个“port”(int)属性,它是 memcached 在服务器上运行的端口号。

所有现有的 memcached API 函数都已实现,除了 getStats() 和 getVersion(),它们是特定于服务器的。



<?php
class MemcachedAggregator {
var
$connections;

public function
__construct($servers) {
// 尝试建立/检索到所有服务器的持久连接。
// 如果任何一个失败,它们就不会被添加到我们的活动连接列表中。
$this->connections = array();
for (
$i = 0, $n = count($servers); $i < $n; $i++) {
$server = $servers[$i];
$con = memcache_pconnect($server['host'], $server['port']);
if (!(
$con == false)) {
$this->connections[] = $con;
}
}
}

private function
_getConForKey($key) {
$hashCode = 0;
for (
$i = 0, $len = strlen($key); $i < $len; $i++) {
$hashCode = (int)(($hashCode*33)+ord($key[$i])) & 0x7fffffff;
}
if ((
$ns = count($this->connections)) > 0) {
return
$this->connections[$hashCode%$ns];
}
return
false;
}

public function
debug($on_off) {
$result = false;
for (
$i = 0; $i < count($connections); $i++) {
if (
$this->connections[$i]->debug($on_off)) $result = true;
}
return
$result;
}

public function
flush() {
$result = false;
for (
$i = 0; $i < count($connections); $i++) {
if (
$this->connections[$i]->flush()) $result = true;
}
return
$result;
}

/// 以下未实现:
///getStats()
///getVersion()

public function get($key) {
if (
is_array($key)) {
$dest = array();
foreach (
$key as $subkey) {
$val = get($subkey);
if (!(
$val === false)) $dest[$subkey] = $val;
}
return
$dest;
} else {
return
$this->_getConForKey($key)->get($key);
}
}

public function
set($key, $var, $compress=0, $expire=0) {
return
$this->_getConForKey($key)->set($key, $var, $compress, $expire);
}

public function
add($key, $var, $compress=0, $expire=0) {
return
$this->_getConForKey($key)->add($key, $var, $compress, $expire);
}

public function
replace($key, $var, $compress=0, $expire=0) {
return
$this->_getConForKey($key)->replace
($key, $var, $compress, $expire);
}

public function
delete($key, $timeout=0) {
return
$this->_getConForKey($key)->delete($key, $timeout);
}

public function
increment($key, $value=1) {
return
$this->_getConForKey($key)->increment($key, $value);
}

public function
decrement($key, $value=1) {
return
$this->_getConForKey($key)->decrement($key, $value);
}

}
?>
devonweller dot com 的用户
15 年前
在 memcache PECL 扩展版本 2.2.5 中,delete 函数无法与 memcached 1.4.3 一起使用。为了解决此问题,这里提供了一个 memcache PECL 扩展版本,其中包含 harv at pringo dot com 提供的补丁

http://code.google.com/p/phpmemcachepatch/downloads/list

安装方法:下载

http://phpmemcachepatch.googlecode.com/files/memcache-2.2.5b.tgz

并执行

pecl install memcache-2.2.5b.tgz
restlessmind at I dot gmail dot HATE dot com dot SPAM
16 年前
如果您尝试在 Windows 下为 PHP 5.2 安装此模块,但它无法在启动时加载,请确保您已安装所有依赖项,包括正确的 PHP 线程安全版本。

几个小时以来,我一直试图追踪为什么我无法加载 php_memcache.dll,最后我使用了 Dependency Walker(来自 http://www.dependencywalker.com)对 .dll 文件进行分析。这让我意识到,虽然我使用的是非线程安全的 PHP 5.2.5 版本,但 pecl4win 提供的 .dll 却期望使用线程安全的 PHP 版本。一旦我纠正了这一点,一切就正常工作了。
jcastromail at yahoo dot es
17 年前
您好

在 Windows 系统上运行 memcached:(已在最新的 php、apache 和 memcache(XP SP2)上测试)

a) 下载 php_memcache.dll,它可以在 pecl 文件中找到。

b) 将 dll 放入扩展文件夹(例如 c:/php/extension)。您不会错过此文件夹,因为它们包含 php*.dll 文件。在某些情况下,使用的扩展文件夹是 system32,这是一种非标准的放置 dll 的方式,但仍然有效。

c) 配置 php.ini
; 我将其放置在最新的扩展后面
extension=php_memcache.dll

; 我不确定这一点,但不会造成伤害..
[Memcache]
memcache.allow_failover = 1
memcache.max_failover_attempts=20
memcache.chunk_size =8192
memcache.default_port = 11211

d) 这很重要,memcached 使用外部服务。必须先下载并安装此服务才能使用 memcache。我使用: http://jehiah.cz/projects/memcached-win32/

e) 请记住安装服务并启动服务 memcached.exe -d install 用于安装,而 services.msc 用于启动 memcached 服务(或重新启动系统)。

f) 检查防火墙端口。

最后,重新启动 apache/iis 并运行一些测试。至少在 phpinfo 中必须显示有关 memcache 的一些信息。

最终说明:memcache 的“魅力”不仅可以帮助加速某些进程(或减少 CPU 使用率),还可以用作全局会话来存储整个对象,并且此“全局会话”在所有用户之间共享,就像 ASP 中使用的 APPLICATION 一样。因此(例如),可以进行用户计数,而无需数据库或写入文件。
gil at squidoo dot com
17 年前
在使用 flush() 函数时,Aggregator 类中存在一个微小的错误。对 $connections 的引用应为 $this->connections。

更改

public function flush() {
$result = false;
for ($i = 0; $i < count($connections); $i++) {


如果 ( $this->connections[$i]->flush() ) {
$result = true;
}
}
return $result;
}



public function flush() {
$result = false;
for ( $i = 0; $i < count($this->connections); $i++) {
如果 ( $this->connections[$i]->flush() ) {
$result = true;
}
}
return $result;
}
markfrawley at gmail dot com
17 年前
这是一个上面 MemcacheAggregator 类的 PHP4 向后移植版本

<?php
class MemcachedAggregator {
var
$connections;
var
$_servers;

function
MemcachedAggregator($servers) {
$this->_servers = $servers;
// 尝试建立/检索到所有服务器的持久连接。
// 如果任何一个失败,它们就不会被添加到我们的活动连接列表中。
//
moazzamk at gmail dot com
17 年前
如果您扩展了 memcache 类,则不能在类的构造函数中调用 parent::__construct()。但是,不运行构造函数仍然会初始化它并且可以正常工作。



<?php

// 错误示例

class a extends Memcache {
function
__construct($host, $port)
{
parent::__construct();
$this->connect($host, $port);
}

// 正确示例
class a extends Memcache {
function
__construct($host, $port)
{
parent::__construct();
$this->connect($host, $port);
}

?>

我猜测这适用于所有原生/PECL 类。
Ron
19 年前
以上代码的改进

上述类如果所有缓存服务器都宕机,将会导致错误。首选的行为是仅仅出现缓存未命中(或在写入操作的情况下不采取任何操作)并返回 false,以便在所有缓存服务器都宕机的情况下应用程序可以运行在非缓存模式下。

为了实现这一点,只需将每个受影响函数中的连接使用方式更改为类似如下所示的内容。此代码适用于 get() 函数

$con = $this->_getConForKey($key);
if ($con === false) return false;
return $con->get($key);

类似地,set() 函数中受影响的代码将如下所示
$con = $this->_getConForKey($key);
if ($con === false) return false;
return $con->set($key, $var, $compress, $expire);

相应地修改每个函数,如果所有缓存服务器都宕机,您仍然可以运行(尽管由于 100% 的缓存未命中率,速度会变慢)。
contact at codeassembly dot com
16 年前
请注意,无法使用您自己的哈希机制,将一组对象分组到服务器的最佳方法是手动选择要使用的服务器。

我想将某个用户的全部对象保留在同一台服务器上。

user_54_description
user_54_info
user_54_comments
user_54_etc
.
.

如果所有这些对象都在同一台服务器上,我只需要调用一次 memcache -> get (get_multi) 即可获取所有数据,因此这大大提高了性能。

我的做法是将用户/对象 ID 哈希到服务器数量。

<?php
$memcache_hosts
= array
(
'192.168.1.1',
'192.168.1.2',
'192.168.1.3',
'192.168.1.4',
'192.168.1.5',
);

$server = $id % count($memcache_hosts);

$memcache = new Memcache;
$memcache->connect($memcache_hosts[$server], 11211);

// 在此处获取或设置您的对象
?>

您可以将不想分组的其他对象留给 memcache 扩展进行哈希并选择合适的服务器。
Colin Guthrie
17 年前
我发现了一个错误/文档错误

以上文档关于 session.save_path 参数说明如下
"每个 URL 都可能包含应用于该服务器的参数,它们与 Memcache::addServer() 方法的参数相同。"

addServer 方法的文档说明如下
"端口

指向 memcached 正在监听连接的端口。此参数是可选的,其默认值为 11211。当使用 UNIX 域套接字时,将此参数设置为 0。"

但是,在指定 save_path 时,我发现使用 PHP 5.2.3 和 memcache 2.1.2 时,端口是字符串的*必需*部分。

希望这对一些挠头的人有所帮助。
To Top