Php 方法ob#u启动和ob#u冲洗don';我不工作,为什么?

Php 方法ob#u启动和ob#u冲洗don';我不工作,为什么?,php,progress-bar,ob-start,Php,Progress Bar,Ob Start,我正在使用ob\u start()/ob\u 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 f

我正在使用
ob\u start()
/
ob\u 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();
Ob_end_clean()丢弃当前输出缓冲区的内容并关闭缓冲。

您应该改用ob_end_flush()。

您还需要检查PHP设置

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

输出缓冲=关闭
输出缓冲=4096


同意George的意见,但请检查上述设置,确保输出缓冲不会自动启动。运行:

print ob_get_level ();

在ob_开始()之前;如果will将看到其他内容,那么0您已经得到了答案。

您的Web服务器可能正在执行自己的缓冲。可能有点像mod_gzip

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

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

嘿,伙计,我也陷入了这个问题
最终得到了正确的解决方案
给你

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

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


可湿性粉剂迁移
  • 使用php头函数

  • 
    
    最好的

    添加这一行

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

    为我工作。

    您可以使用.htaccess文件编辑它

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

    php_value output_buffering Off
    php_value output_buffering 4096
    
    为我工作。谢谢大家!


    检查此站点:

    如果您特别不想缓冲输出并在处理页面时发送,为什么要使用输出缓冲?您的意思是什么?我确实希望在处理过程中输出这些内容。这不是我说的吗?输出缓冲是做完全相反的事情,即缓冲输出并同时发送。为什么要使用它?我在寻找一种在处理过程中发送缓冲区的方法,而不是像PHP通常那样等待整个脚本处理。这有点像一个进步系统。包含ob_flush()应该立即将缓冲区输出到显示器。而不是等待脚本完成。应该是这样工作的:“不像PHP通常那样等待整个脚本处理”,实际上,这不是PHP通常的工作方式。正如@Matti所说,输出缓冲是让PHP以这种方式工作的方式。如果您的Web服务器已经这样做了,那是因为您的Web服务器正在执行自己的缓冲/缓存。他在整个脚本中调用了
    ob\u flush()
    ,但我错了。看错了行。@MB34如果这个答案解决了你的问题,你应该把它标对;左边有一个复选标记,你可以点击。我必须在ob_start()之前添加ob_implicit_flush(true),并在php.ini中设置output_buffering=Off。在设置output_buffering=Off后,这工作正常。我的是11。。。但这意味着什么?@ryanknell我的意思是,你有11个级别的缓冲深度,或者说自从上次刷新ob_start()以来,你已经调用了11次。刷新将只返回在当前缓冲级别捕获的输出。这是否意味着如果调用刷新的次数与ob_get_level()的次数相同;您可以返回到0吗?
    header("X-Accel-Buffering: no");
    
    php_value output_buffering Off
    php_value output_buffering 4096