# mysqlnd_ms_query_is_select

(PECL mysqlnd_ms >= 1.0.0)

mysqlnd_ms_query_is_select — 查询给定的 SQL 会发送给 master、slave 还是最后使用的 MySQL server 执行。

### 说明

mysqlnd_ms_query_is_select ( string `$query` ) : int

查询给定的 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("/*" . MYSQLND_MS_LAST_USED_SWITCH . "*/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.
    /*ms=last_used*/SELECT 2 FROM DUAL should be run on the server that has run the previous query

### 参见

- Predefined Constants
- user filter

- Runtime configuration
- mysqlnd_ms.disable_rw_split
- mysqlnd_ms.enable