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/
此处评论已关闭