Comme je l'ai récemment quelques problèmes avec le serveur MySQL a ma compagnie d'hébergement, je me demandais quelles solutions de rechange que j'ai. Chaque fois que le serveur va dans le genou, toutes mes pages web ne peut être atteint: Avant tout, ce blog est très ennuyeux, les échecs des autres sites peuvent toujours obtenir sur moi-même.
Donc, je drangesetzt fois, analysé le code source WordPress et me font penser à une solution. Pour l'utiliser, un couple de modifications peuvent être faites à la base de WordPress. La source des extraits de code indiqué et les numéros de ligne se référer à WordPress 2.7.1.
Les changements de la façon dont il est possible de permettre simultanément WordPress pour parler via le protocole SSL pour la base de données MySQL. 
Commençons Que les changements à l'config.php fichier wp-- ce qui comprend, entre autres, toutes les informations WordPress doit se connecter à la base de données. Normalement, c'est la configuration de la base de données comme ceci:
1 2 3 4 5 6 7
| / / ** ** Paramètres MySQL / / 'DB_NAME' , 'DATENBANKNAME' ) ; // Der Name der Datenbank, die du benutzt. define ('DB_NAME', 'Database Name "); / / Le nom de la base de données que vous utilisez. 'DB_USER' , 'BENUTZERNAME' ) ; // Dein MySQL-Datenbank-Benutzername. define ('DB_USER »,« Nom d'utilisateur »); / / Votre base de données le nom d'utilisateur MySQL. 'DB_PASSWORD' , 'PASSWORT' ) ; // Dein MySQL-Passwort. define ('DB_PASSWORD', 'password'); / / Votre mot de passe MySQL. 'DB_HOST' , 'SERVER' ) ; // In 99% der Fälle musst du hier nichts ändern. define ('DB_HOST »,« serveur »); / / 99% des cas, vous devez en aucune changer ici. 'DB_CHARSET' , 'CHARSET' ) ; define ('DB_CHARSET', 'charset'); 'DB_COLLATE' , '' ) ; define ('',''); DB_COLLATE |
L'ensemble nous maintenant d'élargir un peu, de sorte que nous pouvons préciser les données de plusieurs serveurs de bases de données différentes. Pour cela, nous écrire toutes les données dans chaque cas dans un tableau. Chaque tableau doit avoir le même nombre d'entrées, toutes les entrées appartenant conjointement avec un indice spécifique:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16:00 17 18 19 20 21
| / / ** ** Paramètres MySQL / / 'CLIENT_SSL' , 2048 ) ; // Wert für Konstante CLIENT_SSL define ('CLIENT_SSL, 2048) / / valeur pour la constante CLIENT_SSL / / Define ('ENABLE_DB_SELECT', 'true'); / / animaux revenu à la base de données pour permettre la sélection manuelle array ( 'DATENBANKNAME1' , 'DATENBANKNAME2' ) ; // Der Name der Datenbank, die du benutzt. $ Wpdbname = array ('DATENBANKNAME1', 'DATENBANKNAME2'); / / Le nom de la base de données que vous utilisez. array ( 'BENUTZERNAME1' , 'BENUTZERNAME2' ) ; // Dein MySQL-Datenbank-Benutzername. $ Wpdbuser = array ('UserName1', 'username2'); / / Votre base de données le nom d'utilisateur MySQL. array ( 'PASSWORT1' , 'PASSWORT2' ) ; // Dein MySQL-Passwort. $ Wpdbpassword = array ('PASSWORT1', 'PASSWORT2'); / / Votre mot de passe MySQL. array ( 'SERVER1' , 'SERVER2' ) ; // In 99% der Fälle musst du hier nichts ändern. $ Wpdbhost = array ('SERVER1', 'SERVER2') / / Dans 99% des cas, vous ne devez pas changer ici. array ( 'SSL1' , 'SSL2' ) ; // Verbindung via SSL => 'true' $ Wpdbssl = array ('SSL1 »,« SSL2'); / / connexion via => 'vrai SSL » array ( 60 , 60 ) ; // Verbindungstimeout in Sekunden Wpdbtimeout $ = array (60 et 60); / délai de connexion / en quelques secondes array ( 'CHARSET1' , 'CHARSET2' ) ; $ Wpdbcharset = array ('CHARSET1', 'CHARSET2'); array ( '' , '' ) ; $ Wpdbcollate = array ('',''); 'DB_NAME' , serialize ( $wpdbname ) ) ; define ('DB_NAME, sérialiser ($ wpdbname)); 'DB_USER' , serialize ( $wpdbuser ) ) ; define ('DB_USER, sérialiser ($ wpdbuser)); 'DB_PASSWORD' , serialize ( $wpdbpassword ) ) ; define ('DB_PASSWORD, sérialiser (wpdbpassword $)); 'DB_HOST' , serialize ( $wpdbhost ) ) ; define ('DB_HOST, sérialiser (wpdbhost $)); 'DB_SSL' , serialize ( $wpdbssl ) ) ; define ('DB_SSL, sérialiser ($ wpdbssl)); / / Define ('DB_TIMEOUT, serialize ($ wpdbtimeout)) / / animaux revenu afin d'activer la configuration de délai d'attente 'DB_CHARSET' , serialize ( $wpdbcharset ) ) ; define ('DB_CHARSET, sérialiser ($ wpdbcharset)); 'DB_COLLATE' , serialize ( $wpdbcollate ) ) ; define ('DB_COLLATE, sérialiser ($ wpdbcollate)); |
J'espère que quelqu'un a la nouvelle variable $ wpdbssl et la nouvelle valeur définie DB_SSL remarqué. A propos de ce qu'il est possible de se déplacer plus tard, WordPress se connecter via SSL pour la base de données - si elle est-il configuré. «Faux» La valeur signifie que SSL est désactivé - toute autre valeur permet à la connexion SSL. 
Une fois la configuration terminée, il nous faut maintenant régler WordPress lui-même. Nous devons modifier le fichier wp-includes/wp-db.php. A cet égard, la base de données initiale est faite.
Dans la fonction __construct () est à la ligne 312 le code suivant:
1 2 3 4 5 6 7
| defined ( 'DB_CHARSET' ) ) if ( défini («DB_CHARSET ')) charset = DB_CHARSET ; $ This-> charset = - DB_CHARSET; defined ( 'DB_COLLATE' ) ) if ( défini («DB_COLLATE ')) collate = DB_COLLATE ; $ This -> = rassembler DB_COLLATE; dbh = @ mysql_connect ( $dbhost , $dbuser , $dbpassword , true ) ; $ This-> DHP - = @ mysql_connect ($ dbhost, dbuser $, $ dbpassword, true); |
C'est ce que nous maintenant remplacer par le code suivant. Ceci est responsable du traitement de la matrice - il sera l'un après toutes les configurations testées avant qu'une connexion peut être faite à l'une des bases de données MySQL. Il est également jugé que cela peut arriver, même une fois, que tous les panneaux de configuration sont d'égale longueur, comme le protocole SSL est pris en compte et de définir le délai de la connexion, si nécessaire:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16:00 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100
| / / Quelle base de données pour sélectionner '' ; = SelectedName''$; / / Obtention des valeurs de tableau unserialize ( $dbuser ) ; $ Dbuser = unserialize ($ dbuser); unserialize ( $dbpassword ) ; $ DBPassword = unserialize (dbpassword $); unserialize ( $dbname ) ; $ Dbname = unserialize ($ dbname); unserialize ( $dbhost ) ; $ DBHOST = unserialize (dbhost $); null ; $ Dbssl = null; defined ( 'DB_SSL' ) ) { if ( défini («DB_SSL ')) ( unserialize ( DB_SSL ) ; $ Dbssl = unserialize (DB_SSL); ) null ; = Null Dbtimeout $; defined ( 'DB_TIMEOUT' ) ) { if ( défini («DB_TIMEOUT ')) ( unserialize ( DB_TIMEOUT ) ; Dbtimeout $ = unserialize (DB_TIMEOUT); ) null ; $ Dbcharset = null; defined ( 'DB_CHARSET' ) ) { Si ( défini («DB_CHARSET ')) ( unserialize ( DB_CHARSET ) ; $ Dbcharset = unserialize (DB_CHARSET); ) null ; $ Dbcollate = null; defined ( 'DB_COLLATE' ) ) { if ( défini («DB_COLLATE ')) ( unserialize ( DB_COLLATE ) ; $ Dbcollate = unserialize (DB_COLLATE); ) dbh = false ; $ This-> DHP - = false; / / Retourne le nombre de jeux complets disponibles config count ( $dbuser ) ; $ MinCount = nombre ($ dbuser); count ( $dbpassword ) < $minCount ) { $minCount = count ( $dbpassword ) ; } if ( nombre (dbpassword $) <$ minCount) ($ minCount = nombre (dbpassword $);) count ( $dbname ) < $minCount ) { $minCount = count ( $dbname ) ; } if ( nombre ($ dbname) <$ minCount) ($ minCount = nombre ($ dbname);) count ( $dbhost ) < $minCount ) { $minCount = count ( $dbhost ) ; } if ( nombre (dbhost $) <$ minCount) ($ minCount = nombre (dbhost $);) $dbssl != null ) { if ( count ( $dbssl ) < $minCount ) { $minCount = count ( $dbssl ) ; } } if ($ dbssl! null =) (le cas ( compte ($ dbssl) <$ minCount) ($ minCount = nombre ($ dbssl);)) $dbtimeout != null ) { if ( count ( $dbtimeout ) < $minCount ) { $minCount = count ( $dbtimeout ) ; } } if ($ dbtimeout! = null) (if ( nombre ($ dbtimeout) <$ minCount) ($ minCount = nombre ($ dbtimeout);)) $dbcharset != null ) { if ( count ( $dbcharset ) < $minCount ) { $minCount = count ( $dbcharset ) ; } } if ($ dbcharset! = null) (if ( nombre ($ dbcharset) <$ minCount) ($ minCount = nombre ($ dbcharset);)) $dbcollate != null ) { if ( count ( $dbcollate ) < $minCount ) { $minCount = count ( $dbcollate ) ; } } if ($ dbcollate! = null) (if ( nombre ($ dbcollate) <$ minCount) ($ minCount = nombre ($ dbcollate);)) / / D'abord trouver de travail config $minCount > 0 ) { if ($ minCount> 0) ( 0 ; Index = 0 $; / / Sélection manuelle de la config utilisées permettent defined ( 'ENABLE_DB_SELECT' ) ) { if ( défini («ENABLE_DB_SELECT ')) ( ENABLE_DB_SELECT == 'true' ) { if (ENABLE_DB_SELECT == 'true') ( null ; $ Dbid = null; isset ( $_GET [ 'dbid' ] ) ) { if ( mange ($ ['dbid _GET'])) ( $_GET [ 'dbid' ] ; $ Dbid = $ _GET ['dbid']; { ) Autres ( isset ( $_COOKIE [ 'dbid' ] ) ) { if ( isset ($ _COOKIE ['dbid'])) ( $_COOKIE [ 'dbid' ] ; $ Dbid = $ _COOKIE ['dbid']; ) ) $dbid != null ) { if ($ dbid! = null) ( isset ( $_SERVER [ 'HTTP_HOST' ] ) ) { if ( mange ($ _SERVER ['] HTTP_HOST)) ( $_SERVER [ 'HTTP_HOST' ] ; = Domain $ _SERVER $ ['HTTP_HOST']; { ) Autres ( $_SERVER [ 'SERVER_NAME' ] ; = Domain $ _SERVER $ ['SERVER_NAME']; ) strlen ( trim ( $dbid ) ) > 0 ) && ( is_numeric ( $dbid ) ) ) { if (( strlen ( trim ($ dbid))> 0) & & ( is_numeric (dbid $))) ( intval ( $dbid ) ; $ Dbid = intval (dbid $); $minCount > $dbid ) { if ($ minCount> dbid $) ( $dbid ; $ Index = $ dbid; $dbid + 1 ; $ = $ MinCount dbid + 1; ) 'dbid' , $dbid , time ( ) + 300000 , '/' , $domain ) ; setcookie ('dbid', $ dbid, temps ) + 300000 '/', $ domaine (); { ) Autres ( 'dbid' , '' , time ( ) , '/' , $domain ) ; setcookie ('','', dbid temps ), '/', $ domaine (); ) ) ) ) faire ( $dbname [ $index ] ; $ Dbname = SelectedName [$ index] $; $dbtimeout != null ) { if (dbtimeout $! = null) ( 'mysql.connect_timeout' , $dbtimeout [ $index ] ) ; // set connect timeout ini_set ('mysql.connect_timeout', $ dbtimeout [$ index]); / / set timeout se connecter ) $dbssl != null ) && ( $dbssl [ $index ] == 'true' ) ) { if (($ dbssl! = null) & & ($ [dbssl index] == $ 'true')?) ( dbh = @ mysql_connect ( $dbhost [ $index ] , $dbuser [ $index ] , $dbpassword [ $index ] , true , CLIENT_SSL ) ; $ This-> DHP - = @ mysql_connect ($ dbhost [$ index], $ dbuser [index] $, $ dbpassword [index] $, c'est vrai, CLIENT_SSL); { ) Autres ( dbh = @ mysql_connect ( $dbhost [ $index ] , $dbuser [ $index ] , $dbpassword [ $index ] , true ) ; $ This-> DHP - = @ mysql_connect ($ dbhost [$ index], $ dbuser [index] $, $ dbpassword [index] $, true); ) $dbcharset != null ) { if ($ dbcharset! = null) ( charset = $dbcharset [ $index ] ; Ce - charset => $ dbcharset $ [] de l'index $; ) $dbcollate != null ) { if ($ dbcollate! = null) ( collate = $dbcollate [ $index ] ; $ This-> compiler - = $ dbcollate [$ index]; ) Index $ + +; ( ( ! $this -> dbh ) && ( $index < $minCount ) ) ; ) While (($ this - dbh>) & & ($ index <$ minCount)); ) |
Aujourd'hui, seule une petite modification suivante dans la ligne de 435e Il nous faut veiller à ce que la base de données sélectionnée correct. L'ancien ...
1
| select ( $dbname ) ; $ This -> select ($ dbname); |
... Nous avons rapidement remplacé par la nouvelle version:
1
| select ( $selectedName ) ; $ This -> select ($ selectedName); |
Félicitations! Si vous avez tout fait correctement, votre WordPress devrait maintenant être en mesure de se connecter via SSL à une base de données des patrons qui ont la capacité de se connecter à une base de données de sauvegarde si le premier (n) base (s) à ne pas réalisables! 
Pour obtenir des conseils, idées et suggestions, je suis toujours ouvert
. L'idée de passer le tableau sérialisé cette façon, je n'ai à PHP.net trouvé
! La définition de la constante CLIENT_SSL vient aussi de là .
Et n'oubliez pas: je ne suis pas responsable des dommages causés aux logiciels, du matériel ou des dommages matériels que ces changements sont causés par l'application ou pourraient se poser. 
Mise à jour:
Il ya encore un petit ajout que je tiens à vous débarrasser. Premièrement, il est tout à fait possible, d'étendre le code source que des questions différentes de bases de données différentes pour être adopté - ce qui permet l'équilibrage de charge pour mettre en œuvre.
D'un autre côté, il ya aussi un problème: vous avez à réparer à garder à synchroniser les différentes bases de données que possible. Il serait ennuyeux si un article est créé dans une base de données, mais cela ne veut pas être vu dans l'autre. Tout aussi problématique sont les commentaires et trackbacks, puisque ceux-ci pourraient être rapidement perdu. Une synchronisation de travail, je dois donc être établi. Actuellement, je me donne à accepter que l'on peut observer que sur l'activité d'une base de données, alors que cette option est désactivée dans les autres bases de données.
Mise à jour:
J'ai de nouveau examiné l'intégralité du code, tout en apportant certaines modifications nécessaires. Maintenant vous devez simplement la fonction __construct () dans le fichier wp-db.php être édité.
Salutations multiples, Kenny