繁体   English   中英

如果通过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();

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM