我不知道如何使用php每次更新时推送进度。为了清晰起见,我将写一个例子。
jQuery:
PHP (php/downloadmovie.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();
我遇到的问题是它在下载完成后才返回进度,而不是在下载时推送进度。如果您有任何建议,提前感谢您。
<script>
标签中,以使用类似于此的简单COMET方法。4. 我会考虑重新实现,使用临时文件存储百分比并ping另一个简单的脚本从文件中获取该值,绕过上述脚本。5. "SSE",也称为EventSource
,是跨浏览器的,并且易于在PHP中实现,以替换#4中的ping操作... - dandavis