php-每个会话不能有多个线程
作者:互联网
我正在构建一些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