文字

mysqlnd_qc_set_is_select

(PECL mysqlnd_qc >= 1.0.0)

mysqlnd_qc_set_is_selectInstalls a callback which decides whether a statement is cached

说明

mixed mysqlnd_qc_set_is_select ( string $callback )

Installs a callback which decides whether a statement is cached.

There are several ways of hinting PELC/mysqlnd_qc to cache a query. By default, PECL/mysqlnd_qc attempts to cache a if caching of all statements is enabled or the query string begins with a certain SQL hint. The plugin internally calls a function named is_select() to find out. This internal function can be replaced with a user-defined callback. Then, the user-defined callback is responsible to decide whether the plugin attempts to cache a statement. Because the internal function is replaced with the callback, the callback gains full control. The callback is free to ignore the configuration setting mysqlnd_qc.cache_by_default and SQL hints.

The callback is invoked for every statement inspected by the plugin. It is given the statements string as a parameter. The callback returns FALSE if the statement shall not be cached. It returns TRUE to make the plugin attempt to cache the statements result set, if any. A so-created cache entry is given the default TTL set with the PHP configuration directive mysqlnd_qc.ttl. If a different TTL shall be used, the callback returns a numeric value to be used as the TTL.

The internal is_select function is part of the internal cache storage handler interface. Thus, a user-defined storage handler offers the same capabilities.

参数

此函数没有参数。

返回值

成功时返回 TRUE , 或者在失败时返回 FALSE

范例

Example #1 mysqlnd_qc_set_is_select() example

<?php

function  is_select ( $query ) {
  static 
$patterns  = array(
   

   
"@SELECT\s+.*\s+FROM\s+test@ismU"  =>  true ,
   

   
"@SELECT\s+.*\s+FROM\s+news@ismU"  =>  3
  
);
  

  
foreach ( $patterns  as  $pattern  =>  $ttl ) {
    if (
preg_match ( $pattern $query )) {
      
printf ( "is_select(%45s): cache\n" $query );
      return 
$ttl ;
    }
  }
  
printf ( "is_select(%45s): do not cache\n" $query );
  return 
false ;
}
mysqlnd_qc_set_is_select ( "is_select" );


$mysqli  = new  mysqli ( "host" "user" "password" "schema" );
$mysqli -> query ( "DROP TABLE IF EXISTS test" );
$mysqli -> query ( "CREATE TABLE test(id INT)" );
$mysqli -> query ( "INSERT INTO test(id) VALUES (1), (2), (3)" );


$mysqli -> query ( "SELECT id FROM test WHERE id = 1" );

$mysqli -> query ( "SELECT id FROM test WHERE id = 1" );

$mysqli -> query ( "SELECT * FROM test" );
?>

以上例程会输出:

is_select(                    DROP TABLE IF EXISTS test): do not cache
is_select(                    CREATE TABLE test(id INT)): do not cache
is_select(    INSERT INTO test(id) VALUES (1), (2), (3)): do not cache
is_select(             SELECT id FROM test WHERE id = 1): cache
is_select(             SELECT id FROM test WHERE id = 1): cache
is_select(                           SELECT * FROM test): cache

参见

  • Runtime configuration
  • mysqlnd_qc.ttl
  • mysqlnd_qc.cache_by_default
  • mysqlnd_qc_set_user_handlers() - Sets the callback functions for a user-defined procedural storage handler
上一篇: 下一篇: