我在Laravel中有一个控制器方法,它在运行时会冻结整个站点 - 就像在尝试加载任何页面时一样,它只是挂起,直到函数完成执行。
所以我试着将其分解以查看哪个部分是问题,我怀疑数据库锁定等,但最后我尝试了一些新的东西并得出了意想不到的结论 - 函数中发生的事情并不重要!
我用sleep(30);
替换了方法的全部内容,并且30秒内整个网站都不可用。
所以我想在整个应用程序中共享一些资源,所有其他页面都必须等待这个方法在运行之前执行。
我的问题是,为什么会发生这种情况,我如何具体弄清楚有问题的资源是什么?
答案 0 :(得分:0)
如果仅在同一会话中发生这种情况,则可能是会话锁定。
每当你启动session_start()时(或当PHP的session.auto_start设置为true时,它会在每个PHP脚本中自动执行),操作系统将锁定会话文件。大多数实现都使用flock,它也用于防止Linux上重叠的cronjobs或其他文件锁。
...
该锁定保留在文件中,直到脚本结束或故意删除锁定(更多内容如下)。这既是读取也是写入锁定:每次尝试读取会话都必须等到锁定被释放。
锁定本身并不是问题。防止从多个位置写入会话文件,可能会破坏数据或删除以前的数据,这是一种安全措施。
当第二个并发的PHP脚本尝试访问同一个PHP会话时,会出现问题。
此处提供更多信息:https://ma.ttias.be/php-session-locking-prevent-sessions-blocking-in-requests/