大まかな原理
プロジェクト内の除外されていないすべてのファイルを反復処理し、文件修改时间晚于文件上一次修改时间 のファイルを取得します
次に、これらのファイルを FTP 経由で対応するディレクトリにアップロードします。
具体的なコードは次のとおりです。
単なるツールなので、コードは非常に汚いです、ごめんなさい
- error_reporting(7);
- if ($_SERVER['SERVER_ADDR'])exit;//Webサーバー下での実行は禁止されています
- $_GET['exclude'] = array(' number.txt ','uploads','Zend','docs','cache','You','managesdk'); //グローバル変数として定義されたアップロード ディレクトリを除外します
- $fileobj = new FilerFile();
- $path = "/data/longtu/"; //プロジェクトディレクトリのルートディレクトリ
- $files = $fileobj->Zip($path); //最新の変更されたファイルを除外します
- $path = str_replace( "/data/longtu/ ","",$path);
- $config = array(
- 'hostname' => 'xxx.xxx.xx.xxx', //ftp サーバーアドレス
- 'username' => 'xxx', // FTP ユーザー
- 'パスワード' => '?xxxxxxxxxxx', // FTP パスワード
- 'ポート' => 21 // ポート
- );
- $ftp = new Ftp();
- $ftp ->connect($ config); //リンクサーバー
- //$a=$ftp->filelist();
- $LOCAL_ROOT = realpath(dirname(__DIR__)."/../../");
- chdir($LOCAL_ROOT) ;
- foreach ($files as $k=>$v){
- $f = $path.$v;
- $tmp = $ftp->upload($f, $f);
- if($tmp) {
- echo "upload $f ->success n";
- }
- }
- //$ftp->download('ftp_upload.log','ftp_download.log');
- //
- //$ftp->upload('ftp_err.log','ftp_upload.log');
- //$ftp->download('ftp_upload.log','ftp_download.log');
- /*
- *
- *
- * $ dir = "/test";
- if(@ftp_chdir($conn, $dir))
- フォルダーかどうかを判断します
- * ここに説明を入力します...
- * @author 管理者
- *
- * /
- class FilerFile
- {
- var $time_path;
- private $fctimes = array();
- function Zip($dir)
- {
- $this->time_path = rtrim($dir,"/")."/。 ~~~time.php" ;
- //@unlink($this->time_path);
- $filelist = $this ->GetFileList($dir);
- file_put_contents($this->time_path,"< ?php n return ".var_export ($this->fctimes,true).";");
- return $filelist;
- }
- function appendFiletime($file)
- {
- $time_file_path = $this->time_path;
- $ftime = @include( $time_file_path);
- $ftime = $ftime ? $ftime : array();
- $time = filectime($file);
- if(!file_exists($time_file_path))file_put_contents($time_file_path, " }
- function getFileByFiletime($file)
- {
- static $time_data ;
- $time_file_path = $this->time_path;
- if (!$time_data){
- $time_data= @include_once ($time_file_path);
- }
- $time_data = $time_data ? $time_data : array();
- //var_dump($file,$time_data[$file] == filectime($file));
- //echo $file ."t".$time_data [$file]."n";
- if ($time_data[$file] == filemtime($file)){
- return false;
- }else{
- return $file;
- }
- }
- function GetFileList($dir ,$path="")
- {
- static $tmpp = "";
- if ($path=="" && !$tmpp){
- $tmpp = $dir;
- }
- $ d = dir($dir) ;
- $files = array();
- if ($d)
- {
- $pathP=str_replace($tmpp,"",$dir);
- $pathP=str_replace(array("\ \","/") ,DIRECTORY_SEPARATOR,$pathP);
- $pathP=str_replace(DIRECTORY_SEPARATOR.DIRECTORY_SEPARATOR,DIRECTORY_SEPARATOR,$pathP);
- while($f = $d->read())
- {
- if ( $f == '.' || $f=='in_array($f, $_GET[' ']))続行;
- $newdir = rtrim($dir,"/")."/".$f;
- if (is_dir($newdir)){
- $files = array_merge($files,$this-> ;GetFileList($newdir,$ newdir));
- }else{
- $abspath_file = (rtrim($dir,"/") ? rtrim($dir,"/")."/" : "").$f ;
- $this->fctimes[$abspath_file] = filemtime($abspath_file);
- if (!$this->getFileByFiletime($abspath_file))Continue;
- $file = (rtrim($pathP,"/") ? rtrim($pathP," /")."/" : "").$f;
- $files[] = $file;
- }
- }
- }
- return $files;
- }
- }
- /**
- * CodeIgniter の FTP クラスを模倣します
- * 基本的な FTP 操作:
- * 1) ログイン; 接続
- * 2) 現在のディレクトリファイルリスト; filelist
- * 4) 名前変更/移動
- * 5 ) フォルダーの作成; mkdir
- * 6) 削除_dir/delete_file
- * 7) アップロード; アップロード
- * 8) ダウンロードダウンロード
- **/
- 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 配列設定配列
- * @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;
- }
- /**
- * フォルダーが存在するかどうか
- * @paramunknown_type $path
- */
- public function is_dir_exists($path)
- {
- return $this->gt;chgdir( $path);
- }
- /**
- * ディレクトリ変更
- *
- * @access public
- * @param 文字列ディレクトリ識別 (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 かつ $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 == '' OR ! $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;
- }
- /**
- * アップロード
- *
- * @access public
- * @param 文字列ローカルディレクトリ識別子
- * @param 文字列リモートディレクトリ識別子 (ftp)
- * @param 文字列アップロードモード auto || リストアップロード後の @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 文字列リモートディレクトリ識別 (ftp)
- * @param 文字列ローカルディレクトリ識別
- * @param 文字列ダウンロードモード auto || boolean
- */
- 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 = = 'アスキー') ? 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 = ($移動 == 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
- */
- public function close () {
- if( ! $this->_isconn()) {
- return FALSE;
- }
- return @ftp_close($this->conn_id);
- }
- /**
- * FTPメンバー変数の初期化
- *
- * @access private
- * @param配列設定配列
- * @return void
- */
- プライベート関数 _init($config = array()) {
- foreach($config as $key => $val) {
- if(isset($this->$key) ) {
- $this->$key = $val;
- }
- }
- //特殊文字过滤
- $this->hostname = preg_replace('|.+?://|','',$this ->ホスト名);
- }
- /**
- * FTP ログイン
- *
- * @access private
- * @return boolean
- */
- プライベート関数 _login() {
- return @ftp_login($this->conn_id, $this->ユーザー名, $this->パスワード) ;
- }
- /**
- * 裁判官con_id
- *
- * @access private
- * @return boolean
- */
- プライベート関数 _isconn() {
- if( ! is_resource($this->gt;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 またはバイナリを定義します
- *
- * @access private
- * @param 文字列サフィックス拡張子
- * @return string
- */
- プライベート関数_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('/tmp/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);
- }
- }
- /*ファイルの終わり ftp.php*/
- /*Location /Apache Group/htdocs/ftp.php*/
复制代
|