2012-07-17 6 views
5

¿Es posible utilizar un método que le permita eliminar las entradas de la APC almacenadas con expresiones regulares?Eliminar claves de la APC almacenadas con una expresión regular

Por ejemplo, algunas consultas de usuarios que deseo eliminar de la memoria caché cuando se ingresan nuevos datos en la base de datos para que se muestren los nuevos datos la próxima vez que se ejecute la consulta.

Digamos que tiene una consulta lista de amigos que se almacena en caché, pero cuando un nuevo amigo se añade todas las consultas amigo en caché para ese usuario se suprimiría ...

Si tengo las llaves de este tipo para los usuarios de amigos:

$sql = "SELECT * FROM friends WHERE userId = :userId"; 

$sqlKey = str_replace(":userId", $userId, $sql);  
$key = $userId."-friend".md5('query'.$sqlKey); 

$data = friendsArray; 
apc_add($key, $data, 60 * 10); 

Entonces el resultado deseado sería la de eliminar todas las entradas que se inició con el ID de usuario actual después de ejecutar la consulta amigo agregar nuevos para asegurar la lista de amigos muestra el nuevo usuario en la siguiente observación:

apc_delete("~$userId-friend([a-f0-9]+)~"); 

Como la lista de amigos sql y la adición de friend sql están en documentos diferentes, esta parece ser la forma más sencilla de hacerlo sin necesidad de volver a escribir y codificar el sql, pero no creo que las expresiones regulares sean compatibles.

+0

Duplicar posibles: http://stackoverflow.com/questions/4785153/delete-cache-by-name-in-apc-memcache-eaccelerator –

Respuesta

3

Como J Fox wrote on php.net, apc_delete también acepta una matriz de teclas o un objeto APCIterator. Y APCIterator acepta expresiones regulares. Así que el código debe mirar a su alrededor así:

// delete all keys beginning with a regex match 
$toDelete = new APCIterator('user', '/^' . $userId . '-friend([a-f0-9]+)/', APC_ITER_VALUE); 

var_dump(apc_delete($toDelete)); 
// returns boolean true|false on success or failure 
Cuestiones relacionadas