©
This document uses PHP Chinese website manual Release
(PECL mysqlnd_ms >= 1.0.0)
mysqlnd_ms_query_is_select — 查询给定的 SQL 会发送给 master、slave 还是最后使用的 MySQL server 执行。
$query
)查询给定的 SQL 会发送给 master、slave 还是最后使用的 MySQL server 执行。
插件内置的读写分离会分析 SQL,然后决定到底把他发送到哪里执行。这个读写分离器非常 的基本和简单。插件会将所有的查询发送给 master,除非他以 SELECT 开头,或者使用 SQL hints 指定要去 slave 执行。因为这个读写分离很简单, 所以会将一些只读查询发送给主从同步的 master,例如:SHOW TABLES。
query
要测试的 SQL 字符串。
返回 MYSQLND_MS_QUERY_USE_MASTER
说明发送给 master。
返回 MYSQLND_MS_QUERY_USE_SLAVE
说明是一个只读语句,
将发送给 slave 执行。返回 MYSQLND_MS_QUERY_USE_LAST_USED
说明会在上一次执行的服务器连接中执行,这可能是 master 也可能是 slave。
如果通过设定 mysqlnd_ms.disable_rw_split 禁用了读写分离,
那么函数可能返回 MYSQLND_MS_QUERY_USE_MASTER
或者返回
MYSQLND_MS_QUERY_USE_LAST_USED
。
Example #1 mysqlnd_ms_query_is_select() example
<?php
function is_select ( $query )
{
switch ( mysqlnd_ms_query_is_select ( $query ))
{
case MYSQLND_MS_QUERY_USE_MASTER :
printf ( "'%s' should be run on the master.\n" , $query );
break;
case MYSQLND_MS_QUERY_USE_SLAVE :
printf ( "'%s' should be run on a slave.\n" , $query );
break;
case MYSQLND_MS_QUERY_USE_LAST_USED :
printf ( "'%s' should be run on the server that has run the previous query\n" , $query );
break;
default:
printf ( "No suggestion where to run the '%s', fallback to master recommended\n" , $query );
break;
}
}
is_select ( "INSERT INTO test(id) VALUES (1)" );
is_select ( "SELECT 1 FROM DUAL" );
is_select ( "SELECT 2 FROM DUAL" );
?>
以上例程会输出:
INSERT INTO test(id) VALUES (1) should be run on the master. SELECT 1 FROM DUAL should be run on a slave. SELECT 2 FROM DUAL should be run on the server that has run the previous query