php - 避免在 Symfony 中锁定会话 PHP
问题描述
我使用Symfony作为 Web 应用程序的框架,但我遇到了PHP 锁定会话的问题。
当我打开浏览器选项卡并访问处理大量数据的应用程序页面时(这需要 12 到 18 秒),如果我打开另一个选项卡并访问应用程序的另一个页面更轻(例如索引,在不到一秒的时间内加载),后一个选项卡在前一个选项卡完成之前不会加载。
我认为这是因为:当我打开第一个页面时,Symfony 控制器自动打开会话,PHP 锁定了它存储会话的文件,所以,直到这个页面没有完成处理,控制器关闭会话,PHP 释放存储会话的文件,以下页面(共享会话)将不会加载。
我尝试将 PHP 处理程序更改为 Memcache 并解决了此错误,但我想知道您是否知道在 PHP 将会话存储在文件中时避免在 Symfony 中锁定 PHP 会话的任何简单方法。
解决方案
这种情况并非 Symfony 独有。您可以在几乎任何其他基于 PHP 的 Web 应用程序中体验完全相同的事情,这些应用程序使用来自同一客户端的会话和并行请求。
一个典型的例子是 WordPress,其中有多个插件需要更新。如果您同时单击所有插件上的 AJAX 更新链接,它们将不会同时同时更新。(您点击更新的第一个插件需要在第二个插件开始更新之前完成,以此类推)
可能重复:如何处理从一个客户端到一个 PHP 脚本的多个并行请求
Symfony 特有的部分问题是它真的很想有一个可用的会话,因为框架的某些部分(例如安全包)需要一个会话。当会话基于文件时,您会遇到限制,因为您不能在任何给定时间对同一个文件有多个写句柄,这是底层操作系统而不是 PHP 强加的警告。-- 这不是内存句柄的问题,这就是 memcached 为您解决这个问题的原因。
有什么理由要使用基于文件的会话而不是 memcached?memcached 是更好选择的原因有很多,如下所述:Session VS File VS Memcache for a Cache in PHP?
推荐阅读
- javascript - 我可以注册但不能更进一步
- php - 在 woocommerce 中获取价格的功能面临裁员
- android - 如何将数据从 Frag B 传递到 Frag A 并在再次调用时保留 Frag A 的状态?
- node.js - 在谷歌日历 API 中访问“忙碌”数组
- angular - Angular ngSwitchCase - 具有相同值的开关
- ejabberd - 如何将 ejabberd 与 phpmyadmin 连接以将消息存储到数据库中?
- python - 有没有办法为我的挑战减少这个 Python 代码的内存?
- r - 如何在 R 中完成行名?
- javascript - 将对象键的值推送到数组中
- c - 为什么添加临界区会导致分段错误?