4

会话必须同步。当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

4

2 回答 2

6

可能的重复:

PHP 中 session_start 是如何锁定的?

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

session_start 挂起

如何杀死 PHP 会话?

......还有很多;)

编辑

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

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

  3. 如何防止阻塞 php 请求,Konr Ness

于 2012-06-25T11:17:55.600 回答
0

默认的 PHP 会话处理程序用于序列化每个会话 ID 的会话更改。这具有跨脚本保证一致的会话状态的好处。

session_write_close()您可以通过紧随其后而放弃这一优势session_start()。不过,这也会使您的会话成为只读的。

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

于 2012-06-25T23:16:48.267 回答