如果通过 ajax 调用 PHP 页面需要一段时间才能运行/返回(并且它设置了会话变量),则第二次 ajax 调用会看到


If call PHP page via ajax that takes a while to run/return (and it sets session variables), will a 2nd ajax call see those session changes?

我有一个前端脚本,它通过ajax调用PHP页面。该 PHP 页面可以运行 20-30 秒。在运行过程中,它会多次设置$_SESSION变量以指示状态/进度。

当它运行时,我希望在 JavaScript 中有一个间隔,通过 ajax 调用另一个脚本,该脚本只是检查该变量并返回其当前值$_SESSION

我的问题:即使第一个脚本继续运行,第二个脚本也会在$_SESSION中看到更新的值吗?

第一个脚本

//We check session started...
//Start
$_SESSION[ "status" ] = "started";
//Some long function
doSomethingSlow();
//Progress
$_SESSION[ "status" ] = "did something";
//Some long function
doSomethingElseSlow();
//Done
$_SESSION[ "status" ] = "started";

第二个脚本

//We check session started...
//Return the status
return json_encode( array( "status" => $_SESSION[ "status" ] ) );
我认为

这取决于第一个脚本是否必须创建会话,或者在运行第一个脚本之前已经创建了会话。若要继续会话,客户端必须已收到来自发送会话 ID cookie 的脚本的响应。因此,第一个要求是会话由在发送第一个 AJAX 请求之前完成的某个脚本启动。这可能是发送包含 AJAX 调用的页面的脚本。

另一个问题是 PHP 通常在打开会话时锁定会话文件,并在脚本终止时更新它。因此,如果第二个脚本在第一个脚本运行时尝试访问同一会话,它将挂起等待锁定。要强制它立即更新并在分配会话变量后解锁文件,您需要调用 session_write_close() 。关闭会话文件后,您需要在写入会话变量之前再次使用 session_start() 重新打开它。

//Start
$_SESSION[ "status" ] = "started";
session_write_close();
//Some long function
doSomethingSlow();
//Progress
session_start();
$_SESSION[ "status" ] = "did something";
session_write_close();
//Some long function
doSomethingElseSlow();
//Done
session_start();
$_SESSION[ "status" ] = "started";
session_write_close();