PHP方法锁阻塞,session_start()卡死、session锁定导致并发阻塞 解决办法

session_start()卡死、session锁定导致并发阻塞 解决办法

今天测试网站多并发的时候,发现网站好卡的,感觉php不能够这么慢呀,然后拼命找原因

通过php-fpm慢日志查看发现: Fatalerror:Maximumexecution time of30seconds exceededinthinkphp\library\think\Session.php on line534

找到第534行 /**

* 启动session

* @access public

* @return void

*/

publicfunctionstart()

{

session_start();

$this->init=true;

}

通过上图就知道我使用的ajax进行异步获取数据时,一个页面中存在2个ajax异步执行!

根据观察ajax.php:

第一个ajax请求发起成功,这个请求得php运算100秒后才返回结果。

第二个ajax在第一个请求发起后也跟随发起请求,第二个请求php运算10秒就可以发回结果,但是结果却是得第一个请求完全执行完成返回结果后第二个才跟随返回。

原因: 原因在于:执行session_start()后,对应的session文件是被锁定的,直到当前脚本结束才会解锁。

session数据被锁定以防止并发写入,所以任何时候只有一个脚本可以在session上运行。

定期间,另一个进程访问相同session id 要等文件解锁后session_start()才会开始。

为了证明猜测是对的

写了一下两个文件

index1.php <?php

echo123;

session_start();

sleep(60*60);

echo456;

die;

index2.php <?php

echo789;

session_start();

echo456789;

die;

先执行 index1.php, 然后在执行index2.php

以下是index2.php的执行结果,因为index1.php需要执行1小时. 789

Fatalerror:Maximumexecution time of30seconds exceededinE:\phpStudy\WWW\index2.php on line3

解决办法

办法也非常简单,开启session后,做了相应的操作,一定要关闭session;

例如:只需要在 session 设置好数据后调用, session_write_close() 将数据写入文件并且结束session;

PHP示例代码如下: <?php

session_start();

$_SESSION["count"]=1;

session_write_close();

sleep(10);

如果不加入session_write_close();并发3个进程访问该页面,第一个进程执行10秒 第二个执行20秒 第三个执行30秒。

加入session_write_close()后 ,并发3个进程会同时在10秒后执行完成! 要么你就把session存redis或者memcache,这样不会出现文件锁,这种最保险了.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值