Query: mysqlnd_ms_set_user_pick_server
OS: php
Section: 3
Format: Original Unix Latex Style Formatted with HTML and a Horizontal Scroll Bar
MYSQLND_MS_SET_USER_PICK_SERVER(3) 1 MYSQLND_MS_SET_USER_PICK_SERVER(3) mysqlnd_ms_set_user_pick_server - Sets a callback for user-defined read/write splittingSYNOPSISbool mysqlnd_ms_set_user_pick_server (string $function)DESCRIPTIONSets a callback for user-defined read/write splitting. The plugin will call the callback only if pick[]=user is the default rule for server picking in the relevant section of the plugins configuration file. The plugins built-in read/write query split mechanism decisions can be overwritten in two ways. The easiest way is to prepend the query string with the SQL hints MYSQLND_MS_MASTER_SWITCH, MYSQLND_MS_SLAVE_SWITCH or MYSQLND_MS_LAST_USED_SWITCH. Using SQL hints one can con- trol, for example, whether a query shall be send to the MySQL replication master server or one of the slave servers. By help of SQL hints it is not possible to pick a certain slave server for query execution. Full control on server selection can be gained using a callback function. Use of a callback is recommended to expert users only because the callback has to cover all cases otherwise handled by the plugin. The plugin will invoke the callback function for selecting a server from the lists of configured master and slave servers. The callback function inspects the query to run and picks a server for query execution by returning the hosts URI, as found in the master and slave list. If the lazy connections are enabled and the callback chooses a slave server for which no connection has been established so far and estab- lishing the connection to the slave fails, the plugin will return an error upon the next action on the failed connection, for example, when running a query. It is the responsibility of the application developer to handle the error. For example, the application can re-run the query to trigger a new server selection and callback invocation. If so, the callback must make sure to select a different slave, or check slave availability, before returning to the plugin to prevent an endless loop.PARAMETERSo $function - The function to be called. Class methods may also be invoked statically using this function by passing array($classname, $methodname) to this parameter. Additionally class methods of an object instance may be called by passing array($objectinstance, $methodname) to this parameter.RETURN VALUESHost to run the query on. The host URI is to be taken from the master and slave connection lists passed to the callback function. If call- back returns a value neither found in the master nor in the slave connection lists the plugin will fallback to the second pick method con- figured via the pick[] setting in the plugin configuration file. If not second pick method is given, the plugin falls back to the build-in default pick method for server selection.NOTESNote mysqlnd_ms_set_user_pick_server(3) is available with PECL mysqlnd_ms < 1.1.0. It has been replaced by the user filter. Please, check the Change History for upgrade notes.EXAMPLESExample #1 mysqlnd_ms_set_user_pick_server(3) example [myapp] master[] = localhost slave[] = 192.168.2.27:3306 slave[] = 192.168.78.136:3306 pick[] = user <?php function pick_server($connected, $query, $master, $slaves, $last_used) { static $slave_idx = 0; static $num_slaves = NULL; if (is_null($num_slaves)) $num_slaves = count($slaves); /* default: fallback to the plugins build-in logic */ $ret = NULL; printf("User has connected to '%s'... ", $connected); printf("... deciding where to run '%s' ", $query); $where = mysqlnd_ms_query_is_select($query); switch ($where) { case MYSQLND_MS_QUERY_USE_MASTER: printf("... using master "); $ret = $master[0]; break; case MYSQLND_MS_QUERY_USE_SLAVE: /* SELECT or SQL hint for using slave */ if (stristr($query, "FROM table_on_slave_a_only")) { /* a table which is only on the first configured slave */ printf("... access to table available only on slave A detected "); $ret = $slaves[0]; } else { /* round robin */ printf("... some read-only query for a slave "); $ret = $slaves[$slave_idx++ % $num_slaves]; } break; case MYSQLND_MS_QUERY_LAST_USED: printf("... using last used server "); $ret = $last_used; break; } printf("... ret = '%s' ", $ret); return $ret; } mysqlnd_ms_set_user_pick_server("pick_server"); $mysqli = new mysqli("myapp", "root", "root", "test"); if (!($res = $mysqli->query("SELECT 1 FROM DUAL"))) printf("[%d] %s ", $mysqli->errno, $mysqli->error); else $res->close(); if (!($res = $mysqli->query("SELECT 2 FROM DUAL"))) printf("[%d] %s ", $mysqli->errno, $mysqli->error); else $res->close(); if (!($res = $mysqli->query("SELECT * FROM table_on_slave_a_only"))) printf("[%d] %s ", $mysqli->errno, $mysqli->error); else $res->close(); $mysqli->close(); ?> The above example will output: User has connected to 'myapp'... User has connected to 'myapp'... User has connected to 'myapp'...SEE ALSOmysqlnd_ms_query_is_select(3), Filter concept, user filter . PHP Documentation Group MYSQLND_MS_SET_USER_PICK_SERVER(3)