PHP如何在执行剩余耗时脚本前先完成用户跳转 JS输出不生效问题
问题根因
你输出的JS跳转代码需要等整个PHP脚本执行完成后,才会随HTTP响应返回给浏览器解析执行,后续耗时的SSH、MySQL操作没跑完之前,浏览器收不到任何响应内容,自然不会触发跳转。如果耗时逻辑执行过程中输出了其他内容,还可能干扰JS代码的正常运行。
修复方案
优先推荐使用更可靠的HTTP 302跳转实现需求,代码如下:
if (!empty($_POST['install'])) { // 跳转前确保没有任何前置输出(包括HTML开头的空格、字符),否则会报header发送错误 header('Location: logged.php?a=s_created'); session_write_close(); // 关闭输出压缩,避免Content-Length计算异常 @ini_set('zlib.output_compression', 'Off'); // 清空现有缓冲区内容 ob_end_clean(); // 通知浏览器连接即将关闭 header("Connection: close"); // 浏览器断开连接后继续执行后续脚本 ignore_user_abort(true); // 输出最小内容保证部分低版本浏览器正常处理响应 ob_start(); echo " "; $size = ob_get_length(); header("Content-Length: $size"); // 把所有响应内容刷给浏览器 ob_end_flush(); flush(); // -------------------------- // 后续耗时的SSH、MySQL逻辑写在这里 // -------------------------- }
如果确实需要用JS跳转,按如下方式修改即可:
if (!empty($_POST['install'])) { session_write_close(); @ini_set('zlib.output_compression', 'Off'); ob_end_clean(); header("Connection: close"); ignore_user_abort(true); // 输出跳转JS ob_start(); echo '<script type="text/javascript">window.location.href = "logged.php?a=s_created";</script>'; // 部分浏览器需要至少1K内容才会解析执行响应,补充空格填充 echo str_repeat(" ", 1024); $size = ob_get_length(); header("Content-Length: $size"); ob_end_flush(); flush(); // -------------------------- // 后续耗时的SSH、MySQL逻辑写在这里 // -------------------------- }
注意事项
- 两种方案都需要确保PHP代码执行
header函数前没有任何输出,包括文件开头的BOM头、HTML前置字符、空格等。 - 必须添加
ignore_user_abort(true)配置,避免浏览器跳转断开连接后,服务端终止执行耗时逻辑。
内容的提问来源于stack exchange,提问作者user16442718
相关产品推荐
相关产品推荐

