session 必须同步。当 A
写入/保存到 session
B
或 另一个 A
时,等待。这是基于文件的 session 处理所必需的。
但是一旦 A
加载了 session (但现在保存了它的修改),B
也应该被允许加载相同的 session 。因为加载将打开文件并将文件内容放入内存并关闭。
在 A
加载 session 和 A
保存 session 的整个过程中是否有任何理由阻止所有其他脚本。同步不能只用保存处理程序完成吗?
所以如果两个 PHP 脚本共享同一个 session ,它们将永远无法同时工作。
例如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
block 也会要求您等待 30 秒。
为什么它阻止不是我的问题。我在问为什么它会阻止 start to save
?而不是阻塞只保存
?
最佳答案
可能重复:
How does session_start lock in PHP?
Why does session_start cause a timeout when one script calls another script using curl
... 还有很多 ;)
编辑
之所以阻塞是因为正在读取 session 文件,并且它可能在第一个脚本运行时的任何时间点被修改,因此锁定。
对此的补救措施可能是
session_write_close()
作为 pointed by this post
关于PHP session_start 序列化并阻止共享同一 session 的所有其他人,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11188089/