php 獲取ftp伺服器目錄及目錄下的所有檔案
阿新 • • 發佈:2019-01-05
其實這個和迴圈遍歷資料夾下的所有檔案類似 但是一些函式不能在這裡用 只能用ftp的函式
下面是程式碼
這個一個ftp類 裡面已經封住好方法 大家呼叫就好 <?php /** * 仿寫CodeIgniter的FTP類 * FTP基本操作: * 1) 登陸; connect * 2) 當前目錄檔案列表; filelist * 3) 目錄改變; chgdir * * @author quanshuidingdang */ class Ftp { private $hostname = ''; private $username = ''; private $password = ''; private $port = 21; private $passive = TRUE; private $debug = TRUE; private $conn_id = FALSE; /** * 建構函式 * * @param array 配置陣列 : $config = array('hostname'=>'','username'=>'','password'=>'','port'=>''...); */ public function __construct($config = array()) { if(count($config) > 0) { $this->_init($config); } } /** * FTP連線 * * @access public * @param array 配置陣列 * @return boolean */ public function connect($config = array()) { if(count($config) > 0) { $this->_init($config); } if(FALSE === ($this->conn_id = @ftp_connect($this->hostname,$this->port))) { if($this->debug === TRUE) { $this->_error("ftp_unable_to_connect"); } return FALSE; } if( ! $this->_login()) { if($this->debug === TRUE) { $this->_error("ftp_unable_to_login"); } return FALSE; } if($this->passive === TRUE) { ftp_pasv($this->conn_id, TRUE); } return TRUE; } /** * 獲取目錄檔案列表 * * @access public * @param string 目錄標識(ftp) * @return array */ public function filelist($path) { if( ! $this->_isconn()) { return FALSE; } return @ftp_nlist($this->conn_id, $path); } //遞迴查詢所有目錄下的檔案 public function dir_switch($path = null){ // //路徑 $path = empty($path)?'.':$path; //檢視目錄檔案 $catalog = $this->filelist($path); // return $catalog; $list = array(); $info = array(); if($catalog){ //遞迴查 foreach ($catalog as $val){ //判斷是否是為目錄 if($this->isFtpDir($val)){ $info = $this->dir_switch($val); if($info){ foreach ($info as $v){ $list[] = $v; } } }else{ $list[] = $val; } // sleep(1); } return $list; } } /** * 目錄改變 * * @access public * @param string 目錄標識(ftp) * @param boolean * @return boolean */ public function chgdir($path = '', $supress_debug = FALSE) { if ($path == '' OR !$this->_isconn()) { return FALSE; } $result = @ftp_chdir($this->conn_id, $path); if ($result === FALSE) { if ($this->debug === TRUE AND $supress_debug == FALSE) { $this->_error("ftp_unable_to_chgdir:dir[" . $path . "]"); } return FALSE; } return @ftp_pwd($this->conn_id); // return TRUE; } //檢視檔案是否存在 function isFtpDir($filename) { if(ftp_size($this->conn_id,$filename)!=-1) { return false; } else { return true; } } /** * 關閉FTP * * @access public * @return boolean */ public function close() { if( ! $this->_isconn()) { return FALSE; } return @ftp_close($this->conn_id); } /** * FTP成員變數初始化 * * @access private * @param array 配置陣列 * @return void */ private function _init($config = array()) { foreach($config as $key => $val) { if(isset($this->$key)) { $this->$key = $val; } } //特殊字元過濾 $this->hostname = preg_replace('|.+?://|','',$this->hostname); } /** * FTP登陸 * * @access private * @return boolean */ private function _login() { return @ftp_login($this->conn_id, $this->username, $this->password); } /** * 判斷con_id * * @access private * @return boolean */ private function _isconn() { if( ! is_resource($this->conn_id)) { if($this->debug === TRUE) { $this->_error("ftp_no_connection"); } return FALSE; } return TRUE; } /** * 從檔名中獲取字尾擴充套件 * * @access private * @param string 目錄標識 * @return string */ private function _getext($filename) { if(FALSE === strpos($filename, '.')) { return 'txt'; } $extarr = explode('.', $filename); return end($extarr); } /** * 從字尾擴充套件定義FTP傳輸模式 ascii 或 binary * * @access private * @param string 字尾擴充套件 * @return string */ private function _settype($ext) { $text_type = array ( 'txt', 'text', 'php', 'phps', 'php4', 'js', 'css', 'htm', 'html', 'phtml', 'shtml', 'log', 'xml' ); return (in_array($ext, $text_type)) ? 'ascii' : 'binary'; } /** * 錯誤日誌記錄 * * @access prvate * @return boolean */ private function _error($msg) { return @file_put_contents('ftp_err.log', "date[".date("Y-m-d H:i:s")."]-hostname[".$this->hostname."]-username[".$this->username."]-password[".$this->password."]-msg[".$msg."]\n", FILE_APPEND); } }
這是呼叫類的程式碼
建議 如果 你要獲取的檔案數量特別多 不建議這樣做 本人親測 12G的檔案 獲取全部的檔案 會超時 提示500
獲取一部分的還好
如果 和我遇到的需求一樣 是要把ftp檔案獲取到 傳到別的地方的話 比如oss 這邊 我給大家推薦一個方法
針對伺服器進行掛載 需要有一定的運維能力