SMProxy
A MySQL database connection pool based on MySQL protocol and Swoole.
https://github.com/louislivi/SMProxy
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.
USE
y otros estados de comandos SQL encadenados
HANDLER
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. |
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.
SMProxy
A MySQL database connection pool based on MySQL protocol and Swoole.
https://github.com/louislivi/SMProxy