Agrupación e intercambio de conexiones

El complemento de replicación y equilibrado de carga cambia la semántica de un gestor de conexión de MySQL para PHP. Las APIs existentes de las extensiones de MySQL para PHP (mysqli, mysql, y PDO_MYSQL) no son cambiadas en la manera de que no son añadidas ni eliminadas funciones. Pero su comportamiento cambia al utilizar el complemento. Las aplicaciones existentes no necesitan ser adaptadas a la nueva API, aunque podrían requerir ser modificadas a causa de los cambios de comportamiento.

El complemento rompe la relación uno-a-uno entre un gestor de conexión de mysqli, mysql, y PDO_MYSQL y una conexión de red MySQL. Un gestor de conexión de mysqli, mysql, y PDO_MYSQL representa una agrupación local de conexiones para los servidores maestros de replicación MySQL y esclavos de replicación MySQL configurados. El complemento redirige las consultas a los servidores maestros y esclavos. En algún momento, el mismo gestor de conexión de PHP podría apuntar al servidor maestro de MySQL. Después, podría apuntar a uno de los servidores esclavos o todavía al maestro. La manipulación y el reemplazamiento de la conexión de red referida por un gestor de conexión de MySQL para PHP no es una operación transparente.

Cada conexión MySQL tiene un estado. El estado de la conexión en la agrupación de conexiones del complemento puede diferir. Siempre que el complemento cambie de una conexión de cable a otra, el estado actual de la conexión del usuario puede cambiar. Las aplicaciones deben considerar esto.

La siguiente lista muestra en qué consiste el estado de conexión. La lista podría no ser completa.

  • Estado de transacción
  • Tablas temporales
  • Bloqueos de tablas
  • Variables de sistema de sesión y variables de usuario de sesión
  • La base de datos actual establecida mediante USE y otros estados de comandos SQL encadenados
  • Sentencias preparadas
  • Variables HANDLER
  • Bloqueos adquiridos con GET_LOCK()

EL intercambio de conexiones ocurre justo antes de la ejecución de las consultas. El complemento no intercambia la conexión actual hasata que sea ejecutada la siguiente sentencia.

Nota: Sobre la replicación

Véase también el capítulo sobre las » características de la replicación y temas relacionados del manual de referencia de MySQL. Algunas restricciones pueden no estar relacionadas con el complemento de PHP, pero son propiedades del sistema de replicación de MySQL.

Mensajes de difusión

La filosofía de complemento es alinear el estado de las conexiones en la agrupación solamente si el estado está bajo el control total del complemento, o si fuera necesario por razones de seguridad. Solamente una pocas acciones que cambian el estado de la conexión caen en esta categoría.

La siguiente es una lista de las llamadas a la biblioteca cliente de conexiones que cambian el estado, y son difundidas a todas las conexiones abiertas en la agrupación de conexiones.

Si va a ejecutar cualquier llamada enumerada abajo, el complemento iterará a través de todas las conexiones maestras y esclavas abiertas. El bucle continua hasta que todos los servidores hayan sido contactados, y no se detiene si un servidor indica un fallo. Si es posible, el fallo se propagará a la función de la API de usuario llamada, la cual puede ser detectada dependiendo de la función de la biblioteca subyacente que fue desencadenda.

Llamada a la bliblioteca Notas Versión
change_user() Invocada por la llamda a la API de usuario de mysqli_change_user(). También es desencadenada una vez que se reutiliza una conexión persistente de mysqli. Desde 1.0.0.
select_db Invocada por las sigientes llamadas a la API de usuario: mysql_select_db(), mysql_list_tables(), mysql_db_query(), mysql_list_fields(), mysqli_select_db(). Observe que USE de SQL no se monitoriza. Desde 1.0.0.
set_charset() Invocada por las sigientes llamadas a la API de usuario: mysql_set_charset(). mysqli_set_charset(). Observe que SET NAMES de SQL no se monitoriza. Desde 1.0.0.
set_server_option() Invocada por las sigientes llamadas a la API de usuario: mysqli_multi_query(), mysqli_real_query(), mysqli_query(), mysql_query(). Desde 1.0.0.
set_client_option() Invocada por las sigientes llamadas a la API de usuario: mysqli_options(), mysqli_ssl_set(), mysqli_connect(), mysql_connect(), mysql_pconnect(). Desde 1.0.0.
set_autocommit() Invocada por las sigientes llamadas a la API de usuario: mysqli_autocommit(), PDO::setAttribute(PDO::ATTR_AUTOCOMMIT). Desde 1.0.0. PHP >= 5.4.0.
ssl_set() Invocada por las sigientes llamadas a la API de usuario: mysqli_ssl_set(). Desde 1.1.0.

Difusión y conexiones retardadas

El complemento no delega o recuerda todas las configuraciones para aplicarlas a conexiones abiertas en el futuro. Es importante recordar esto si se usan conexiones retardadas. Las conexiones retardadas son conexiones que no se abren antes de que el cliente envíe la primera conexión. El uso de conexiones retardadas es la acción predeterminada del complemento.

Cada una de las siguientes llamadas a la biblioteca de conexiones cambia el estado, y su ejecución es recordada para un uso posterior cuando se abren las conexiones retardadas. Esto ayuda a asegurarse de que los estados de conexión de todas las conexiones de la agrupación de conexiones sean equiparables.

Llamada a la biblioteca Notas Versión
change_user() Usuario, contraseña y base de datos recordados para un uso posterior. Desde 1.1.0.
select_db Bases de datos recordada par un uso posterior. Desde 1.1.0.
set_charset() Las llamadas a set_client_option(MYSQL_SET_CHARSET_NAME, charset) sobre conexiones retardadas aseguran que charset será utilizado una vez abierta la conexión retardada. Desde 1.1.0.
set_autocommit() Añade SET AUTOCOMMIT=0|1 a la lista de comandos 'init' en una conexión retardada usando set_client_option(MYSQL_INIT_COMMAND, "SET AUTOCOMMIT=...%quot;). Desde 1.1.0. PHP >= 5.4.0.
Precaución

Estado de la conexión

El estado de la conexión no sólo se cambia mediante las llamadas a la API. Incluso si PECL mysqlnd_ms monitoriza todas las llamadas a la API, la aplicación aún deben considerarlo. En última instancia, es responsabilidad de las aplicaciones guardar el estado de la conexión, si fuera necesario.

Conjunto de caracteres y escape de cadenas

Debido al uso de conexiones retardadas, las cuales se emplean predeterminadamente, puede ocurrir que una aplicación intente escapar una cadena para usarla dentro de sentencias SQL antes de que una conexión haya sido establecida. En este caso, no es posible escapar la cadena. La función de escapado de cadenas no conoce el conjunto de caracteres a usar antes de que una conexión haya sido establecida.

Para superar este problema, el nuevo ajuste de configuración server_charset se introdujo en la versión 1.4.0.

Se debe prestar atención al escapar cadenas con ciertos conjuntos de caracteres si no es usando el resultado en una conexión que utilice un conjunto de caracteres diferente. Observe que PECL/mysqlnd_ms manipula las conexiones y que una conexión a nivel de aplicación representa una agrupación de múltiples conexiones donde todas pueden tener diferentes conjuntos de caracteres predeterminados. Se recomienda configurar los servidores involucrados para que utilicen el mismo conjunto de caracteres predeterminado. El ajuste de configuración server_charset también ayuda con esta situación. Si se usa server_charset, el complemento establecerá el conjunto de caracteres dado en todas las conexiones recientemente abiertas.