PHP 8.4.0 RC4 available for testing

Memcached::getMulti

(PECL memcached >= 0.1.0)

Memcached::getMultiObtener varios ítems

Descripción

public Memcached::getMulti(array $keys, array &$cas_tokens = ?, int $flags = ?): mixed

Memcached::getMulti() es similar a Memcached::get(), pero en lugar de un único ítem de clave, obtiene varios ítems cuyas claves se especifican en el array keys. Si se proporciona la variable cas_tokens, esta contendrá los token CAS para los ítems que se hayan encontrado.

Nota:

A diferencia de Memcached::get() no es posible especificar una retrollamada de caché de lectura previa para Memcached::getMulti(), porque el protocolo memcache no provee información de las claves que no se encontraron en la petición de claves múltiple.

El parámetro flags se puede emplear para especificar opciones adicionales para Memcached::getMulti(). Actualmente, la única opción disponible es Memcached::GET_PRESERVE_ORDER, que garantiza que las claves sean devueltas en el mismo orden en que fueron solicitadas.

Parámetros

keys

Array de claves a obtener.

cas_tokens

La variable donde guardar los token CAS de los ítems encontrados.

flags

Los indicadores para la operación de obtención (get).

Valores devueltos

Devuelve el array de ítems encontrados o false en caso de error. Emplee Memcached::getResultCode() si fuera necesario.

Ejemplos

Ejemplo #1 Ejemplo de Memcached::getMulti()

<?php
$m
= new Memcached();
$m->addServer('localhost', 11211);

$ítems = array(
'clave1' => 'valor1',
'clave2' => 'valor2',
'clave3' => 'valor3'
);
$m->setMulti($ítems);
$resultado = $m->getMulti(array('clave1', 'clave3', 'clave_errónea'), $cas);
var_dump($resultado, $cas);
?>

El resultado del ejemplo sería algo similar a:

array(2) {
  ["clave1"]=>
  string(6) "valor1"
  ["clave3"]=>
  string(6) "valor3"
}
array(2) {
  ["clave1"]=>
  float(2360)
  ["clave3"]=>
  float(2362)
}

Ejemplo #2 Ejemplo de Memcached::GET_PRESERVE_ORDER

<?php
$m
= new Memcached();
$m->addServer('localhost', 11211);

$data = array(
'foo' => 'foo-data',
'bar' => 'bar-data',
'baz' => 'baz-data',
'lol' => 'lol-data',
'kek' => 'kek-data',
);

$m->setMulti($data, 3600);

$null = null;
$claves = array_keys($data);
$claves[] = 'zoo';
$obtenidas = $m->getMulti($claves, $null, Memcached::GET_PRESERVE_ORDER);

foreach (
$obtenidas as $c => $v) {
echo
"$c $v\n";
}
?>

El resultado del ejemplo sería algo similar a:

foo foo-data
bar bar-data
baz baz-data
lol lol-data
kek kek-data
zoo

Ver también

add a note

User Contributed Notes 1 note

up
1
gabriel dot maybrun at demandmedia dot com
10 years ago
GOTCHA: Recently I was tasked with moving from PECL memcache to PECL memcached and ran into a major problem -- memcache and memcached serialize data differently, meaning that data written with one library can't necessarily be read with the other library.

For example, If you write an object or an array with memcache, it's interpreted as an integer by memcached. If you write it with memcached, it's interpreted as a string by memcache.

tl;dr - You can't safely switch between memcache and memcached without a either a cache flush or isolated cache environments.

<?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'));
}
}
To Top