php - 每个 session 不能有多个线程

标签 php ajax session long-polling polling

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

一切正常,直到我将“身份验证模块”包含在 ajax.php 文件中。该模块包装 session 内容并调用 session_start()。

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

我知道每个 session 一次可能只有 1 个线程的限制,并且请求排队。

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

在后面的选项中,我担心它会因为最终的 session 欺骗而打开一堆安全问题。我需要向每个 session 发送一个“随机字符串”,以确保您不会轻易欺骗,但即便如此,它也不是完美的...

感谢您的遮阳篷:)

尼古拉斯·高捷

最佳答案

这是一个众所周知的问题/事实,即 PHP 在使用期间锁定 session 文件以防止竞争条件。

如果您查看 PHP 源代码 (ext/session/mod_files.c),您可以看到 ps_files_open 函数锁定 session 文件,而 ps_files_close 解锁它。

如果您在长时间运行的脚本开始时调用 session_start(),并且没有明确关闭 session 文件,它将被锁定直到脚本终止,此时 PHP 将释放所有脚本关闭期间的文件锁定。

当您不使用 session 时,您应该调用session_write_close 将 session 数据刷新到磁盘,并释放锁以便您的其他“线程”可以读取数据。

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

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

线程 2 写入的数据将被线程 1 完全覆盖,与此同时,线程 2 无法使用线程 1 想要写出的任何数据。

关于php - 每个 session 不能有多个线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12007504/

相关文章:

javascript - ajax 调用后选项卡不工作

ajax - 如何在ajax渲染父组件期间跳过子组件?

拉拉维尔 5.2 : How to access Request & Session Classes from own Event Listener?

php - 试图从 php 获取数组并将其存储在 java、android 中

php - 关于如何解析此数据集的任何优雅想法?

javascript - FormData vs jQuery#serialize(),有什么区别?

c# - Session.Abandon() 不会立即放弃 session

php - Codeigniter 按注销按钮并禁用后退浏览器按钮

php - 使用 laravel crinsane cart 搜索购物车中的商品

php - 来自数据库的谱系/家谱图