Dieses Mal bringe ich Ihnen eine Echtzeit-Fortschrittsbalkenanzeige für Curl-Downloaddateien (mit Code). Was sind die Vorsichtsmaßnahmen für die Anzeige eines Echtzeitfortschrittsbalkens für Curl-Downloaddateien? Ein praktischer Fall, werfen wir einen Blick darauf.
Vorwort
Das Herunterladen von Dateien ist immer ein mühsamer Prozess Besser wäre es, wenn es einen Fortschrittsbalken gäbe. ! !
Zunächst ist es gut, sich ein Erweiterungspaket für den Fortschrittsbalken zu besorgen https://github.com/dariuszp/cli-progress-bar (lokaler Download)
Rendering:
Es sieht immer noch ziemlich gut aus!
Was nützt Curl?
Verwenden Sie PHP, Curl erfasst hauptsächlich Daten. Natürlich können wir auch andere Methoden verwenden, um sie abzurufen. Zum Beispiel fsockopen, file_get_contents usw. Es können jedoch nur die Seiten erfasst werden, auf die direkt zugegriffen werden kann, oder Seiten, die nach der Anmeldung erfasst werden sollen.
curl verwendet curl als eine sehr häufige Download-Methode für PHP, hier ist eine einfache Möglichkeit, es zu verwenden
// 初始化一个 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;
Das Obige ist ein sehr einfaches Beispiel. Wenn eine Datei groß ist, muss der Benutzer zu diesem Zeitpunkt den Effekt des Fortschrittsbalkens hinzufügen:
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');
Seien Sie sicher Achten Sie auf den Download-Rückruf. Es gibt eine Falle im Urteil! ! !
Es gibt ein weiteres Problem: Wenn Sie zum Herunterladen springen und Curl auf „Sprung“ einstellen, weist die zurückgegebene Datei Probleme auf.
Ich habe eine ZIP-Datei heruntergeladen, was dazu führt, dass der Dateiheader angezeigt wird der Inhalt des HTTP-Antwortheaders der ersten Anfrage,
, also kommt es darauf an, was Sie brauchen
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
Ich glaube, Sie haben die Methode gemeistert, nachdem Sie den Fall in diesem Artikel gelesen haben. Weitere spannende Inhalte finden Sie auf der chinesischen PHP-Website. Weitere verwandte Artikel!
Empfohlene Lektüre:
Detaillierte Erläuterung der Schritte zum dynamischen Hinzufügen von XML-Daten mit PHPCMSPRESS implementiert unbegrenzte Klassifizierung (mit Code)Das obige ist der detaillierte Inhalt vonCurl-Download-Datei zeigt Echtzeit-Fortschrittsbalken an (mit Code). Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!