Blog

WordPress : Flush OPcache plugin

Écrit le 17 02 2017 par Kévin MET _

J’en avais parlé dans mon précédent billet sur OPcache, j’ai écrit un plugin WordPress qui permet de vider le cache OPcache manuellement. Je l’ai enfin publié sur github et sur le dépôt de plugins de WordPress.org, il était donc temps de faire un petit billet pour parler de tout ça.

Le plugin est vraiment simpliste, il n’y a pas de paramètres, il ajoute un bouton dans l’admin bar en haut à gauche comme on peut le voir sur ce screenshot accompagné d’une immonde flèche rouge :

WordPress Flush OPcache button

Lorsqu’on appuie sur le bouton, le plugin appelle la fonction opcache_reset() qui s’occupe de vider le cache. Une fois que c’est fait, le plugin vous renvoie un beau message vous indiquant que le cache est vidé :

WordPress Flush OPcache notice

J’ai essayé de faire attention à la sécurité, il faut être admin pour pouvoir appuyer sur ce bouton et il faut bien évidemment avoir OPcache installé et configuré sur son serveur. Le plugin utilise également un mécanisme de nonce pour éviter les CSRF. Après, je ne suis pas dev de métier donc il se peut qu’il existe des défauts. Dans ce cas, je compte sur les développeurs qui passent sur le site pour me faire la remarque par mail ou directement dans les commentaires.

Je laisse le fichier principal ici pour que vous puissiez lire le code rapidement et je laisse également un lien vers github pour les futures mises à jour.


<?php
/*
Plugin Name: Flush OPcache
Plugin URI: http://wordpress.org/plugins/flush-opcache/
Description: This plugin only does one thing : Add a simple button in admin dashboard to flush PHP OPcache.
Author: Kévin MET
Version: 1.0
Author URI: https://mnt-tech.fr/
License: GPL2
License URI: https://www.gnu.org/licenses/gpl-2.0.html
*/

// Add button in admin area
function flush_opcache_button() {
	global $wp_admin_bar;

	if ( !is_user_logged_in() || !is_admin_bar_showing() )
		return false;

	// User's verification
	if ( !current_user_can( 'activate_plugins' ))
		return false;

	// Button parameters
	$flush_url = add_query_arg( array( 'flush_opcache_action' => 'flushopcacheall' ) );
	$nonced_url = wp_nonce_url( $flush_url, 'flush_opcache_all' );
	$wp_admin_bar->add_menu( array(
		'parent' => '',
		'id' => 'flush_opcache_button',
		'title' => 'Flush PHP OPcache',
		'meta' => array( 'title' => 'Flush PHP OPcache' ),
		'href' => $nonced_url
		)
	);
}
add_action( 'admin_bar_menu', 'flush_opcache_button', 100 );
add_action( 'admin_init', 'flush_opcache');

// Where OPcache is actually flushed
function flush_opcache() {

	if ( !isset( $_REQUEST['flush_opcache_action'] ) )
		return;

	// User's verification
	if ( !current_user_can( 'activate_plugins' ) )
		wp_die( 'Sorry, you can\'t flush OPcache.' );

	// Show notice when flush is done  
	$action = $_REQUEST['flush_opcache_action'];
	if ( $action == 'done' ) {
		add_action( 'admin_notices', 'show_opcache_notice' );
		return;
	}

	// Check for nonce and admin
	check_admin_referer( 'flush_opcache_all' );

	// OPcache reset
	if ( $action == 'flushopcacheall' ) {
		opcache_reset();
	}

	 wp_redirect( esc_url_raw( add_query_arg( array( 'flush_opcache_action' => 'done' ) ) ) );
}

function show_opcache_notice() {
	echo '<div class="updated"><p>OPcache was successfully flushed.</p></div>';
}
?>

Si vous pouviez l’essayer sur vos configs et me dire ce que vous en pensez ou si vous rencontrez des bugs, ça serait cool :) Je l’utilise moi même sur 2 blogs, l’un sur apache avec php en fpm et l’autre sur nginx avec php en fpm également et cela fonctionne parfaitement mais ça ne fera pas de mal de le tester ailleurs.

♥ Partage sur tes réseaux sociaux ♥
Kévin MET
Kévin MET

Auteur de ce blog et gérant de la société MNT-TECH, je publie sur ce blog lorsque le temps me le permet et lorsqu'un sujet qui me parait intéressant n'a pas encore été abordé en français. Toutes les informations techniques présentes sur cette page peuvent être réutilisées moyennant le fait de citer la source.