会话必须同步。当A
写入/保存到session
B
或another 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 会话?
。还有许多;)
编辑
-
它阻塞的原因是正在读取会话文件,并且在第一个脚本运行时的任何时间点都可能被修改,因此锁定。
对此的 补救措施可能是这篇文章所指出的
session_write_close()
如何防止阻止 php 请求,作者:Konr Ness
PHP 会话处理程序用于序列化每个会话 ID 的会话更改。这样做的好处是保证脚本中的会话状态一致。
您可以通过在session_start()
后立即运行session_write_close()
来放弃这一优势。不过,这也使您的会话是只读的。
或者,您可以编写自己的会话处理程序而不锁定。