刷新Opcache缓存

刷新Opcache缓存

在各种服务器环境中,由于启用了操作码缓存,WordPress核心,插件和主题更新有时候会失败。大多数php的操作码缓存是Opcache。

扩展信息

为了能使WordPress核心更新,插件更新和主题更新上起作用,它与WordPress的upgrader_pre_install过滤器挂钩挂钩:

下面将通过一段代码php代码来实现刷新Opcache缓存。

function clear_iis_wincache() {
	if( ! function_exists( 'wincache_ucache_get' ) ) {
		return;
	}
	if( ! wincache_ucache_clear() ) {
		return false;
	}
	else {
		return true;
	}
}

function clear_php_opcache() {
	if( ! extension_loaded( 'Zend OPcache' ) ) {
		return;
	}
	$opcache_status = opcache_get_status();
	if( false === $opcache_status["opcache_enabled"] ) {
		// extension loaded but OPcache not enabled
		return;
	}
	if( ! opcache_reset() ) { 
		return false;
	}
	else {
		/**
		 * opcache_reset() is performed, now try to clear the 
		 * file cache.
		 * Please note: http://stackoverflow.com/a/23587079/1297898
		 *   "Opcache does not evict invalid items from memory - they 
		 *   stay there until the pool is full at which point the 
		 *   memory is completely cleared"
		 */
		foreach( $opcache_status['scripts'] as $key => $data ) {
			$dirs[dirname( $key )][basename( $key )] = $data;
			opcache_invalidate( $data['full_path'] , $force = true );
		}
		return true;
	}
}

function is_iis() {
	$software = strtolower( $_SERVER["SERVER_SOFTWARE"] );
	if( false !== strpos( $software, "microsoft-iis" ) )
		return true;
	else
		return false;
}

function clear_caches() {
	if( is_iis() ) {
		if ( clear_iis_wincache() ) {
			error_log( 'WinCache user cache cleared.' );
		}
		else {
			error_log( 'Clearing WinCache user cache opcode cache failed.' );
		}
	}
	if( clear_php_opcache() ) {
		error_log( 'PHP OPcache opcode cache cleared.' );
	}
	else {
		error_log( 'Clearing PHP OPcache opcode cache failed.' );
	}
}
add_filter( 'upgrader_pre_install', 'clear_caches', 10, 2 );

将这段代码复制主题文件中的function.php中。

当然还可以扩展上面的功能并清除APC缓存。

刷新Apc缓存,可以使用Php函数 apc_clear_cache() 。可以参照下面的示例。

function clear_apc_cache() {
	if( ! extension_loaded( 'apc' ) ) {
		// APC extension not loaded
		return;
	}
	else {
		if( apc_clear_cache( 'opcode' ) ) {
			error_log( 'APC opcode cache flushed' );
		}
		else {
			error_log(' Flushing APC opcode cache failed' );
		}
		if( apc_clear_cache( 'user' ) ) {
			error_log( 'APC user cache flushed' );
		}
		else {
			error_log( 'Flushing APC user cache failed' );
		}
	}
	if( ! extension_loaded( 'apcu' ) ) {
		// APCu extension not loaded
		return;
	}
	else {
		if ( apc_clear_cache( 'user' ) ) {
			error_log( 'APC user cache flushed' );
		}
		else {
			error_log( 'Flushing APC user cache failed' );
		}
	}
}
在下一篇文章Read more articles

Even

一90后在读计算专业大学生,擅长各种语言的hello world以及安装各种软件。
guest
0 评论
Inline Feedbacks
View all comments