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/

此处评论已关闭