Php Can';每个会话没有几个线程

Php Can';每个会话没有几个线程,php,ajax,session,long-polling,polling,Php,Ajax,Session,Long Polling,Polling,我正在构建一些webapp,并实现了长轮询(以及数据库中的一个命令队列),因此我的服务器可以异步向我的cleint发送命令,等等。这些命令被编码为json,并通过ajax调用发送给客户端到服务器,以及通过长轮询发送给服务器到客户端 一切正常,直到我在ajax.php文件中包含了我的“身份验证模块”。此模块包装会话内容并调用会话\ u start() 问题是,我的长轮询例程在提交回客户端之前最多可以等待21秒。在此期间,服务器不会从同一会话运行任何内容。而是在长轮询ajax调用返回后立即执行 我知

我正在构建一些webapp,并实现了长轮询(以及数据库中的一个命令队列),因此我的服务器可以异步向我的cleint发送命令,等等。这些命令被编码为json,并通过ajax调用发送给客户端到服务器,以及通过长轮询发送给服务器到客户端

一切正常,直到我在ajax.php文件中包含了我的“身份验证模块”。此模块包装会话内容并调用会话\ u start()

问题是,我的长轮询例程在提交回客户端之前最多可以等待21秒。在此期间,服务器不会从同一会话运行任何内容。而是在长轮询ajax调用返回后立即执行

我知道每次会话可能只有1个线程,而且请求是排队的

现在的问题是:解决这个问题的最佳方法是什么?是否有允许每个会话有几个线程的设置(在我的情况下,3个线程就可以了)。或者我应该只发送一条消息,告诉客户端他的SessionID是什么(我的数据库中有一些sessions表,用于跟踪哪个用户连接到哪个会话)。然后,客户端可以将其与任何ajax调用一起发送,这样就可以绕过身份验证模块

关于后一种选择,我担心这会带来一系列安全问题,因为最终会出现会话欺骗。我需要向每个会话发送一个“随机字符串”,以确保您不会太容易欺骗,但即使如此,它也不是完美的

感谢您的支持:)


Nicolas Gauthier

众所周知的一个问题/事实是,PHP会在会话文件使用期间锁定它们,以防止出现争用情况

如果您查看PHP源代码(ext/session/mod_files.c),可以看到
ps_files\u open
函数锁定会话文件,而
ps_files\u close
将其解锁

如果在长时间运行的脚本开始时调用
session\u start()
,并且没有显式关闭会话文件,它将被锁定,直到脚本终止,在脚本关闭期间,PHP将释放所有文件锁

当您不使用会话时,应调用
session\u write\u close
将会话数据刷新到磁盘,然后释放锁,以便您的其他“线程”可以读取数据

我相信你可以想象如果文件没有被锁定会发生什么

T1: Open Session
T2: Open Session
...
T2: Write Data
T1: Write Data

线程2写入的数据将被线程1完全覆盖,同时,线程1想要写入的任何数据对线程2都不可用。

只是一个想法。会话文件可能被锁定,单独的“线程”无法访问它们。您是否尝试过在不需要时显式关闭会话?我看到你说你有一个将会话ID与会话关联的表,整个会话都在表中吗?(如果是这样,忽略我的文件锁定理论)没有使用表,因此我可以向“给定用户的所有会话”等发送消息。我并没有在会话变量中存储太多内容,只存储userId、sessionID(我数据库中的那些)以及它是否有效。我试着看看我能用“会话\写入\关闭”做些什么,就像你提到的“在不需要时显式关闭会话。哇,改变”睡眠($counter);“按”会话写入关闭();睡眠(柜台);会话_start();“解决了问题!似乎它在“会话文件资源”上被阻止了”…u genius哈哈,发布一个问题,我将选择作为awnser!会话文件只能在您需要写入时被阻止?