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或其他内存数据库来管理会话数据,也可以解决集群的使用问题。
当时,会话数据共享是一个问题。