首页 / PHP / php-每个会话不能有多个线程
php-每个会话不能有多个线程
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了php-每个会话不能有多个线程,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含1595字,纯文字阅读大概需要3分钟。
内容图文
![php-每个会话不能有多个线程](/upload/InfoBanner/zyjiaocheng/675/e36a90a2661c472181a9dece8490f25b.jpg)
我正在构建一些webapp,并实现了长轮询(以及数据库中的命令队列),以便服务器可以将命令异步发送给cleint,等等.这些命令被编码为json,并通过ajax调用发送给客户端到服务器,并通过长轮询来实现服务器到客户端的方式.
一切正常,直到我在ajax.php文件中包含“身份验证模块”.该模块包装会话内容并调用session_start().
问题是,我的长轮询例程可能要等待多达21秒才能返回客户端.在这段时间内,服务器不会在同一会话中运行任何内容.相反,它在长轮询ajax调用返回后立即执行.
我知道每个会话一次只能有1个线程的限制,并且请求已排队.
现在的问题是:解决此问题的最佳方法是什么?是否有设置允许每个会话几个线程(在我的情况下3个就可以了).还是我应该只是告诉客户他的SessionID是什么(我的数据库中有一些会话表,以跟踪哪个用户连接到哪个会话).然后,客户端可以将其与任何ajax调用一起发送,因此可以绕过身份验证模块.
在后面的选项中,由于最终的会话欺骗,恐怕它会打开一堆安全问题.我将需要向每个会话发送一个“随机字符串”,以确保您不会轻易欺骗,但是即使那样,它也不是完美的……
谢谢您的遮阳篷:)
尼古拉斯(Nicolas Gauthier)
解决方法:
PHP会在会话文件使用期间锁定会话文件,以防止出现竞争状况,这是一个众所周知的问题/事实.
如果查看PHP源代码(ext / session / mod_files.c),您会看到ps_files_open函数锁定了会话文件,而ps_files_close则将其解锁.
如果您在长时间运行的脚本的开头立即调用session_start(),而没有显式关闭会话文件,它将被锁定,直到脚本终止为止,PHP将在脚本关闭期间释放所有文件锁.
当您不使用会话时,应调用session_write_close将会话数据刷新到磁盘,然后释放锁,以便其他“线程”可以读取数据.
我敢肯定,您可以想象如果文件未锁定会发生什么情况.
T1: Open Session
T2: Open Session
...
T2: Write Data
T1: Write Data
线程2写入的数据将被线程1完全覆盖,与此同时,线程1想要写出的任何数据对于线程2都不可用.
内容总结
以上是互联网集市为您收集整理的php-每个会话不能有多个线程全部内容,希望文章能够帮你解决php-每个会话不能有多个线程所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。