首页 > 解决方案 > 检查 isset($_POST["submit"]) 两次不起作用

问题描述

我正在连接到 API 以发布文件并检索有关文件的数据。问题是 API 返回状态为“已排队”的一半数据。我希望我的脚本每 10 秒检查一次。所以我使用 sleep(10) 和循环。但是,我想在那之前显示一条“正在加载..”消息。但它不会发生,直到循环完成并且状态更改为“完成”。

if(isset($_POST["submit"])) {
    echo "loading..";
}

// curl request here

if(isset($_POST["submit"])) {
    while($status == 'queued') {
        sleep(10);
        // curl request again and check status
    }
    if($status == 'completed') {
        // do stuff
    }
}

不应该首先显示“正在加载..”文本,然后页面继续加载,直到状态更改为“已完成”。为什么没有发生。

标签: phploops

解决方案


在此之前我想显示“正在加载..”消息。但它不会发生,直到循环完成并且状态更改为“完成”。

PHP 通常会为 4096 字节启用输出缓冲,即使没有输出缓冲,中间服务器也可能会缓冲。

所以像这样的命令:

echo "loading..";

实际上从脚本的角度来看输出,但它不能自动意味着浏览器会接收它。我们有根据的猜测是,这就是你所经历的。

为了更“主动”,您可以切换到分块传输编码并发送片段。在 PHP 中,您可以使用以下函数触发它flush()

echo "loading..";
flush();

一些浏览器可能仍然拒绝显示它,直到它们收到特定数量的字节,请查看flush();文档页面以获取一些详细信息。

例如,如果启用了输出缓冲,则需要先刷新输出缓冲区,然后再刷新:

echo "loading..";
ob_flush();
flush();

此外,如果中间服务器正在缓冲,从 PHP 的角度来看,这也是失控的。深入了解文档页面以充分利用它。


推荐阅读