php高并发session会话阻塞性能问题解决办法
php默认的session处理方式是session_start开启后,会打开一个session会话文件并且锁住,当脚本运行结束后才写入session文件并释放锁,那么在高并发请求的时候会出现阻塞及性能问题,如果单个用户需要同时访问同一个php文件时,php脚本会在session开始后阻塞住,其他请求会一直停在那等到前面一个脚本结束并且释放锁,这样就回出现问题,那么如何解决这个问题呢
使用session_write_close,这样在session用完后立即写入并释放。
<?php session_start(); $_SESSION["key"]="value"; session_write_close(); ?>
还有一种情况,就是用户执行session读操作时候,无需锁住文件并写入,这个时候要判断session值有没有改变,改变就重新写入,还有就是同一脚本中多处用到session,频繁的读取session也会有性能问题,我们可以设置session缓存,完整代码如下
<?php 自定义session处理类 class CustomSessionHandler { private $savePath; private static $_sessval = null; private static $_sessiswrite = false; //创建session存储目录 function open($savePath, $sessionName) { $this->savePath = $savePath; if (!is_dir($this->savePath)) { mkdir($this->savePath, 0777); } return true; } //关闭时触发 function close() { return true; } //读取是触发 function read($id) { //判断是否有缓存 if ($this->_sessval == null) { $this->_sessval = (string)@file_get_contents("$this->savePath/sess_$id"); } return $this->_sessval; } // 写入session触发 function write($id, $data) { if ($this->_sessval == $data) { //更新一下修改时间 touch("$this->savePath/sess_$id"); return true; } return file_put_contents("$this->savePath/sess_$id", $data) === false ? false : true; } // 写入销毁时触发 function destroy($id) { $file = "$this->savePath/sess_$id"; if (file_exists($file)) { unlink($file); } return true; } //回首时触发 function gc($maxlifetime) { foreach (glob("$this->savePath/sess_*") as $file) { if (filemtime($file) + $maxlifetime < time() && file_exists($file)) { unlink($file); } } return true; } } $handler = new CustomSessionHandler(); session_set_save_handler( array($handler, 'open'), array($handler, 'close'), array($handler, 'read'), array($handler, 'write'), array($handler, 'destroy'), array($handler, 'gc') );
网友评论0