我使用 Symfony 作为Web应用程序的框架,并且遇到了 PHP锁定会话的问题。
当我打开浏览器选项卡并访问处理大量数据的应用程序页面(需要12到18秒)时,如果我打开另一个选项卡并访问另一个应用程序的页面(例如index,在不到一秒钟的时间内加载),后一个标签页直到前一个标签页完成后才会加载。
我认为这是因为:当我打开第一页时,Symfony控制器会自动打开会话,PHP会锁定存储会话的文件,因此,直到此页面未完成处理之前,控制器都会关闭会话并PHP释放了存储会话的文件,以下页面(共享会话)将不会加载。
我试图将PHP处理程序更改为Memcache并解决了该错误,但是我想知道您是否知道任何简单的方法来避免在PHP存储会话时在Symfony中锁定PHP会话在文件中。
谢谢。
答案 0 :(得分: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?