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() 给出的标志相同。int 的最低字节保留用于 pecl/memcache 内部使用(例如,用于指示压缩和序列化状态)。

返回值

返回与 key 关联的值,或当 keyarray 时返回找到的键值对数组。如果失败,返回 falsekey 未找到或 key 是一个空的 array

示例

示例 #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'));

?>

添加说明

用户贡献说明 8 说明

12
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) - 不变

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

我生成了这样的键

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

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

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

好吧,那个反斜杠让 Memcache 陷入一片混乱。
没有错误,不过就是疯狂。
4
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'))); // Array ( [my-key] => value1 [key_with_space] => value 2 )

?>

Memcache 在保存时用下划线替换空格,在执行 get 时也会这样做,但是当您使用单个键(字符串)执行 get 时,您不会注意到这一点,因为它只是返回该值。但是,当您对键数组执行 get 时,您会期望返回的数组中具有相同的键,但它会用下划线替换其中的空格。
1
csongor at halmai dot hu
9 年前
避免从 memcahce 读取过多值。每个 get() 都会消耗一些内存。您应该缓存这些值,一旦它们被读取。

<?php // 从 memcache 读取导致内存泄漏

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

for(;;) {
// 这个“无限”循环最终会结束,因为它会消耗掉所有内存
$res = $m -> get("foo");
print
memory_get_usage()."\n"; // 这将输出越来越大的数字
}
0
jakub dot lopuszanski at nasza-klasa dot pl
16 年前
如果反序列化失败,例如 memcache 服务器返回了 flag 1 设置,但值不是正确序列化的 PHP 数据,
那么 Memcache::get 会以以下方式运行。

如果使用单个键来检索,则会发出警告,但由于这不是服务器的实际错误,因此警告会显示类似“Memcached Server Error: null”的令人困惑的提示,并且函数将返回 bool(false)。

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

由于 Memcached 服务器中存在一些缓冲区溢出错误,这些错误有时会导致 [部分] 数据被覆盖,从而导致无法反序列化,因此请确保检查 Memcache::get 的结果是否只包含字符串或反序列化的结构。如果结果是 bool、double 或 long,则说明出现问题。
-2
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"
}
*/
?>
-2
nate
15 年前
请注意,在使用多键版本时,如果池中未配置任何服务器(以及可能在尝试获取期间出现其他错误时),Memcache::get 会返回 bool false。此外,如果在池中没有添加任何服务器,Memcache 类会在每次 get/set/delete 类型调用时抛出烦人的警告。

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

<?php
$cache
= new Memcache;

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

// 使用 @ 符号忽略警告

var_dump(
@
$cache->get(array('one', 'two'))
);
?>
-11
janis at unrepublic dot com
14 年前
对我来说,如果这样的键不存在,则返回 null 而不是 false。
To Top