Actualmente estoy usando PHP PDO para acceder a mi base de datos. Eso está funcionando absolutamente bien y elegante. Sin embargo, voy a agregar réplicas de lectura a la configuración de mi servidor, por lo que deseo ajustar mi código en consecuencia.¿Cómo creo un "interruptor de modo" para PHP PDO?
Mi plan de acción actual es almacenar una matriz de detalles de las credenciales de la base de datos. Un conjunto de "lectura y escritura" para la base de datos maestra de MySQL y cualquier cantidad de credenciales para "réplicas de lectura".
Lo que deseo hacer es agregar un método a la clase PDO llamada "modo" donde por un modo se pasa, como "leer" o (por defecto) "escribir". Pasando esto a través (ej. $ Dbh-> mode ("read");), puede buscar los detalles de una réplica de lectura aleatoria (sin preocuparse de cuál) y usar esos detalles para la conexión. Luego, una vez que termine de leer mis réplicas, haga otro $ dbh-> mode ("predeterminado") para ponerlo nuevamente en modo de escritura, con lo cual puedo usar INSERTAR, ACTUALIZAR, etc.
¿Esto se puede hacer sin simplemente destruyendo el objeto PDO y creando uno nuevo? ¿Pueden los detalles de conexión simplemente cambiarse después de que el objeto ya exista?
Hasta ahora tengo lo siguiente (es apenas cualquier cosa, pero supongo que es un comienzo).
Class SwitchablePDO extends PDO
{
public function mode($mode = "default")
{
// Use the credentials for my master read and write server by default
if($mode == "read")
{
// Use one the credentials for my read replicas (randomly choose)
}
}
}
¡Cualquier ayuda con respecto a esto sería apreciada!
¿Es esto necesario? Creo que la mayoría de la gente usaría un par de usuarios de DB para hacer esto (uno que solo puede leer, y uno que tiene acceso completo), luego usaría una conexión DB separada para cada usuario. – Ozzy
Sin embargo, eso no distribuiría la carga a las réplicas de lectura. Los detalles de conexión son literalmente diferentes para cada réplica de lectura. Y si tuviera que crear un nuevo objeto PDO cada vez que quisiera intercambiar para leer o escribir, todavía necesito una forma de hacerlo. De esta forma (con suerte) me permitirá tener un solo objeto/instancia de conexión de mi clase a la vez en lugar de tener que usar $ dbh_write-> query() y $ dbh_read-> query(). – Schodemeiss