PHP会话文件互斥锁问题求解方法

PHP会话的默认处理器session.save_handler =文件(即文件)。如果同一个客户同时发送多个请求同时,如Ajax发送多个请求同时在同一时间,和脚本的执行时间很长,它会导致会话文件阻塞,影响性能,因为PHP执行session_start()对于每个请求,文件将获得独占锁,只有独占锁将只有在请求完成释放。在这种方式中,多个请求会同时造成阻塞。解决方法如下:

(1)当会话变量被修改,session_write_close()立刻被用来保存会话数据和释放文件锁。


session_start();

_session { } =美元测试'测试';
session_write_close();

做某事




(2)使用的session_set_save_handler()函数是自定义会话处理的实现。


功能开放($保存路径,列出美元)
{
echo'open叫';
返回true;
}

函数关闭()
{
echo'close叫';
返回true;
}

阅读功能($ SessionID)
{
echo'read叫';
返回' ';
}

函数编写($ SessionID,$data)
{
echo'write叫';
返回true;
}

功能破坏($ SessionID)
{
echo'destroy叫';
返回true;
}

函数GC($生命周期)
{
echo'gc叫';
返回true;
}

session_set_save_handler(打开
register_shutdown_function('session_write_close);

session_start();

_session美元{ 'foo} =酒吧;




当然,在PHP 5.4.0,你可以通过实现sessionhandlerinterface接口或sessionhandler类继承使用它。


类mysessionhandler延伸sessionhandler {

公共功能__construct()
{
}

公共功能开放(save_path美元,美元session_id)
{
}

公共功能关闭()
{

}

公共功能create_sid()
{
}

公共函数读取($ id)
{
}

公共函数写入($ id,$数据)
{
}

公共功能破坏(id)
{
}
}

为处理=新mysessionhandler();

/ /功能session_write_close二参数()注册为register_shutdown_function()函数。
session_set_save_handler(合处理,真的);




您可以实现并封装上面的代码,并使用MySQL或其他内存数据库来管理会话数据,也可以解决集群的使用问题。

当时,会话数据共享是一个问题。