Javascript 如果通过ajax调用PHP页面需要一段时间才能运行/返回(并设置会话变量),那么第二次ajax调用会看到这些会话更改吗?

Javascript 如果通过ajax调用PHP页面需要一段时间才能运行/返回(并设置会话变量),那么第二次ajax调用会看到这些会话更改吗?,javascript,php,ajax,session,Javascript,Php,Ajax,Session,我有一个通过ajax调用PHP页面的前端脚本。该PHP页面可以运行20-30秒。在运行期间,它多次设置一个$\u SESSION变量以指示状态/进度 当它运行时,我希望JavaScript中有一个间隔,通过ajax调用另一个脚本,该脚本只需检查$\u SESSION变量并返回其当前值 我的问题:即使第一个脚本继续运行,第二个脚本是否会在$\u会话中看到更新的值 第一个脚本 //We check session started... //Start $_SESSION[ "status" ] =

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

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

我的问题:即使第一个脚本继续运行,第二个脚本是否会在
$\u会话中看到更新的值

第一个脚本

//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" ] ) );
第二个脚本

//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\u 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();

你试过了吗?这是判断事物是否有作用的最快方法。@PatrickEvans还没有。如果有已知答案,不想浪费时间有没有办法知道客户端是否已经收到会话密钥?我的代码在CMS中,因此可能会有其他名为
session\u start()
的代码,但该会话从未在cookie中发送到客户端。有办法知道吗?在调用
session\u start()
之前,可以调用
session\u id()
。如果还没有会话,它将返回一个空字符串。谢谢。如果一些代码已经调用了
session\u start()
,那么
session\u id()
不会返回一个值吗?它将返回一个值,即使它从未发送到客户端。是的。这就是为什么你必须先检查它。在调用
session\u start()
之前,我看到他在哪里使用了
isset($\u COOKIE['PHPSESSID'])
。但他在这方面遇到了问题,建议的解决方案是使用
session\u id()
session\u status()
查看是否已经有会话正在进行。因此,似乎没有可靠的方法来区分新启动的会话和继续的会话,因此在PHP方面,没有办法知道。在JavaScript中,客户端是否有办法检查会话id?