이번에는 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);
CMSPRESS로 XML 데이터를 동적으로 추가하여 무제한 분류(코드 포함)를 달성하는 단계에 대한 자세한 설명
위 내용은 Curl 다운로드 파일은 실시간 진행률 표시줄을 표시합니다(코드 포함).의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!