>  기사  >  백엔드 개발  >  Curl 다운로드 파일은 실시간 진행률 표시줄을 표시합니다(코드 포함).

Curl 다운로드 파일은 실시간 진행률 표시줄을 표시합니다(코드 포함).

php中世界最好的语言
php中世界最好的语言원래의
2018-05-17 13:51:125935검색

이번에는 Curl 다운로드 파일의 실시간 진행률 표시줄(코드 포함)을 가져오겠습니다. Curl 다운로드 파일의 실시간 진행률 표시줄을 표시하는 주의 사항은 무엇입니까? .

머리말

최근에 저는 명령줄에서 프로그래밍을 하고 있습니다. 파일을 다운로드하는 것은 항상 힘든 과정입니다. 진행률 표시줄이 있으면 훨씬 좋을 것 같습니다. ! !

먼저 진행률 표시줄 확장팩을 구하는 것이 좋습니다https://github.com/dariuszp/cli-progress-bar (로컬 다운로드)

렌더링:

그래도 너무 예뻐요!

curl의 용도는 무엇인가요?

php를 사용하면 주로 데이터를 캡처합니다. 물론 fsockopen, file_get_contents 등과 같은 다른 캡처 방법을 사용할 수도 있습니다. 하지만 직접 접근할 수 있는 페이지만 캡처할 수 있습니다. 접근 제어가 있는 페이지나 로그인 후 페이지를 캡처하려는 경우에는 더 어렵습니다.

curl은

curl을 사용하는 간단한 방법입니다.

// 初始化一个 curl
$ch = curl_init();
// 设置请求的 url
curl_setopt($ch, CURLOPT_URL, $url);
// 
curl_setopt($ch, CURLOPT_HEADER, 0);
// 不直接输出,而是通过 curl_exec 返回
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
if (false === ($stream = curl_exec($ch))) {
 throw new \Exception(curl_errno($ch));
}
curl_close($ch);
return $stream;
위는 파일이 큰 경우 매우 간단한 예입니다. 오랫동안 기다리려면 이때 진행률 표시줄의 효과를 추가해야 합니다.

class Request
{
 protected $bar;
 // 是否下载完成
 protected $downloaded = false;
 public function construct()
 {
 // 初始化一个进度条
 $this->bar = new CliProgressBar(100);
 $this->bar->display();
 $this->bar->setColorToRed();
 }
 
 function download($url)
 {
 $ch = curl_init();
 // 从配置文件中获取根路径
 curl_setopt($ch, CURLOPT_URL, $url);
 curl_setopt($ch, CURLOPT_RETURNTRANSFER, 0);
 // 开启进度条
 curl_setopt($ch, CURLOPT_NOPROGRESS, 0);
 // 进度条的触发函数
 curl_setopt($ch, CURLOPT_PROGRESSFUNCTION, 'progress');
 // ps: 如果目标网页跳转,也跟着跳转
 // curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
 if (false === ($stream = curl_exec($ch))) {
  throw new \Exception(curl_errno($ch));
 }
 curl_close($ch);
 return $stream;
 }
 
 /**
 * 进度条下载.
 *
 * @param $ch
 * @param $countDownloadSize 总下载量
 * @param $currentDownloadSize 当前下载量
 * @param $countUploadSize 
 * @param $currentUploadSize
 */
 public function progress($ch, $countDownloadSize, $currentDownloadSize, $countUploadSize, $currentUploadSize)
 {
  // 等于 0 的时候,应该是预读资源不等于0的时候即开始下载
  // 这里的每一个判断都是坑,多试试就知道了
 if (0 === $countDownloadSize) {
  return false;
 }
 // 有时候会下载两次,第一次很小,应该是重定向下载
 if ($countDownloadSize > $currentDownloadSize) {
  $this->downloaded = false;
  // 继续显示进度条
 }
 // 已经下载完成还会再发三次请求
 elseif ($this->downloaded) {
  return false;
 }
 // 两边相等下载完成并不一定结束,
 elseif ($currentDownloadSize === $countDownloadSize) {
  return false;
 }
 
 // 开始计算
 $bar = $currentDownloadSize / $countDownloadSize * 100;
 $this->bar->progress($bar);
 }
}
(new Request)->download('http://www.shiguopeng.cn/database.sql');
다운로드 콜백 판단 시 주의할 점! ! !

또 다른 문제가 있습니다. 다운로드로 점프하고 그에 따라 점프하도록 컬을 설정하면 반환된 파일에 문제가 발생합니다.

zip 파일을 다운로드하면 파일 헤더에 이 요청의 첫 번째 HTTP 응답이 발생하게 됩니다. 헤더의 내용은

귀하의 필요에 따라 다릅니다

curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);

이 기사의 사례를 읽으신 후 방법을 마스터하셨다고 믿습니다. 더 흥미로운 내용을 보려면 PHP 중국어 웹사이트의 다른 관련 기사에 주목하세요!

추천 자료:

PHP

CMSPRESS로 XML 데이터를 동적으로 추가하여 무제한 분류(코드 포함)를 달성하는 단계에 대한 자세한 설명

위 내용은 Curl 다운로드 파일은 실시간 진행률 표시줄을 표시합니다(코드 포함).의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.