【发布时间】:2015-03-30 05:36:44
【问题描述】:
我不知道如何在每次使用 php 更新时将进度推送出去。为了清楚起见,我将写一个例子。
jQuery:
function uploadMovieDownload(link){
$.post("php/downloadmovie.php", { source:link }, function(json){ console.log(json); });
}
uploadMovieDownload(url);
PHP (php/downloadmovie.php):
session_start();
ob_start();
date_default_timezone_set("Europe/Bucharest");
ini_set('display_errors',true);
require_once(dirname(__FILE__)."/functions.php");
$url = $_POST['source'];
$headers = getHeaders($url);
$url = $headers['url'];
$path = dirname(__FILE__)."/temp/test.mp4";
$fp = fopen ($path, 'w+');
$ch = curl_init();
curl_setopt( $ch, CURLOPT_URL, $url );
curl_setopt( $ch, CURLOPT_RETURNTRANSFER, false );
curl_setopt( $ch, CURLOPT_PROGRESSFUNCTION, 'progress' );
curl_setopt( $ch, CURLOPT_NOPROGRESS, false );
curl_setopt( $ch, CURLOPT_BINARYTRANSFER, true );
curl_setopt( $ch, CURLOPT_SSL_VERIFYPEER, false );
curl_setopt( $ch, CURLOPT_CONNECTTIMEOUT, 100 );
curl_setopt( $ch, CURLOPT_FILE, $fp );
curl_exec( $ch );
curl_close( $ch );
fclose( $fp );
function progress($resource,$download_size, $downloaded, $upload_size, $uploaded){
if($download_size > 0) echo $downloaded / $download_size * 100;
ob_flush();
flush();
}
echo "Done";
ob_flush();
flush();
我遇到的问题是它在完成后返回进度,下载时没有推送它。如果您有任何建议,请提前感谢。
【问题讨论】:
-
您好,您有这个问题的解决方案吗....
-
一些想法: 1. 负载均衡器可能会无意中保存渐进式响应。 2. 您需要立即发送一定的字节数以使某些浏览器正常运行。 3. 您需要返回 HTML,并将数据有条不紊地包装在
<script>标记中,以使用像这样的简单 COMET 方法。 4. 我会考虑重新实现使用临时文件来存储百分比,并 ping 另一个简单的脚本以从文件中获取该值,绕过上面的脚本。 5. “SSE”,又名EventSource是跨浏览器,易于在 PHP 中实现,以替换 #4 中的 ping...
标签: javascript php jquery curl