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

Nee*_*asu 3 php concurrency session locking

会话必须同步.当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
Run Code Online (Sandbox Code Playgroud)

访问seslock.php将立即响应,但seslock.php?wait 需要30秒才能回复.但问题是如果你seslock.php?wait先请求而且只是seslock.php第二次.该non-sleep块将要求您等待30秒.

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

Lio*_*han 5

可能重复:

session_start如何在PHP中锁定?

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

session_start挂起

如何杀死PHP会话?

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

编辑

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

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

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