php - 检查 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
}
}
不应该首先显示“正在加载..”文本,然后页面继续加载,直到状态更改为“已完成”。为什么没有发生。
解决方案
在此之前我想显示“正在加载..”消息。但它不会发生,直到循环完成并且状态更改为“完成”。
PHP 通常会为 4096 字节启用输出缓冲,即使没有输出缓冲,中间服务器也可能会缓冲。
所以像这样的命令:
echo "loading..";
实际上从脚本的角度来看输出,但它不能自动意味着浏览器会接收它。我们有根据的猜测是,这就是你所经历的。
为了更“主动”,您可以切换到分块传输编码并发送片段。在 PHP 中,您可以使用以下函数触发它flush()
:
echo "loading..";
flush();
一些浏览器可能仍然拒绝显示它,直到它们收到特定数量的字节,请查看flush();
文档页面以获取一些详细信息。
例如,如果启用了输出缓冲,则需要先刷新输出缓冲区,然后再刷新:
echo "loading..";
ob_flush();
flush();
此外,如果中间服务器正在缓冲,从 PHP 的角度来看,这也是失控的。深入了解文档页面以充分利用它。
推荐阅读
- ios - 在 UICollectionView 中居中第一个 UICollectionViewCell
- python - Bokeh 或 Plotly 中的极坐标等值线图
- python - Python 指定自定义 HeapSort 排序算法
- java - 让 Java 递归迷宫求解器更高效
- python - 计算python中列表中过零的数量
- mongoose - 使用 mongoose populate 填充作为 Id 数组的属性
- javascript - How to utilize a while loop to animate and display a total
- javascript - 为什么我的叠加层在 img 悬停时不起作用?
- batch-file - 在 .bat 文件中执行 exiftool 命令
- python - 在单独的类中使用枚举