it-swarm.com.de

Konfigurieren Sie WordPress nur zum Lesen aus der Datenbank, niemals zum Schreiben

Wie gehe ich vor, um WordPress in einen schreibgeschützten Zustand zu versetzen?

Ich habe ein Setup, das Slave-Instanzen mit schreibgeschütztem Datenbankzugriff skaliert, aber es werden viele Protokolldaten angezeigt, bei denen WordPress immer noch versucht, in die Datenbank zu schreiben.

update_{post_type}_metadata , set_transient , wpdb ... im Grunde wäre es ideal, alles zu stoppen, was versucht zu schreiben. Ich kann leicht überprüfen, ob ich mich in einer MASTER-Instanz oder einer SLAVE-Instanz befinde, damit ich Hooks ziemlich früh ändern kann.

Der Versuch, die Update-Metadaten-Funktion kurzzuschließen, scheint möglicherweise einen Vektor zu eliminieren, aber der Rest, fürchte ich, beinhaltet das Modifizieren von WP Core.

add_filter ( 'update_post_metadata', '__return_false', 99 );

$result = update_post_meta( -1, 'test-key', 'test-value' );

echo $result;

Irgendwelche Vorschläge?


HyperDB sieht als langfristigere Lösung vielversprechend aus.

3
jgraup

WordPress funktioniert im schreibgeschützten Modus nicht gut. Dies hängt von der Datenbank für den Cache und andere Aufgaben ab.

Es gibt jedoch einige Optionen, wenn Sie dennoch fortfahren möchten.

  1. Setzen Sie die Datenbankbenutzerberechtigungen auf "NUR LESEN".
  2. Verwenden Sie eine Funktion, um alle Datenbankabfragen abzufangen. Wir haben dies auf unserer Theme-Demo-Site verwendet, um DB-Schreibvorgänge zu verhindern.

Zu verwendende Funktion:

/**
 * Whitelist "SELECT" and "SHOW FULL COLUMNS" queries.
 */
function my_readonly_filter( $query ) {
  global $wpdb;

  if ( preg_match( '/^\s*select|show full columns\s+/i', $query ) ) {
    return $query;
  }

  // Return arbitrary query for everything else otherwise you get 'empty query' db errors.
  return "SELECT ID from $wpdb->posts LIMIT 1;";
}
add_filter( 'query', 'my_readonly_filter' );
6
cowgill