ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

php-每个会话不能有多个线程

2019-11-01 01:32:28  阅读:255  来源: 互联网

标签:ajax polling session php long-polling


我正在构建一些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都不可用.

标签:ajax,polling,session,php,long-polling
来源: https://codeday.me/bug/20191101/1979980.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有