PHP Conference Japan 2024

Memcache::get

(PECL memcache >= 0.2.0)

Memcache::get从服务器检索项目

描述

Memcache::get(string $key, int &$flags = ?): string
Memcache::get(array $keys, array &$flags = ?): array

Memcache::get() 返回先前存储的项目数据(如果此时服务器上存在此类 key)。

您可以将键数组传递给 Memcache::get() 以获取值数组。结果数组将仅包含找到的键值对。

参数

key

要获取的键或键数组。

flags

如果存在,则与值一起获取的标志将写入此参数。这些标志与例如 Memcache::set() 中提供的标志相同。整数的最低位字节保留供 pecl/memcache 内部使用(例如,指示压缩和序列化状态)。

返回值

keyarray 时,返回与 key 关联的值或找到的键值对数组。如果失败、找不到 keykey 是空的 array,则返回 false

示例

示例 #1 Memcache::get() 示例

<?php

/* 过程式 API */
$memcache_obj = memcache_connect('memcache_host', 11211);
$var = memcache_get($memcache_obj, 'some_key');

/* OO API */
$memcache_obj = new Memcache;
$memcache_obj->connect('memcache_host', 11211);
$var = $memcache_obj->get('some_key');

/*
您也可以使用键数组作为参数。
如果服务器上找不到此类项目,则结果
数组将不包含此类键。
*/

/* 过程式 API */
$memcache_obj = memcache_connect('memcache_host', 11211);
$var = memcache_get($memcache_obj, Array('some_key', 'another_key'));

/* OO API */
$memcache_obj = new Memcache;
$memcache_obj->connect('memcache_host', 11211);
$var = $memcache_obj->get(Array('some_key', 'second_key'));

?>

添加注释

用户贡献的注释 7 条注释

clover at fromru dot com
11 年前
如果服务器上找不到 $key,则 $flags 保持不变,这有助于确定是否存储了 bool(false)

<?php

$memcache
= new Memcache();

$memcache->set('test', false); //
$flags = false;
var_dump($memcache->get('test', $flags)); // bool(false)
var_dump($flags); // int(256) - 更改为 int

$memcache->delete('test');

$flags = false;
var_dump($memcache->get('test', $flags)); // bool(false)
var_dump($flags); // bool(false) - 未更改

?>
Michael Brenden
13 年前
注意,如果键名中存在反斜杠,则结果是不可预测和随机的。

我这样生成键

$mc_key = get_called_class(). $_COOKIE['crumb'];

当 get_called_class() 返回 CLASSNAME 时,这工作正常。

但是当我开始使用命名空间时,get_class_class() 当然返回 NAMESPACE\CLASSNAME

好吧,那个反斜杠让 Memcache 非常混乱。
请注意,没有错误,只是混乱。
bijay dot rungta at gmail dot com
11 年前
请注意,如果您在保存数据时在键中包含空格,并使用键数组来获取数据,则返回的数组将用下划线替换键中的空格。

<?php

$memcache
= new Memcache;
$memcache->connect('localhost');
$memcache->set('my-key', 'value1', 0, 300);
$memcache->set('key with space', 'value 2', 0, 300);

print_r($memcache->get(array('my-key', 'key with space'))); // 数组 ( [my-key] => value1 [key_with_space] => value 2 )

?>

Memcache在保存时会用下划线替换空格,获取数据时也一样。但是,如果只使用单个键(字符串)进行获取,则不会注意到这一点,因为它只会返回value值。但如果使用键数组进行获取,则返回数组中的键名空格会被替换成下划线。
csongor at halmai dot hu
10年前
避免从memcache读取过多值。每次get()操作都会消耗一些内存。读取值后,应该缓存这些值。这是不良实践的示例

<?php // 从memcache读取会造成内存泄漏

$m = new Memcache();
$m -> connect( "localhost", "11211" );
$m -> add("foo", "bar");

for(;;) {
// 此“无限”循环将结束,因为它耗尽了所有内存
$res = $m -> get("foo");
print
memory_get_usage()."\n"; // 这将输出越来越大的数字
}
jakub dot lopuszanski at nasza-klasa dot pl
16年前
如果反序列化失败,例如memcache服务器返回标志位1,但值不是正确序列化的PHP数据时,
则Memcache::get的行为如下:

如果使用单个键进行检索,则会发出警告,但由于它实际上不是服务器的错误,警告信息会比较混乱,例如“Memcached Server Error: null”,并且函数返回bool(false)。

如果通过传递数组(即使只有一个元素)来调用,则不会发出警告,并且生成的数组包含值bool(false)。

由于Memcached服务器中存在一些缓冲区溢出错误,这些错误有时会导致数据被[部分]覆盖,从而无法反序列化,因此请确保检查Memcache::get的结果是否只包含字符串或反序列化的结构。如果结果是bool、double或long,则说明出现问题。
a dot karabiowski at gmx dot net
10年前
签名不正确。

<?php
$memcache
= new Memcache();
$memcache->connect('localhost', 11211);
class
Test { public $property = "testvalue"; }
$test = new Test();
$memcache->set("asdf", $test);
var_dump($memcache->get("asdf"));
/* 将返回对象,而不是字符串:
class Test#3 (1) {
public $property =>
string(9) "testvalue"
}
*/
?>
nate
16年前
请注意,当使用多键版本时,如果池中未配置服务器(以及在尝试获取时可能还会出现其他错误),Memcache::get将返回bool false。此外,如果未向池中添加任何服务器,则Memcache类会在每次get/set/delete类型调用时都会发出烦人的警告。

以下代码片段将输出bool false,而不是您可能期望的空数组。

<?php
$cache
= new Memcache;

// 没有 $cache->addServer 调用(例如,
由于暂时禁用 缓存的使用)

// 使用 @ 符号忽略警告

var_dump(
@
$cache->get(array('one', 'two'))
);
?>
To Top