【问题标题】:Flush even ob flush not working冲洗甚至 ob 冲洗不起作用
【发布时间】:2015-04-24 15:30:14
【问题描述】:

我正在尝试使用 php 中的 for 循环将行插入 MySQL 数据库。我想要的是在完成时回显正在插入的特定行名。我尝试了flush方法,但是没有用,甚至ob_flush都没有。

然后我在这里搜索了解决方案并找到了一些解决方案,尝试了所有方法,但是当整个脚本完成后,我仍然可以一次得到所有输出......

我的代码看起来像这样(我添加了一些我在网上找到的可以解决问题的行,但仍然没有运气,在下面的代码中我删除了 mysql 的东西,因为它工作正常,数据被写入分贝):

<?php
 header( 'Content-type: text/html; charset=utf-8' );
 ob_implicit_flush(true);
 ob_end_flush();
 $con=mysqli_connect("...");
?>

<html>
<body>

<?php
for($d=1;$d<=5;$d++){
 echo "$d";
 echo str_repeat(' ', 4096);
 ob_flush();
 flush();  
 $query = "...";
 mysqli_query($con,$query);
}

</body>
</html>

在这种情况下,脚本当然会立即运行,但在实际场景中,每个循环实际上需要一些时间来完成其中的内容,所以在大约 10 秒后一切都完成后,我得到了最终的回显。我想在每次 for 循环迭代后回显它,即大约每 2 秒

【问题讨论】:

  • 基于浏览器的输出与基于命令行或控制台的输出不同。您可以考虑使用异步请求来填充查询执行结果。
  • 控制台也没有显示任何内容,在这种情况下,我将如何在浏览器中刷新它,换句话说,我只想让用户看到发生了什么以及脚本有多远

标签: php html mysql google-chrome


【解决方案1】:

下面的代码对我有用。但是,一开始它似乎似乎不起作用,因为一长串空格将交错的响应推向右侧,我看不到响应。

请参阅下面的THIS LINE HERE

<?php 

$db_host = '...';
$db_user = '...';
$db_pass = '...';
$db_name = '...';

$con = new mysqli(
    $db_host,
    $db_user,
    $db_pass,
    $db_name
);

if ($con->connect_error) {
    echo "$con->connect_error";
    exit;
}

for ($d = 1; $d <= 5; $d++){
    echo $d;
    echo str_repeat(' ', 4096);
    echo PHP_EOL; // <<< THIS LINE HERE

    ob_flush();
    flush();

    $query = "SELECT SLEEP(5)";

    mysqli_query($con, $query);
}

这个(更简单的测试)也有效:

for ($i = 0; $i < 6; $i++) {
    echo "$i is run." . PHP_EOL;

    ob_flush();
    flush();

    sleep(10);
}

所以,创建一个独立页面,将上面的内容粘贴到其中并填写数据库详细信息。然后运行它,看看你是否得到输出。如果你这样做了,那么你没有包含的代码有一些(类似或其他)问题。如果不是,则可能是您的服务器配置以某种方式使其无法正常工作。

不过,首先,尝试让一个更简单的版本工作,然后从那里开始。这也是一本不错的入门书:

http://www.sitepoint.com/php-streaming-output-buffering-explained/

【讨论】:

    猜你喜欢
    • 2012-06-17
    • 2016-05-16
    • 2013-03-04
    • 2018-06-24
    • 2011-11-10
    • 2012-06-19
    • 1970-01-01
    • 2016-04-07
    • 1970-01-01
    相关资源
    最近更新 更多