(PECL mysqlnd_qc >= 1.0.0)
mysqlnd_qc_set_is_select — Instala una llamada de retorno que decide si una sentencia es almacenada en caché
Instala una llamada de retorno que decide si una sentencia es almacenada en caché.
Hay varias maneras de indicarle a PELC/mysqlnd_qc que almacene en caché una consulta.
Por omisión, PECL/mysqlnd_qc intenta almacenar en caché un a consulta si está habilitado el almacenamiento
de todas las consultas o si la cadena de consulta comienza con una sugerencia SQL en particular.
El complemento invoca internamente a una función llamada is_select()
para averiguarlo. Esta función interna puede ser reemplazada con una llamada de retorno definida por el usuario.
Entonces, dicha llamada de retorno definida por el usuario es responsable de decidir si el complemento
intentará almacenar en caché una consulta. Debido a que la función interna es reemplazada por la llamada
de retorno, ésta obtiene control total. La llamada de retorno es libre de ignorar
el ajuste de configuración mysqlnd_qc.cache_by_default
y las sugerencias SQL.
La llamada de retorno se invoca para cada sentencia inspeccionada por el complemento.
Se le proporciona la cadena de sentencia como parámetro. La llamada de retorno devuelve
false
si la sentencia no fuera almacenada en caché. Devuelve true
para
hacer que el complemento intente almacenar en caché el conjunto de resultados de la sentencia, si exite.
A una entrada de la caché creada de tal manera se le da el TTL predeterminado establecido con la
directiva de configuración de PHP mysqlnd_qc.ttl
.
Si se usara un TTL diferente, la llamada de retorno devuelve un valor
numérico que se usará como TTL.
La función interna is_select
es parte de la interfaz interna
del gestor de almacenamiento en caché. Por lo tanto, un gestor de almacenamiento definido
por el usuario ofrece las mismas capacidades.
Esta función no tiene parámetros.
Devuelve true
en caso de éxito o false
en caso de error.
Ejemplo #1 Ejemplo de mysqlnd_qc_set_is_select()
<?php
/* llamada de retorno que decide si una consulta es almacenada en caché */
function is_select($query) {
static $patterns = array(
/* true - usar lo predeterminado por mysqlnd_qc.ttl */
"@SELECT\s+.*\s+FROM\s+test@ismU" => true,
/* 3 - usar TTL = 3 segundos */
"@SELECT\s+.*\s+FROM\s+news@ismU" => 3
);
/* comprobar si la consulta coincide con el patrón */
foreach ($patterns as $pattern => $ttl) {
if (preg_match($pattern, $query)) {
printf("is_select(%45s): almacenada en caché\n", $query);
return $ttl;
}
}
printf("is_select(%45s): no almacenada en caché\n", $query);
return false;
}
mysqlnd_qc_set_is_select("is_select");
/* Conectar, crear y rellenar la tabla test */
$mysqli = new mysqli("host", "usuario", "contraseña", "esquema");
$mysqli->query("DROP TABLE IF EXISTS test");
$mysqli->query("CREATE TABLE test(id INT)");
$mysqli->query("INSERT INTO test(id) VALUES (1), (2), (3)");
/* colocada en la caché */
$mysqli->query("SELECT id FROM test WHERE id = 1");
/* coincidencia con la caché */
$mysqli->query("SELECT id FROM test WHERE id = 1");
/* colocada en la caché */
$mysqli->query("SELECT * FROM test");
?>
El resultado de los ejemplos sería:
is_select( DROP TABLE IF EXISTS test): no almacenada en caché is_select( CREATE TABLE test(id INT)): no almacenada en caché is_select( INSERT INTO test(id) VALUES (1), (2), (3)): no almacenada en caché is_select( SELECT id FROM test WHERE id = 1): almacenada en caché is_select( SELECT id FROM test WHERE id = 1): almacenada en caché is_select( SELECT * FROM test): almacenada en caché