首页 > 解决方案 > 避免在 Symfony 中锁定会话 PHP

问题描述

我使用Symfony作为 Web 应用程序的框架,但我遇到了PHP 锁定会话的问题。

当我打开浏览器选项卡并访问处理大量数据的应用程序页面时(这需要 12 到 18 秒),如果我打开另一个选项卡并访问应用程序的另一个页面更轻(例如索引,在不到一秒的时间内加载)后一个选项卡在前一个选项卡完成之前不会加载

我认为这是因为:当我打开第一个页面时,Symfony 控制器自动打开会话,PHP 锁定了它存储会话的文件,所以,直到这个页面没有完成处理,控制器关闭会话,PHP 释放存储会话的文件,以下页面(共享会话)将不会加载。

我尝试将 PHP 处理程序更改为 Memcache 并解决了此错误,但我想知道您是否知道在 PHP 将会话存储在文件中时避免在 Symfony 中锁定 PHP 会话的任何简单方法

标签: phpsymfonysessionlocking

解决方案


这种情况并非 Symfony 独有。您可以在几乎任何其他基于 PHP 的 Web 应用程序中体验完全相同的事情,这些应用程序使用来自同一客户端的会话和并行请求。

一个典型的例子是 WordPress,其中有多个插件需要更新。如果您同时单击所有插件上的 AJAX 更新链接,它们将不会同时同时更新。(您点击更新的第一个插件需要在第二个插件开始更新之前完成,以此类推)

可能重复:如何处理从一个客户端到一个 PHP 脚本的多个并行请求

Symfony 特有的部分问题是它真的很想有一个可用的会话,因为框架的某些部分(例如安全包)需要一个会话。当会话基于文件时,您会遇到限制,因为您不能在任何给定时间对同一个文件有多个写句柄,这是底层操作系统而不是 PHP 强加的警告。-- 这不是内存句柄的问题,这就是 memcached 为您解决这个问题的原因。

有什么理由要使用基于文件的会话而不是 memcached?memcached 是更好选择的原因有很多,如下所述:Session VS File VS Memcache for a Cache in PHP?


推荐阅读