【问题标题】:PHP sessions are blocking, ignoring session_write_closePHP 会话被阻塞,忽略 session_write_close
【发布时间】:2014-09-17 01:56:56
【问题描述】:

我正在尝试为来自同一浏览器会话的两个近乎同时的请求提供服务。

考虑以下最小示例:

<?php

session_start();

$sessionId = session_id();

session_write_close();

$file = sys_get_temp_dir() . '/lock_test';

if (!file_exists($file)) {

    touch($file);

    sleep(5);

    unlink($file);

    echo 'done! ' . $sessionId;

} else {

    echo 'locked! ' . $sessionId;

}

第二个请求应该导致“锁定”输出,但它总是等待第一个请求完成,然后输出“完成”。

Xdebug 没有运行。 PHP版本是5.5。

编辑:

投票关闭此作为重复。链接的问题建议要解决此问题,请附加一个随机变量。所以我建议附加一个 requestTime 变量并将其设置为以微秒为单位的时间戳。

【问题讨论】:

  • 你是如何提出上述要求的?
  • 从浏览器中点击脚本。据说这种方法可以用来促进多个 ajax 请求而不会相互阻塞,只要它们没有它。
  • 您是否尝试过删除文件 IO(只保留会话启动/关闭睡眠和回显)?
  • @Vatev 文件 IO 是关键的必需部分。
  • 在这里找到答案PHP flock() non-blocking still block why?。它解释了问题。解决方法是为每个请求附加一个微时间变量。

标签: php session


【解决方案1】:

这种行为是可以的。如果两个请求共享同一个会话并且您使用文件来存储会话数据,PHP 需要flock() 会话文件以防止它被多个尝试写入文件的并发请求损坏。 (当然PHP会一直flock()会话文件,但是有多个并发请求共享同一个会话,你可以看到它的效果)

【讨论】:

  • 但是我明确地调用了 session_write_close,这本质上是我在说“好的,我已经从这个会话文件中得到了我想要的东西,这个请求不需要再次写入或读取它” .
  • 好的,明白了。你的期望是有效的。需要对此进行调查。
猜你喜欢
  • 2012-04-20
  • 1970-01-01
  • 2012-06-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-04-16
  • 1970-01-01
相关资源
最近更新 更多