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