php高并发session会话阻塞性能问题解决办法

php高并发session会话阻塞性能问题解决办法

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')
);

{{collectdata}}

网友评论0