我有一个通过 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/