如果通过 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();
相关文章:
- 另一个ajax调用中的Jquery ajax调用在for循环中没有按预期工作
- Javascript/jQuery中的并行Ajax调用
- 任何方式使AJAX调用Gmail API,而无需通过JS库
- node.js请求数据事件未在CORS ajax调用中触发
- 如何从ajax调用返回.wrap()元素
- Ajax调用在Firefox中不会自动响应
- AJAX调用中的非法调用
- 使用AJAX调用将GeoJSON数据拉入传单
- 在MVC 4中,对Controller的Ajax调用为空
- Jquery:对返回JSON数据的php脚本的Ajax调用
- 在ajax调用中阻止来自JS对象的函数
- 如何在MVC5中ajax调用的部分视图中引用外部javascript
- 页面加载后的Ajax调用
- 如何使用Ajax调用特定的控制器和操作来重定向用户
- curl和fileget_contents在ajax调用后不起作用
- 在任何AJAX调用之前触发一个javascript函数
- 无法在mvc视图中使用ajax调用获取操作返回的模型对象列表
- Ajax调用ERror Cross Origin REquest:在rails中自动完成大学列表
- ASP.NET MVC 3-在ajax调用后,重定向到新页面或生成页面刷新
- 点击功能没有'ajax调用动态元素(Backbone)后无法工作