php – Symfony 2阻止了并发
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了php – Symfony 2阻止了并发,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2464字,纯文字阅读大概需要4分钟。
内容图文
![php – Symfony 2阻止了并发](/upload/InfoBanner/zyjiaocheng/736/9377c94e3e0f46648af0ad8465a42dbf.jpg)
我有一个Symfony 2.5应用程序,我有一些奇怪的请求并发问题.
为了演示这个问题,我创建了两个名为/ time和/ sleep的路由.控制器的主体非常简单:
timeAction():
time();
sleepAction()
sleep(30);
当我在浏览器中请求/ time路由时 – 它会立即响应当前时间戳.但是,当我第一次请求/ sleep路由然后是/ time路由时 – 它只是挂在那里直到sleep()完成.只有在此之后,/ time控制器才会响应时间戳.换句话说 – 一个请求阻止所有其他请求.我一开始并没有注意到这一点,但是当你有长期执行计划的请求时 – 它变得明显.
这可能是什么原因?
我仍然会自己做一些额外的测试来深入挖掘这种情况.我将尝试更详细地更新问题.
解决方法:
更新
看起来PdoSessionHandler现在使用它自己的一些锁定机制来阻止并发请求.旧的解决方案将不再开箱即用.
并发问题的官方解决方案是在请求处理周期中尽快关闭会话.您可以通过调用$session-> close()或session_write_close()来执行此操作.
但是,如果您确定应用程序中不会出现会话数据冲突,则可以安全地禁用PDO会话处理程序配置中的锁定:
# services.yml
session.handler.pdo:
class: Symfony\Component\HttpFoundation\Session\Storage\Handler\PdoSessionHandler
public: false
arguments:
- "pgsql:host=%database_host%;port=%database_port%;dbname=%database_name%"
- db_username: %database_user%
db_password: %database_password%
db_table: session
db_id_col: session_id
db_data_col: session_value
db_time_col: session_time
db_lifetime_col: session_lifetime
lock_mode: 0 # LOCK_NONE
您可以在此问题中阅读更多内容:
https://github.com/symfony/symfony/pull/10908
老解决方案
感谢Crozin,他指出了我正确的方向,这有助于解决我的问题.我将在此处提供其他信息,希望将来可以帮助某人节省一些时间.
以下主题还介绍了此问题:
> How do I configure Apache2 to allow multiple simultaneous connections from same IP address?
> Simultaneous Requests to PHP Script
问题是PHP默认使用基于文件的会话处理.换句话说,会话数据存储在服务器文件系统的特定文件中.并且为了保护该文件免于意外同时写入,使用文件锁定机制.这是计算机科学中的经典locking problem.对PHP的第一个请求将获得会话文件的锁定,所有其他请求将必须等待释放此锁定.如果您在多请求环境中有一个持久的请求(例如同时使用AJAX请求或页面上有多个帧),它将变得明显.
可以通过在脚本完成之前,在完成所有会话操作之后或者通过切换到另一个会话存储机制(如数据库会话存储)之前预先调用session_write_close()来解决该问题.
我认为,在Symfony 2中,最好的做法是与PDO处理程序(在您选择的数据库中)存储会话.以下是如何设置它的官方教程:
How to Use PdoSessionHandler to Store Sessions in the Database.
提示:如果您正在使用Doctrine迁移,那么您可以创建一个新的迁移类,并添加为创建会话存储表所需的SQL.
使用这种方法,您将拥有更好的非阻塞会话存储机制,您的应用程序将能够横向扩展.
内容总结
以上是互联网集市为您收集整理的php – Symfony 2阻止了并发全部内容,希望文章能够帮你解决php – Symfony 2阻止了并发所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。