PHP session_start序列化并阻止共享同一会话的所有其他会话


PHP session_start serializes and blocks all others sharing the same session

会话必须同步。当A写入/保存到session Banother A时,将等待。这是基于文件的会话处理的必备条件。

但是一旦A加载了会话(但现在保存了其修改),B也应该被允许加载相同的会话。 因为加载将打开文件并将文件内容放入内存并关闭。

是否有任何理由在加载会话和A保存会话的整个过程中阻止所有其他脚本A。 不能只用保存处理程序进行同步吗?

因此,如果两个 PHP 脚本共享同一个会话,它们就永远无法同时工作。

例如seslock.php

<?php
header('Content-Type: text/plain');
session_start();
if(isset($_GET['wait'])){
    sleep(30);
    echo "waiting'n";   
}else{
    echo "No Waiting'n";
}
?>
done

访问seslock.php将立即响应,但seslock.php?wait需要 30 秒才能响应。但问题是,如果您首先请求seslock.php?wait并且仅请求seslock.php第二个。事件 non-sleep 块也会要求您等待 30 秒。

为什么阻止它不是我的问题。我在问为什么它会阻止start to save?而不是阻止only save

可能的重复项:

session_start如何锁定 PHP?

为什么当一个脚本使用 curl 调用另一个脚本时session_start会导致超时

session_start挂

如何杀死 PHP 会话?

。还有许多;)

编辑

  1. 它阻塞的原因是正在读取会话文件,并且在第一个脚本运行时的任何时间点都可能被修改,因此锁定。

  2. 对此的
  3. 补救措施可能是这篇文章所指出的session_write_close()

  4. 如何防止阻止 php 请求,作者:Konr Ness

默认的

PHP 会话处理程序用于序列化每个会话 ID 的会话更改。这样做的好处是保证脚本中的会话状态一致。

您可以通过在session_start()后立即运行session_write_close()来放弃这一优势。不过,这也使您的会话是只读的。

或者,您可以编写自己的会话处理程序而不锁定。