批次下載檔案一般使用循環的方式,逐一執行下載。但在頻寬與伺服器效能允許的情況下,使用多進程進行下載可以大大提高下載的效率。本文介紹php利用curl的多進程請求方法,實作多進程同時下載檔案。
原則:
使用curl的批次方法,開啟多進程,實現批次下載檔。
主要方法:
curl_multi_init
傳回一個新cURL批次句柄
#curl_multi_add_handle
向curl批次會話中新增單獨的curl句柄
curl_multi_exec
執行目前cURL 句柄的子連接
curl_multi_getcontent
如果設定了CURLOPT_RETURNTRANSFER,則傳回所取得的輸出的文字流
## curl_multi_remove_handle 移除curl批次句柄資源中的某個句柄資源
curl_multi_close 關閉一組cURL句柄
完整程式碼如下:
BatchDownLoad.class.php
<?php/** * 多进程批量下载文件(使用php curl_multi_exec实现) * Date: 2017-07-16 * Author: fdipzone * Version: 1.0 * * Func * public download 下载处理 * public process 多进程下载 * private to_log 将执行结果写入日志文件 */class BatchDownLoad { // 下载文件设置 private $download_config = array(); // 最大开启进程数量 private $max_process_num = 10; // 超时秒数 private $timeout = 10; // 日志文件 private $logfile = null; /** * 初始化 * @param Array $download_config 下载的文件设置 * @param Int $max_process_num 最大开启的进程数量 * @param Int $timeout 超时秒数 * @param String $logfile 日志文件路径 */ public function __construct($download_config, $max_process_num=10, $timeout=10, $logfile=''){ $this->download_config = $download_config; $this->max_process_num = $max_process_num; $this->timeout = $timeout; // 日志文件 if($logfile){ $this->logfile = $logfile; }else{ $this->logfile = dirname(__FILE__).'/batch_download_'.date('Ymd').'.log'; } } /** * 执行下载 * @result Int */ public function download(){ // 已处理的数量 $handle_num = 0; // 未处理完成 while(count($this->download_config)>0){ // 需要处理的大于最大进程数 if(count($this->download_config)>$this->max_process_num){ $process_num = $this->max_process_num; // 需要处理的小于最大进程数 }else{ $process_num = count($this->download_config); } // 抽取指定数量进行下载 $tmp_download_config = array_splice($this->download_config, 0, $process_num); // 执行下载 $result = $this->process($tmp_download_config); // 写入日志 $this->to_log($tmp_download_config, $result); // 记录已处理的数量 $handle_num += count($result); } return $handle_num; } /** * 多进程下载文件 * @param Array $download_config 本次下载的设置 * @return Array */ public function process($download_config){ // 文件资源 $fp = array(); // curl会话 $ch = array(); // 执行结果 $result = array(); // 创建curl handle $mh = curl_multi_init(); // 循环设定数量 foreach($download_config as $k=>$config){ $ch[$k] = curl_init(); $fp[$k] = fopen($config[1], 'a'); curl_setopt($ch[$k], CURLOPT_URL, $config[0]); curl_setopt($ch[$k], CURLOPT_FILE, $fp[$k]); curl_setopt($ch[$k], CURLOPT_HEADER, 0); curl_setopt($ch[$k], CURLOPT_RETURNTRANSFER, true); curl_setopt($ch[$k], CURLOPT_USERAGENT, 'Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.0)'); // 加入处理 curl_multi_add_handle($mh, $ch[$k]); } $active = null; do{ $mrc = curl_multi_exec($mh, $active); } while($active); // 获取数据 foreach($fp as $k=>$v){ fwrite($v, curl_multi_getcontent($ch[$k])); } // 关闭curl handle与文件资源 foreach($download_config as $k=>$config){ curl_multi_remove_handle($mh, $ch[$k]); fclose($fp[$k]); // 检查是否下载成功 if(file_exists($config[1])){ $result[$k] = true; }else{ $result[$k] = false; } } curl_multi_close($mh); return $result; } /** * 写入日志 * @param Array $data 下载文件数据 * @param Array $flag 下载文件状态数据 */ private function to_log($data, $flag){ // 临时日志数据 $tmp_log = ''; foreach($data as $k=>$v){ $tmp_log .= '['.date('Y-m-d H:i:s').'] url:'.$v[0].' file:'.$v[1].' status:'.$flag[$k].PHP_EOL; } // 创建日志目录 if(!is_dir(dirname($this->logfile))){ mkdir(dirname($this->logfile), 0777, true); } // 写入日志文件 file_put_contents($this->logfile, $tmp_log, FILE_APPEND); } }?>
<?phprequire 'BatchDownLoad.class.php';$base_path = dirname(__FILE__).'/photo';$download_config = array( array('http://www.example.com/p1.jpg', $base_path.'/p1.jpg'), array('http://www.example.com/p2.jpg', $base_path.'/p2.jpg'), array('http://www.example.com/p3.jpg', $base_path.'/p3.jpg'), array('http://www.example.com/p4.jpg', $base_path.'/p4.jpg'), array('http://www.example.com/p5.jpg', $base_path.'/p5.jpg'), );$obj = new BatchDownLoad($download_config, 2, 10);$handle_num = $obj->download();echo 'download num:'.$handle_num.PHP_EOL;?>執行後日誌輸出
[2017-07-16 18:04:21] url:http://www.example.com/p1.jpg file:/home/fdipzone/photo/p1.jpg status:1[2017-07-16 18:04:21] url:http://www.example.com/p2.jpg file:/home/fdipzone/photo/p2.jpg status:1[2017-07-16 18:04:21] url:http://www.example.com/p3.jpg file:/home/fdipzone/photo/p3.jpg status:1[2017-07-16 18:04:21] url:http://www.example.com/p4.jpg file:/home/fdipzone/photo/p4.jpg status:1[2017-07-16 18:04:21] url:http://www.example.com/p5.jpg file:/home/fdipzone/photo/p5.jpg status:1本篇文章講解了批量下載檔案的一些方式,更多相關內容請關注php中文網。
###相關推薦:#########如何透過php判斷本機及遠端檔案是否存在###############關於mysql表資料行列轉換方法的講解#########關於php 日誌類別的講解######
以上是如何利用phpcurl實現多進程下載檔案類的詳細內容。更多資訊請關注PHP中文網其他相關文章!

PHPSession失效的原因包括配置錯誤、Cookie問題和Session過期。 1.配置錯誤:檢查並設置正確的session.save_path。 2.Cookie問題:確保Cookie設置正確。 3.Session過期:調整session.gc_maxlifetime值以延長會話時間。

在PHP中調試會話問題的方法包括:1.檢查會話是否正確啟動;2.驗證會話ID的傳遞;3.檢查會話數據的存儲和讀取;4.查看服務器配置。通過輸出會話ID和數據、查看會話文件內容等方法,可以有效診斷和解決會話相關的問題。

多次調用session_start()會導致警告信息和可能的數據覆蓋。 1)PHP會發出警告,提示session已啟動。 2)可能導致session數據意外覆蓋。 3)使用session_status()檢查session狀態,避免重複調用。

在PHP中配置會話生命週期可以通過設置session.gc_maxlifetime和session.cookie_lifetime來實現。 1)session.gc_maxlifetime控制服務器端會話數據的存活時間,2)session.cookie_lifetime控制客戶端cookie的生命週期,設置為0時cookie在瀏覽器關閉時過期。

使用數據庫存儲會話的主要優勢包括持久性、可擴展性和安全性。 1.持久性:即使服務器重啟,會話數據也能保持不變。 2.可擴展性:適用於分佈式系統,確保會話數據在多服務器間同步。 3.安全性:數據庫提供加密存儲,保護敏感信息。

在PHP中實現自定義會話處理可以通過實現SessionHandlerInterface接口來完成。具體步驟包括:1)創建實現SessionHandlerInterface的類,如CustomSessionHandler;2)重寫接口中的方法(如open,close,read,write,destroy,gc)來定義會話數據的生命週期和存儲方式;3)在PHP腳本中註冊自定義會話處理器並啟動會話。這樣可以將數據存儲在MySQL、Redis等介質中,提升性能、安全性和可擴展性。

SessionID是網絡應用程序中用來跟踪用戶會話狀態的機制。 1.它是一個隨機生成的字符串,用於在用戶與服務器之間的多次交互中保持用戶的身份信息。 2.服務器生成並通過cookie或URL參數發送給客戶端,幫助在用戶的多次請求中識別和關聯這些請求。 3.生成通常使用隨機算法保證唯一性和不可預測性。 4.在實際開發中,可以使用內存數據庫如Redis來存儲session數據,提升性能和安全性。

在無狀態環境如API中管理會話可以通過使用JWT或cookies來實現。 1.JWT適合無狀態和可擴展性,但大數據時體積大。 2.Cookies更傳統且易實現,但需謹慎配置以確保安全性。


熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

Video Face Swap
使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

熱工具

mPDF
mPDF是一個PHP庫,可以從UTF-8編碼的HTML產生PDF檔案。原作者Ian Back編寫mPDF以從他的網站上「即時」輸出PDF文件,並處理不同的語言。與原始腳本如HTML2FPDF相比,它的速度較慢,並且在使用Unicode字體時產生的檔案較大,但支援CSS樣式等,並進行了大量增強。支援幾乎所有語言,包括RTL(阿拉伯語和希伯來語)和CJK(中日韓)。支援嵌套的區塊級元素(如P、DIV),

VSCode Windows 64位元 下載
微軟推出的免費、功能強大的一款IDE編輯器

SublimeText3漢化版
中文版,非常好用

禪工作室 13.0.1
強大的PHP整合開發環境

ZendStudio 13.5.1 Mac
強大的PHP整合開發環境