PHP FTP クラスの詳細な説明
http://www.jb51.net/article/38408.htm
FTP は 2 つのモードをサポートしており、1 つは標準と呼ばれます。はアクティブ、アクティブ モード)、もう 1 つはパッシブ(つまり、PASV、パッシブ モード)です。標準モードの FTP クライアントは、FTP サーバーに PORT コマンドを送信します。パッシブ モードの FTP クライアントは PASV コマンドを FTP サーバーに送信します。以下に、これら 2 つの方法の動作原理を紹介します。
標準モード
FTP クライアントは、まず FTP サーバーの TCP 21 ポートとの接続を確立し、データを受信する必要があるときに、このチャネルを通じてコマンドを送信します。このチャネルのポート。 PORT コマンドには、クライアントがデータを受信するために使用するポートが含まれています。データを送信するとき、サーバーは独自の TCP 20 ポートを介してデータを送信します。 FTP サーバーは、データを転送するためにクライアントとの新しい接続を確立する必要があります。
パッシブ モード
制御チャネルを確立する場合、クライアントがこのチャネルを通じて PASV コマンドを送信すると、FTP サーバーは 1024 ~ 5000 のランダムなポートを開き、このポートでクライアントに通知します。データの送信要求が行われると、FTP サーバーはこのポートを介してデータを送信します。この時点で、FTP サーバーはクライアントとの新しい接続を確立する必要がありません。PHP を使用して FTP の使用を操作する
次のようにコードをコピーします:
// FTP サーバーに接続します
$conn = ftp_connect(ftp.server.com);
// ユーザー名とパスワードでログインします ftp_login($conn, “john”, “doe”);
// リモート システムのタイプを取得します ftp_systype($conn)// ファイルをリストします $filelist = ftp_nlist($) conn, “. ”);
// ファイルをダウンロード ftp_get($conn, “data.zip”, “data.zip”, FTP_BINARY); ftp_quit($conn); FTP を初期化する 接続するために、PHP にはホスト名とポートをパラメータとして使用する ftp_connect() 関数が用意されています。上記の例では、ホスト名は「ftp.server.com」ですが、ポートが指定されていない場合、PHP は接続を確立するためにデフォルトのポートとして「21」を使用します。
//接続が成功すると、ftp_connect() はハンドル ハンドルを返します。このハンドルは、後で使用される FTP 関数によって使用されます。 $conn = ftp_connect(ftp.server.com);
//接続が確立されたら、ftp_login() を使用してユーザー名とユーザー パスワードを送信します。関数 ftp_login() は、ftp_connect() 関数で渡されたハンドルを使用して、ユーザー名とパスワードを正しいサーバーに送信できるかどうかを判断していることがわかります。 ftp_login($conn, “john”, “doe”);
// close connectionftp_quit($conn);
// FTP サーバーにログインすると、システムやファイルに関する情報を取得できます。およびディレクトリ情報。 ftp_pwd()
//現在のディレクトリを取得 $here = ftp_pwd($conn);
//サーバー側のシステム情報を取得 ftp_systype()$server_os = ftp_systype($conn);
//パッシブモード( PASV ) PASV をオンまたはオフにするスイッチ (1 はオンを意味します) ftp_pasv($conn, 1);
//パラメータとしてディレクトリ名を受け入れる ftp_chdir() 関数を使用してディレクトリを入力します。 ftp_chdir($conn, “public_html”);
//現在のディレクトリの親ディレクトリに戻り、ftp_cdup() を使用して ftp_cdup($conn) を実装します。これには、ディレクトリを作成または移動する必要があります。 ftp_mkdir() および ftp_rmdir () 関数 注: ftp_mkdir() が正常に作成されると、新しく作成されたディレクトリ名が返されます。 ftp_mkdir($conn, “test”);
ftp_rmdir($conn, “test”);
//ファイルをアップロードする場合、ftp_put() 関数は、アップロード後にローカル ファイル名を指定する必要があります。ファイル名と転送の種類。例: ファイル「abc.txt」をアップロードし、アップロード後に「xyz.txt」という名前を付ける場合、コマンドは次のようになります: ftp_put($conn, "xyz.txt", "abc.txt", FTP_ASCII);
//ファイルのダウンロード: PHP によって提供される関数は ftp_get() ですが、これにはサーバー上のファイル名、ダウンロード後のファイル名、および送信タイプもパラメーターとして必要です。ファイルは his.zip です。ローカル マシンにダウンロードし、hers.zip という名前を付けます。コマンドは次のとおりです。 ftp_get($conn, “hers.zip”, “his.zip”, FTP_BINARY); PHP には 2 つの方法が用意されています。1 つはファイル名とディレクトリを単純にリスト表示する方法、もう 1 つはファイルのサイズ、権限、作成時間などの詳細な情報をリスト表示する方法です。
//最初の関数は ftp_nlist() 関数を使用し、2 番目の関数は ftp_rawlist() を使用します。どちらの関数もパラメーターとしてディレクトリ名を必要とし、配列の各要素は同等です。行のリストに。 $filelist = ftp_nlist($conn, “.”);
//関数 ftp_size()。単位として BITES を使用して、指定したファイルのサイズを返します。 "-1" が返された場合は、これがディレクトリ $filelist = ftp_size($conn, "data.zip"); であることを意味します。コードは次のとおりです:
/**
* CodeIgniter の FTP クラスを模倣します
* 基本的な FTP 操作:
* 1) ログインします
* 2) 現在のディレクトリファイルリスト
* 3) ディレクトリの変更
* 4)名前変更
* 5) フォルダーを作成します
* 6) 削除; アップロード
* 8) ダウンロードダウンロード
*
**/
class Ftp {
private $hostname = ”;
private $username = ”;
private $password = ”;
private $port = 21;
private $パッシブ = 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->ホスト名,$this->ポート))) {
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)
* @param boolean
* @return boolean
*/
public function chgdir($path = ”, $supress_debug = FALSE) {
if($path == ”または ! $this->_isconn()) {
return FALSE;
}
$result = @ftp_chdir($this->conn_id, $path);
if($result === FALSE) {
if($this->debug === TRUE かつ $supress_debug == FALSE) {
$this->_error(“ftp_unable_to_chgdir:dir[“.$path.”]”);
}
return FALSE;
}
return TRUE;}
/**
* ディレクトリ生成
*
* @access public
* @param 文字列ディレクトリ識別 (ftp)
* @param int ファイル許可リスト
* @return boolean
*/
public function mkdir($path = ”, $permissions = NULL) {
if($path = = ” または $this->_isconn()) {
return FALSE;
}
$result = @ftp_mkdir($this->conn_id, $path);
if($result = == FALSE) {
if($this->debug === TRUE) {
$this->_error(“ftp_unable_to_mkdir:dir[“.$path.”]”);
}
return FALSE;
}
if( ! is_null($permissions)) {
$this->chmod($path,(int)$permissions);
}
return TRUE;}
/**
* Upload
*
* @access public
* @param string ローカルディレクトリ識別
* @param string リモートディレクトリ識別 (ftp)
* @param string アップロードモード auto || ascii
* @ param int アップロード後のファイル許可リスト
* @return boolean
*/
public function Upload($localpath, $remotepath, $mode = 'auto', $permissions = NULL) {
if( ! $this->_isconn()) {
return FALSE;
}
if( ! file_exists($localpath)) {
if($this->debug === TRUE) {
$this->_error(“ftp_no_source_file:”.$localpath);
}
return FALSE;
}
if($mode == 'auto') {
$ext = $this ->_getext($localpath);
$mode = $this->_settype($ext);
}
$mode = ($mode == 'ascii') ? FTP_ASCII : FTP_BINARY;
$result = @ftp_put($this->conn_id, $remotepath, $localpath, $mode);
if($result === FALSE) {
if($this-> ;debug === TRUE) {
$this->_error(“ftp_unable_to_upload:localpath[“.$localpath.”]/remotepath[“.$remotepath.”]”);
}
return FALSE;
}
if( ! is_null($permissions)) {
$this->chmod($remotepath,(int)$permissions);
}
return TRUE;}
/ **
* ダウンロード
*
* @access public
* @param string リモート ディレクトリ識別 (ftp)
* @param string ローカル ディレクトリ識別
* @param string ダウンロード モード auto || ascii
* @ブール値を返す
*/
public function download($remotepath, $localpath, $mode = 'auto') {
if( ! $this->_isconn()) {
return FALSE;
}
if($mode == 'auto') {
$ext = $this->_getext($remotepath);
$mode = $this->_settype($ext);
}
$mode = ($mode == 'ascii') ? FTP_ASCII : FTP_BINARY;
$result = @ftp_get($this->conn_id, $localpath, $remotepath, $mode);
if($result === FALSE) {
if($this-> ;debug === TRUE) {
$this->_error(“ftp_unable_to_download:localpath[“.$localpath.”]-remotepath[“.$remotepath.”]”);
}
return FALSE;
}
return TRUE;}
/**
* 名前変更/移動
*
* @access public
* @param string リモートディレクトリ識別 (ftp)
* @param string 新しいディレクトリ識別
* @param boolean 名前を変更するかどうかを決定する (FALSE) または移動 (TRUE)
* @return boolean
*/
public function rename($oldname, $newname, $move = FALSE) {
if( ! $this->_isconn ()) {
return FALSE;
}
$result = @ftp_rename($this->conn_id, $oldname, $newname);
if($result === FALSE) {
if($this->debug === TRUE) {
$msg = ($move == FALSE) ? “ftp_unable_to_rename” : “ftp_unable_to_move”;
$this->_error($msg);
}
return FALSE;
}
return TRUE;}
/**
* ファイルを削除
*
* @access public
* @param 文字列ファイル識別子 (ftp)
* @return boolean
*/
public function delete_file($file) {
if( ! $this->_isconn()) {
return FALSE;
}
$result = @ftp_delete($this->conn_id, $ file);
if($result === FALSE) {
if($this->debug === TRUE) {
$this->_error(“ftp_unable_to_delete_file:file[“.$file .”]”);
}
return FALSE;
}
return TRUE;}
/**
* フォルダーを削除します
*
* @access public
* @param 文字列ディレクトリ識別子 (ftp)
* @return boolean
*/
public function delete_dir($path) {
if( ! $this->_isconn()) {
return FALSE;
}
//对目录宏的'/'字符追加反斜杠''$path = preg_replace("/(.+?)/ *$/”、”\1/”、$path);
//获取目录文件列表$filelist = $this->filelist($path);
if($filelist !== FALSE AND count($filelist) > 0) {
foreach($filelist as $item) {
//如果我们無法删除,那么就可能性是一文件夹
//所以我们递归调用delete_dir()
if( ! @delete_file($item)) {
$this->delete_dir($item);
}
}
}
//删除文件夹(空文件夹)$result = @ftp_rmdir($this->conn_id, $path);
if($result === FALSE) {
if($this->debug === TRUE) {
$this->_error(“ftp_unable_to_delete_dir:dir[“.$path.”]”);
}
return FALSE;
}
return TRUE;}
/**
* ファイル権限を変更します
*
* @access public
* @param 文字列ディレクトリ識別子 (ftp)
* @return boolean
*/
public function chmod($path, $perm) {
if( ! $this->_isconn()) {
return FALSE;
}
//ただ有るPHP5中才定义了修正权制限的関数数(ftp)
if( ! function_exists('ftp_chmod')) {
if($this->debug === TRUE) {
$this->_error(“ftp_unable_to_chmod(function) )”);
}
return FALSE;
}
$result = @ftp_chmod($this->conn_id, $perm, $path);
if($result === FALSE) {
if($this->debug === TRUE) {
$this->_error(“ftp_unable_to_chmod:path[“.$path.”]-chmod[“.$perm.”]”) ;
}
return FALSE;
}
return TRUE;
}
/**
* ディレクトリファイルリストの取得
*
* @access public
* @param 文字列ディレクトリ識別子(ftp)
* @return array
*/
public function filelist($path = '.') {
if( ! $this->_isconn()) {
return FALSE;
}
return ftp_nlist($this->conn_id, $path);}
/**
* FTP を閉じる
*
* @access public
* @return boolean
*/
パブリック関数 close() {
if( ! $this->_isconn()) {
return FALSE;
}
return @ftp_close($this->conn_id);}
/**
* FTPメンバー変数の初期化
*
* @access private
* @param配列設定array
* @return void
*/
プライベート関数 _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
*/
プライベート関数 _isconn() {
if( ! is_resource($this->conn_id)) {
if($this->debug = == TRUE) {
$this->_error(“ftp_no_connection”);
}
return FALSE;
}
return TRUE;
}
/**
* ファイル名からサフィックス拡張子を取得します
*
* @access private
* @param string directory identifier
* @return string
*/
プライベート関数 _getext($filename) {
if(FALSE === strpos($filename, '.')) {
return 'txt';
}
$extarr =explode('. ', $filename);
return end($extarr);
}
/**
* サフィックス拡張子 ascii またはバイナリから FTP 転送モードを定義します
*
* @access private
* @param string suffix extension
* @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’ : ‘バイナリ’;}
/**
* エラーログ
*
* @access prvate
* @return boolean
*/
プライベート関数 _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);
}
}
/*終わりfile ftp.php*/
/*Location /Apache Group/htdocs/ftp.php*/
DEMO
复制代码代码如下:
require_once('ftp.php' );
$config = array(
'ホスト名' => 'localhost',
'ユーザー名' => 'root',
'パスワード' => 'root',
'ポート' => 21
);
$ftp = 新しい Ftp();
$ftp->connect($config);
$ftp->upload('ftp_err.log','ftp_upload.log) ');
$ftp->download('ftp_upload.log','ftp_download.log');
/*ファイルの終わり ftp_demo.php*/
/*場所: /htdocs/ftp_demo.php* /