PHP中会话的分析可能导致并发问题。
如果同一个客户端发送多个请求同时,和会话用于每个请求,PHP会话锁的存在会导致服务器的串行而非并行响应这些请求。这是因为,默认情况下,PHP使用文件来存储会话数据。每一个新的会话,PHP创建一个文件,将数据写入到它。所以,每一次你打电话给session_start()方法,你打开会话文件,获取文件的独占锁。这样,如果服务器脚本处理一个请求,和客户端发送另一个请求也需要使用会话,那么后者的要求将阻塞直到以前的请求处理完成,释放互斥锁的文件。不过,这是限制多来自同一客户端发请求,也就是说,从一个客户端请求不会阻止另一个客户端的请求。
如果脚本是短暂的,这通常是没有问题的。但是如果脚本运行时间更长,它可以是一个问题。在现代Web应用程序的发展,其中最常见的情况是使用Ajax技术来发送多个请求在同一页面上得到的数据。如果这些要求需要使用会话,然后第一个请求到达服务器后得到会话锁,和其他请求必须等待,所有的请求将被处理的串行,即使他们不是相互依赖。这将大大增加网页的响应时间。
为了避免这个问题的方法之一是调用session_write_close()方法立即关闭会话会话后使用。所以会话锁将被释放,即使当前的脚本还等待处理。重要的是要注意,当方法被调用时,当前脚本将无法会议进一步操作。
重要的是指出问题和观点的论述只适用于PHP默认的会话管理模式下使用session_start()方法。例如,有用户指出,如果应用程序托管在AWS EC2和DynamoDB是正确配置会话锁定的问题将不会出现。
附上一个示例代码。
session.php
< PHP
最后一节课sessioncontroller延伸yafcontroller_abstract
{
公共功能setuserfileaction()
{
session_start();
_session美元{ 'user_name} = 'xudianyang;
_session美元{ 'user_id} = '123;
睡眠(3);
回声json_encode($ _session);
返回false;
}
公共功能setloginfileaction()
{
session_start();
_session美元{ 'last_time} =时间();
回声json_encode($ _session);
返回false;
}
公共功能indexfileaction()
{
把视图 / /自动
}
公共功能getsessionfileaction()
{
session_start();
var_dump($ _session);
返回false;
}
公共功能setuserredisaction()
{
$ SESSION = corefactory::会议();
$ SESSION ->设置('user_name ','xudianyang);
$session->set ('user_id','123');
睡眠(3);
回声json_encode($ _session);
返回false;
}
公共功能setloginredisaction()
{
$ SESSION = corefactory::会议();
$ SESSION ->设置('last_time时间());
回声json_encode($ _session);
返回false;
}
公共功能indexredisaction()
{
把视图 / /自动
}
公共功能getsessionredisaction()
{
$ SESSION = corefactory::会议();
var_dump($ _session);
返回false;
}
}
indexfile.phtml
测试会话并发锁问题
$ ajax({
网址: / / setuserfile会话
键入:获取
DataType:JSON
成功:函数(响应){
Console.info(响应。last_time);
}
});
setTimeout(){()函数(
$ ajax({
网址: / / setloginfile会话
键入:获取
DataType:JSON
成功:函数(响应){
Console.info(响应。last_time);
}
});
},300);
同时启动2个Ajax请求
indexredis.phtml
测试会话并发锁问题
$ ajax({
网址: / / setuserredis会话
键入:获取
DataType:JSON
成功:函数(响应){
Console.info(响应。last_time);
}
});
setTimeout(){()函数(
$ ajax({
网址: / / setloginredis会话
键入:获取
DataType:JSON
成功:函数(响应){
Console.info(响应。last_time);
}
});
},300);
同时启动2个Ajax请求
以上是本文的全部内容,希望大家能喜欢。