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

标签 php session concurrency locking

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.phpnon-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_start hangs

How to kill a PHP session?

... 还有很多 ;)

编辑

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

  2. 对此的补救措施可能是 session_write_close() 作为 pointed by this post

  3. How to prevent blocking php requests, by Konr Ness

关于PHP session_start 序列化并阻止共享同一 session 的所有其他人,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11188089/

相关文章:

javascript - 我在页面加载时将整个 $_SESSION 变量放入 json 对象中。虽然这对我有用,但这是一个好的做法吗?

session - node.js 通过身份验证状态

php - PHP解析/语法错误;以及如何解决它们

PHP 到 XML - 替换/修剪特殊字符

php - ubuntu MySQL root密码自动更改

php - 当前在线访问者逻辑在 PHP 中

java - Rhino Script Engine 的生命周期和并发语义是什么

java - 播放音乐时 JFrame 不显示?

java - BlockingQueue 中的 take() 和 put() 实现

php - MySQL语句如果数字小于php变量