javascript - 如果通过 ajax 调用 PHP 页面需要一段时间才能运行/返回(并且它设置 session 变量),第二个 ajax 调用会看到这些 session 更改吗?

标签 javascript php ajax session

我有一个通过 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" ] ) );

最佳答案

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

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

关于javascript - 如果通过 ajax 调用 PHP 页面需要一段时间才能运行/返回(并且它设置 session 变量),第二个 ajax 调用会看到这些 session 更改吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35190439/

相关文章:

ruby-on-rails - Nginx 在使用 format => 'js' 时引发 404

javascript - 如何将使用旧导入方法的第 3 方库包含到 Angular4.x 中?

javascript - 同源策略 : Why can't JS code make an HTTP request to its domain?

php - 需要 Laravel 验证|除 0 外存在

php - 产品网格中的自定义 SQL

sql-server - 我如何知道使用 Entity Framework 执行查询的进度?

javascript - 根据其中字符的长度设置ace编辑器实例的宽度

javascript - 修改 Geonames 的 JSON Ajax 请求

php - 将帐户限制为每个用户 1 个 - PHP

javascript - 快速路由和异步代码 - 如何发送异步代码的结果?