PHP memcached session和redis session设置教程

PHP Session 默认是放在硬盘上的,高并发的时候会出现性能问题.
PHP将Session放到memcached或者redis可以提升性能

1. PHP Session修改php.ini放置到memcached或者redis

直接修改php.ini文件,替换相关数据

1.1 PHP memcached session 设置


session.save_handler = memcached
session.save_path = "localhost:11211"

1.2 PHP redis session 设置


session.save_handler = redis
session.save_path = "tcp://localhost:6379?auth="

2. 动态修改PHP Session存放位置

直接修改php.ini有些麻烦,可以用PHP动态修改
代码必须放到session_start();的上面

2.1 PHP memcached session 存放位置动态修改


if (class_exists('Memcached')){
    ini_set("session.save_handler","memcached");
    ini_set("session.save_path","localhost:11211");
    ini_set("session.gc_maxlifetime",3600);
}
session_start();

2.2 PHP redis session 存放位置动态修改


if (class_exists('Redis')){
    ini_set("session.save_handler","redis");
    ini_set("session.save_path","tcp://localhost:6379?auth=");
    ini_set("session.gc_maxlifetime",3600);
}
session_start();

3.typecho修改 memcached session 位置

打开 \var\Widget\Init.php 替换@session_start();
    if (class_exists('Memcached')){
        ini_set("session.save_handler","memcached");
        ini_set("session.save_path","localhost:11211");
        ini_set("session.gc_maxlifetime",3600);
        }
        @session_start();

4. wordpress修改 memcached session 位置

由于 wordpress自己写了一套session API,需要使用hook修改
class WPJAM_User_Session_Tokens extends WP_User_Meta_Session_Tokens {
	protected function get_cache_key(){
		return 'session_tokens:'.$this->user_id.':'.wp_cache_get_last_changed('session_tokens');
	}

	protected function get_sessions() {
		$cache_key	= $this->get_cache_key();
		$sessions	= wp_cache_get($cache_key, 'session_tokens');

		if ( ! is_array( $sessions ) ) {
			return [];
		}

		$sessions	= array_map( array( $this, 'prepare_session' ), $sessions );
		return array_filter( $sessions, array( $this, 'is_still_valid' ) );
	}

	protected function update_sessions( $sessions ) {
		if ( $sessions ) {
			$cache_key	= $this->get_cache_key();
			wp_cache_set($cache_key, $sessions, 'session_tokens', DAY_IN_SECONDS);	
		} else {
			$cache_key	= $this->get_cache_key();
			wp_cache_delete($cache_key, 'session_tokens');	
		}
	}
	
	public static function drop_sessions() {
		wp_cache_set('last_changed', microtime(), 'session_tokens');
	}
}

add_filter('session_token_manager', function(){
	return 'WPJAM_User_Session_Tokens';
});

5. wordpress使用php Session (可选)

由于其他插件可能使用默认的php Session,这里也可以修改一下
add_action( 'init', function ()
{  
      if (class_exists('Memcached')){
    ini_set("session.save_handler","memcached");
    ini_set("session.save_path","localhost:11211");
    ini_set("session.gc_maxlifetime",3600);
    }
    if (class_exists('Redis')){
    ini_set("session.save_handler","redis");
    ini_set("session.save_path","tcp://localhost:6379?auth=");
    ini_set("session.gc_maxlifetime",3600);
    }
    session_start();   
}, 1 );

function destroy_session() {
    $_SESSION = array();
    session_destroy();
}
add_action('wp_logout', 'destroy_session');
add_action('wp_login', 'destroy_session');

参考来源:
https://zhuanlan.zhihu.com/p/351784636
https://www.wpzhiku.com/use-php-session-in-wordpress/

发表评论