PHP实时显示进度

就在昨天,客户提了个要实时进度的要求,然后我想了想,那肯定就是得用上ob_start()了,然而比我想象得麻烦了很多

当时是用了wamp3.1.7 64bit 用的是PHP7.3 和wampmanager 2.0的 用的是PHP5.2,还有个phpstudypro 配了5.2 5.4 7.3 三个php版本

7.2版本的只需要加一行 ob_implicit_flush(1) ,(官网的解释是:打开/关闭绝对刷送,相当于自动在每句echo后面调用flush() )就可以实现实时输出,当然缺不了字符填充:

ob_implicit_flush(1); //立即输出
echo str_repeat(" ",4096*20);//字符填充
for($i=0;$i<50;$i++){//可以根据进度调整
	sleep(1);//避免太快,瞬间输出啥也看不出
    echo $i."<br>";  //放置执行代码
}
就这么简简单单朴实无华,然后5.4也支持,5.3的是我公司项目使用的,因为zendf框架的原因,显示不出来,只会等全部执行完再一起输出,然后就是在官网.一直找各种函数,说明,最终在zendf框架能出来的方法被试出来了:
		ob_start(); //打开输出缓冲控制
        echo str_repeat(' ',4069);    //部分浏览器存在需要大小足够的缓存才开始输出
        echo ob_get_clean();    //获取当前缓冲区内容并清除当前的输出缓冲
        flush(); //刷新输出缓存
        for($i = 0; $i < 10; $i++)
        {
            sleep(1);
            echo $i;
            echo ob_get_clean();    //将ob_strat内的数据数获取并清除当前缓冲
        }

我反正用这种办法就能在5.3上的zend框架实时输出,这也应该是最 原始的吧,先打开输出缓冲ob_start,让脚本将不会输出内容(除http标头外),输出的内容被存储在内部缓冲区中,再从缓存区获取ob_get_clean();然后flush()输出,如此循环。(有时候你把ob_start()去掉也能行,这很你的apache PHP 设置 有关,一般就写上吧)

如果是想显示进度条那种的,可以让他输出JS就行,这个csdn上一搜一大堆不赘述,只是把自己在老版本,老框架上能用的方法分享出来,哪天用空了,可以一起来聊聊这个缓存区

相关 :

ob_start
ob_get_contents
ob_implicit_flush
flush
ob_end_clean
ob_end_flush
ob_get_flush

最后 中国加油!!!

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 这是一个PHP代码片段,可以帮助您显示下载进度条: ``` $file = "yourfile.zip"; $file_size = filesize($file); header("Content-Type: application/octet-stream"); header("Content-Disposition: attachment; filename=$file"); header("Content-Length: $file_size"); $chunksize = 1 * (1024 * 1024); $handle = fopen($file, 'rb'); $buffer = ''; while (!feof($handle)) { $buffer = fread($handle, $chunksize); echo $buffer; ob_flush(); flush(); } fclose($handle); ``` 这段代码会在浏览器中以二进制流的形式下载文件,并显示下载进度条。 ### 回答2: 下面是一个使用PHP显示下载进度条的示例代码: ```php <?php $fileUrl = "http://example.com/file.zip"; // 下载文件的URL $saveTo = "path/to/save/file.zip"; // 下载文件保存的路径 // 启动输出缓冲区 ob_start(); // 初始化cURL会话 $ch = curl_init($fileUrl); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); // 发送请求并获取文件大小 curl_setopt($ch, CURLOPT_HEADER, true); curl_setopt($ch, CURLOPT_NOBODY, true); curl_exec($ch); $fileSize = curl_getinfo($ch, CURLINFO_CONTENT_LENGTH_DOWNLOAD); // 关闭头部请求 curl_setopt($ch, CURLOPT_HEADER, false); curl_setopt($ch, CURLOPT_NOBODY, false); // 开始下载文件 $fp = fopen($saveTo, "w"); curl_setopt($ch, CURLOPT_FILE, $fp); curl_exec($ch); // 关闭cURL会话和文件句柄 curl_close($ch); fclose($fp); // 清空输出缓冲区 ob_end_flush(); echo "文件下载完成!"; ?> ``` 该代码使用cURL库来下载文件。首先,通过设置`CURLOPT_HEADER`和`CURLOPT_NOBODY`选项,我们发送一个头部请求来获取文件的大小。接着,我们关闭头部请求并设置`CURLOPT_FILE`选项来将文件内容保存到指定的文件路径中。 要显示下载进度条,我们可以在启用输出缓冲区后,追踪cURL的下载进度并输出进度条到浏览器。在这个示例中,我们只是简单地在下载完成后输出一个完成的消息。 请注意,这只是一个基本示例,您可以根据自己的需求进行修改和定制。另外,为了更好的用户体验,您可能还需要添加错误处理、进度百分比计算等功能。 ### 回答3: PHP显示下载进度条的代码如下所示: ```php <?php $file_url = 'http://example.com/file_to_download.zip'; // 下载文件的URL $file_name = 'file_to_download.zip'; // 下载文件保存的文件名 header('Content-Description: File Transfer'); header('Content-Type: application/octet-stream'); header('Content-Disposition: attachment; filename="' . $file_name . '"'); header('Content-Transfer-Encoding: binary'); header('Expires: 0'); header('Cache-Control: must-revalidate'); header('Pragma: public'); header('Content-Length: ' . filesize($file_url)); // 读取并发送文件内容 $handle = fopen($file_url, 'rb'); $buffer_size = 8192; // 每次读取的字节数 $bytes_sent = 0; while (!feof($handle) && !connection_aborted()) { $buffer = fread($handle, $buffer_size); echo $buffer; flush(); $bytes_sent += strlen($buffer); // 计算并显示下载进度条 $progress = round(($bytes_sent / filesize($file_url)) * 100); echo '<script>document.getElementById("progress").innerHTML = "' . $progress . '%";</script>'; // 这里的"progress"是用来显示进度条的HTML元素的ID,可以根据实际情况进行修改 } fclose($handle); exit(); ?> ``` 以上代码通过设置相关的HTTP头字段来实现下载文件,并使用`fread()`函数逐块读取文件内容并发送给浏览器。在每次发送数据块后,通过JavaScript代码动态更新进度显示。请根据实际情况修改`$file_url`和`$file_name`变量的值,并将适当的HTML进度条元素ID替换为你自己的进度条元素ID。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值