【问题标题】:Why should session_write_close be used in long polling?为什么要在长轮询中使用 session_write_close?
【发布时间】:2012-09-06 06:02:14
【问题描述】:

我在Nolithius 阅读有关长轮询的文章。在PHP 在整个会话中休眠 部分下,写到应该调用session_write_close 函数以防止整个会话陷入死锁。这里的死锁到底是什么意思?这是否意味着如果没有此功能,在客户端打开的同一域中的任何其他页面将无法从其他脚本(如此脚本)接收 AJAX 数据,直到该脚本完成执行并返回结果?为什么会发生这种情况? session_write_close 在这里如何提供帮助?在收到此请求的数据后,下次他从该域请求页面时,不会使用它从客户端删除所有个性化设置吗?

【问题讨论】:

    标签: php session long-polling


    【解决方案1】:

    这是我的理解:

    当使用基于文件的会话时,每个请求都会从字面上锁定文件,直到请求结束。

    意味着下一个请求(也使用会话数据)必须等待锁被释放。

    这用于避免会话数据损坏。

    使用session_write_close() 将清理(但不会丢失任何会话数据)并提前释放文件上的锁定,从而允许其他请求继续。

    这是一种很好的做法,尤其是如果您的脚本可能会经常休眠。

    【讨论】:

    • 是只锁定正在休眠的文件,还是锁定整个域,从而不允许对其他脚本、页面加载等的其他 AJAX 请求?
    • 如果您这样看,是的,整个域将被锁定 - 如果您的所有脚本都打开并使用会话。最好的办法是在您需要的时间和地点选择性地打开和关闭会话 - 而不是脚本范围的会话访问。
    • 那么如果我使用session_write_close,那不会终止会话吗?也就是说,当用户从该域请求另一个页面时,他会开始一个新会话吗?
    • 结束会话意味着您不想再锁定数据。刷新可以有两种含义 - 1) 将内存中的数据发送到文件和/或 2) 删除数据。如果人们不知道上下文,就不要使用这个词。
    • 如果可能,我建议您在对$_SESSION 进行所有更改后始终使用它。特别是如果您的 PHP 提供大量 JSON,则打开的会话文件可能会减慢 AJAX 应用程序的抓取速度,因为每个 AJAX 请求都是连续的。如果你不能总是关闭它,那么至少查看 PHP 中 resize imagesserve files 的部分,并特别注意在这些操作之前关闭会话,否则您可能会在相当长的时间内阻止请求。
    猜你喜欢
    • 1970-01-01
    • 2011-11-05
    • 1970-01-01
    • 2013-01-31
    • 1970-01-01
    • 1970-01-01
    • 2015-09-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多