【问题标题】:Avoid locking session PHP in Symfony避免在 Symfony 中锁定会话 PHP
【发布时间】:2019-03-31 11:06:42
【问题描述】:

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

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

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

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

【问题讨论】:

标签: php symfony session locking


【解决方案1】:

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

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

可能重复:How to process multiple parallel requests from one client to one PHP script

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

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

【讨论】:

  • 链接线程中的答案是针对php是单线程的。这完全没有抓住重点。会话锁是问题所在,可以通过 memcache 或 redis(或数据库)会话修复。
  • 您能否指出我在回答中说这是因为 PHP 是单线程的?我在谈论独占文件句柄,以及这如何成为来自底层操作系统的约束。最后,我还指出问题可以通过基于内存的会话存储来解决。
  • 您的评论是正确的,但您在链接中引用了另一篇以“可能重复”为前缀的文章,其中主要包含对单线程的引用。另外:默认情况下,memcache 会话处理现在也是阻塞的 afaik。不过可以关掉。
猜你喜欢
  • 2014-05-02
  • 2023-04-02
  • 2010-11-17
  • 2017-06-19
  • 1970-01-01
  • 1970-01-01
  • 2015-09-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多