11

我正在使用ob_start()/ob_flush()来希望在长时间的导入操作中给我一些进步。

这是我正在做的事情的简单概述:

<?php
ob_start ();

echo "Connecting to download Inventory file.<br>";
$conn = ftp_connect($ftp_site) or die("Could not connect");

echo "Logging into site download Inventory file.<br>";
ftp_login($conn,$ftp_username,$ftp_password) or die("Bad login credentials for ". $ftp_site);

echo "Changing directory on download Inventory file.<br>";
ftp_chdir($conn,"INV") or die("could not change directory to INV");

//      connection, local, remote, type, resume
$localname = "INV"."_".date("m")."_".date('d').".csv";
echo "Downloading Inventory file to:".$localname."<br>";

ob_flush();
flush();
sleep(5);

if (ftp_get($conn,$localname,"INV.csv",FTP_ASCII)) 
{
    echo "New Inventory File Downloaded<br>";
    $datapath = $localname;
    ftp_close($conn);
} else {
    ftp_close($conn);
    die("There was a problem downloading the Inventory file.");      
}
ob_flush();
flush();
sleep(5);

$csvfile = fopen($datapath, "r"); // open csv file
$x = 1;
// skip the header line
$line = fgetcsv($csvfile);
$y = (feof($csvfile) ? 2 : 5);
while ((!$debug) ? (!feof($csvfile)) : $x <= $y) {
    $x++;
    $line = fgetcsv($csvfile);
    // do a lot of import stuff here with $line
    ob_flush();
    flush();
    sleep(1);
}

fclose($csvfile); // important: close the file
ob_end_clean();

但是,根本没有任何东西输出到屏幕上。

我知道数据文件正在下载,因为我观察了放置它的目录。

我也知道导入正在发生,这意味着它在 while 循环中,因为我可以监视数据库并且正在插入记录。

关于为什么我没有将输出输出到屏幕的任何想法?

4

7 回答 7

18

您还需要检查 PHP 设置

有些安装默认为 4096,有些默认为关闭

output_buffering = 关闭
output_buffering = 4096

同意乔治,但请检查上述设置

于 2010-05-14T19:48:18.823 回答
17

确保您的输出缓冲不会自动启动。跑:

print ob_get_level ();

ob_start() 之前;如果会看到别的东西然后 0 你得到了答案。

于 2010-05-14T19:50:37.173 回答
7

嘿,伙计,我也陷入了这个问题,终于在这里找到了正确的解决方案,适合您

你必须为你的页面添加内容类型 你可以通过两种方式做到这一点 1. 使用 html 标签

<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">

前任。

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Wp Migration</title>
</head>
<body>
<?php 
for($i=0;$i<70;$i++)
{
echo 'printing...<br>';
ob_flush();
flush();
sleep(3);
}
?>
</body>
</html>
  1. 使用php头函数

    <?php header( 'Content-type: text/html; charset=utf-8' ); ?>

前任。

<?php 
header( 'Content-type: text/html; charset=utf-8' );
for($i=0;$i<70;$i++)
{
echo 'printing...<br>';
ob_flush();
flush();
sleep(3);
}
?>

祝一切顺利

于 2013-06-12T13:08:20.913 回答
3

Ob_end_clean() 丢弃当前输出缓冲区的内容并关闭缓冲。您应该改用 ob_end_flush() 。

于 2010-05-14T19:41:52.000 回答
1

添加这一行

header("X-Accel-Buffering: no");

为我工作。

于 2019-01-17T08:25:47.047 回答
0

您可以使用 .htaccess 文件对其进行编辑

要禁用输出缓冲,请按如下方式修改该行:

php_value output_buffering Off
php_value output_buffering 4096

为我工作。谢谢!

查看本站:点击这里

于 2020-10-30T13:57:00.753 回答
-1

您的网络服务器可能正在做自己的缓冲。可能使用 mod_gzip 之类的东西。

这是一些非常简单的测试代码:

<?php
echo 'starting...<br/>';
for($i = 0; $i < 5; $i++) {
  print "$i<br/>";
  flush();
  sleep(2);
}
print 'DONE!<br/>';

如果加载该页面需要 10 秒,而不是每 2 秒看到一个新行,那么这意味着它正在被您的网络服务器缓存。对于您要执行的操作,无需使用 ob_start 和 ob_flush。flush只要您想将内容强制到浏览器,只需调用即可。但是,就像我提到的,如果网络服务器在发送之前等待内容完成,那么这对您没有任何帮助。

编辑:另一种可能性是您正在从公司或 ISP 代理/防火墙后面查看该页面,该页面在提供之前等待整个页面(以便它可以扫描它以查看它是否看起来像色情,例如)。

于 2010-05-14T19:52:34.510 回答