PHP: FTP 関数 - Manual
PHP  
downloads | documentation | faq | getting help | mailing lists | | php.net sites | links | my php.net 
search for in the  
<fribidi_log2visftp_alloc>
view the version of this page
Last updated: Tue, 21 Dec 2004

XXXVII. FTP 関数

導入

この拡張モジュールの関数は、http://www.faqs.org/rfcs/rfc959.htmlで定義された File Transfer Protocol (FTP)を使用してファイルサーバにアクセスするクライアントの 実装です。

要件

これらの関数は、標準モジュールの一部として利用可能であり、常に使用できます。

インストール手順

PHPでFTP関数を使用するには、PHP 4をインストール際には --enable-ftpオプション、PHP 3を使 用する場合には--with-ftpを追加する 必要があります。

Windows版のPHPには この拡張モジュールのサポートが組み込まれています。これらの関数を使用 するために拡張モジュールを追加でロードする必要はありません。

実行用の設定

この拡張モジュールは設定ディレクティブを全く定義しません。

リソース型

この拡張モジュールは、1種類のリソース型を使用します。このリソース 型は、FTP接続のリソースIDで、ftp_connect()によ り返されたものです。

定義済みの定数

これらの定数は、この拡張モジュールで定義されており、 この拡張モジュールがPHP内部にコンパイルされているか実行時に動的にロー ドされるかのどちらかの場合のみ使用可能です。

FTP_ASCII (integer)

FTP_TEXT (integer)

FTP_BINARY (integer)

FTP_IMAGE (integer)

FTP_TIMEOUT_SEC (integer)

詳細は、ftp_set_option() を参照下さい。

以下の定数は、PHP 4.3.0で追加されました。

FTP_AUTOSEEK (integer)

詳細は、ftp_set_option() を参照して下さい。

FTP_AUTORESUME (integer)

GETおよびPUTリクエスト用のレジューム位置と開始位置を自動的に定義 します。(FTP_AUTOSEEKが有効な場合のみ動作します。)

FTP_FAILED (integer)

非同期伝送が失敗しました。

FTP_FINISHED (integer)

非同期伝送が終了しました。

FTP_MOREDATA (integer)

非同期伝送がまだアクティブです。

例 1. FTPの例

<?php
// set up basic connection
$conn_id = ftp_connect($ftp_server);

// login with username and password
$login_result = ftp_login($conn_id, $ftp_user_name, $ftp_user_pass);

// check connection
if ((!$conn_id) || (!$login_result)) {
       echo
"Ftp connection has failed!";
       echo
"Attempted to connect to $ftp_server for user $ftp_user_name";
       die;
   } else {
       echo
"Connected to $ftp_server, for user $ftp_user_name";
   }

// upload the file
$upload = ftp_put($conn_id, $destination_file, $source_file, FTP_BINARY);

// check upload status
if (!$upload) {
       echo
"Ftp upload has failed!";
   } else {
       echo
"Uploaded $source_file to $ftp_server as $destination_file";
   }

// close the FTP stream
ftp_close($conn_id);
?>

目次
ftp_alloc -- Allocates space for a file to be uploaded
ftp_cdup -- 親ディレクトリに移動する
ftp_chdir -- FTP サーバー上でディレクトリを移動する
ftp_chmod -- Set permissions on a file via FTP
ftp_close -- FTP接続を閉じる
ftp_connect -- FTP 接続をオープンする
ftp_delete -- ftp サーバー上のファイルを削除する
ftp_exec --  ftpサーバでプログラム実行する
ftp_fget --  FTP サーバーからファイルをダウンロードし、オープン中のファイルに 保存する
ftp_fput --  オープン中のファイルをFTPサーバーにアップロードする
ftp_get_option --  カレントのFTPストリームの種々の実行動作を取得する
ftp_get -- FTPサーバーからファイルをダウンロードする
ftp_login -- FTP 接続でログインする
ftp_mdtm -- 指定したファイルが最後に修正された時間を返す
ftp_mkdir -- ディレクトリを作成する
ftp_nb_continue -- Continues retrieving/sending a file (non-blocking)
ftp_nb_fget -- Retrieves a file from the FTP server and writes it to an open file (non-blocking)
ftp_nb_fput -- Stores a file from an open file to the FTP server (non-blocking)
ftp_nb_get -- Retrieves a file from the FTP server and writes it to a local file (non-blocking)
ftp_nb_put -- Stores a file on the FTP server (non-blocking)
ftp_nlist -- 指定したディレクトリのファイルの一覧を返す
ftp_pasv -- パッシブモードをオンまたはオフにする
ftp_put -- FTP サーバーにファイルをアップロードする
ftp_pwd -- 現在のディレクトリ名を返す
ftp_quit -- FTP接続を閉じる
ftp_raw -- Sends an arbitrary command to an FTP server
ftp_rawlist --  指定したディレクトリの詳細なファイル一覧を返す
ftp_rename -- ftp サーバー上のファイルの名前を変更する
ftp_rmdir -- ディレクトリを削除する
ftp_set_option --  FTP実行オプションを設定する
ftp_site -- SITEコマンドをサーバーに送信する
ftp_size -- 指定したファイルのサイズを返す
ftp_ssl_connect -- セキュアな FTP 接続をオープンする
ftp_systype --  リモート FTP サーバーのシステム型IDを返す


add a note add a note User Contributed Notes
FTP 関数
arjen at queek dot nl
15-Jul-2004 02:38
If you prefer a OO-approach to the FTP-functions, you can use this snippet of code (PHP5 only! and does add some overhead). It's just a "start-up", extend/improve as you wish...
You can pass all ftp_* functions to your object and stripping ftp_ of the function name. Plus, you don't have to pass the ftp-resource as the first argument.

For example:
<?php
ftp_delete
($ftp, $file);    // Where $ftp is your ftp-resource
?>

Can become:
<?php
$ftp
->delete($file);        // Where $ftp is your FTP-object
?>

Code:
<?php

class FTP {

  
private $ftp;
  
  
/* public Void __construct(): Constructor */
  
public function __construct($host, $port = 21, $timeout = 90) {
      
$this->ftp = ftp_connect($host, $port, $timeout);
   }
  
  
/* public Void __destruct(): Destructor */
  
public function __destruct() {
       @
ftp_close($this->ftp);
   }

  
/* public Mixed __call(): Re-route all function calls to the PHP-functions */
  
public function __call($function, $arguments) {
      
// Prepend the ftp resource to the arguments array
      
array_unshift($arguments, $this->ftp);
      
      
// Call the PHP function
      
return call_user_func_array('ftp_' . $function, $arguments);
   }
  
}

?>
Kristy Christie (kristy at isp7 dot net)
15-Jun-2004 06:50
Here's a little function that I created to recurse through a local directory and upload the entire contents to a remote FTP server.

In the example, I'm trying to copy the entire "iwm" directory located at /home/kristy/scripts/iwm to a remote server's /public_html/test/ via FTP.

The only trouble is that for the line "if (!ftp_chdir($ftpc,$ftproot.$srcrela))", which I use to check if the directory already exists on the remote server, spits out a warning about being unable to change to that directory if it doesn't exist.

But an error handler should take care of it.

My thanks to the person who posted the snippet on retrieving the list of files in a directory.

For the version of the script that echo's it's progress as it recurses & uploads, go to:

<?php

// --------------------------------------------------------------------
// THE TRIGGER
// --------------------------------------------------------------------

   // set the various variables
  
$ftproot = "/public_html/test/";
  
$srcroot = "/home/kristy/scripts/";       
  
$srcrela = "iwm/";

  
// connect to the destination FTP & enter appropriate directories both locally and remotely
  
$ftpc = ftp_connect("ftp.mydomain.com");
  
$ftpr = ftp_login($ftpc,"username","password");

   if ((!
$ftpc) || (!$ftpr)) { echo "FTP connection not established!"; die(); }
   if (!
chdir($srcroot)) { echo "Could not enter local source root directory."; die(); }
   if (!
ftp_chdir($ftpc,$ftproot)) { echo "Could not enter FTP root directory."; die(); }

  
// start ftp'ing over the directory recursively
  
ftpRec ($srcrela);

  
// close the FTP connection
  
ftp_close($ftpc);

// --------------------------------------------------------------------
// THE ACTUAL FUNCTION
// --------------------------------------------------------------------
function ftpRec ($srcrela)
{
   global
$srcroot;
   global
$ftproot;
   global
$ftpc;
   global
$ftpr;
              
  
// enter the local directory to be recursed through
  
chdir($srcroot.$srcrela);
  
  
// check if the directory exists & change to it on the destination
  
if (!ftp_chdir($ftpc,$ftproot.$srcrela))
   {
      
// remote directory doesn't exist so create & enter it
          
ftp_mkdir    ($ftpc,$ftproot.$srcrela);
          
ftp_chdir    ($ftpc,$ftproot.$srcrela);
   }

   if (
$handle = opendir("."))
   {
       while (
false !== ($fil = readdir($handle)))
       {
           if (
$fil != "." && $fil != "..")   
           {
              
// check if it's a file or directory
              
if (!is_dir($fil))
               {   
                  
// it's a file so upload it
                  
ftp_put($ftpc, $ftproot.$srcrela.$fil, $fil, FTP_BINARY);
               }
               else
               {
                  
// it's a directory so recurse through it
                  
if ($fil == "templates")
                   {
                          
// I want the script to ignore any directories named "templates"
                           // and therefore, not recurse through them and upload their contents
                  
}
                   else
                   {
                      
ftpRec ($srcrela.$fil."/");
                      
chdir ("../");
                   }
               }
         }
     }
    
closedir($handle);
   }   
}
?>
postmaster at alishomepage dot com
24-Jan-2004 11:29
I have written an OpenSource ZIP2FTP interface, which actually takes a given ZIP file and decompresses it in the folder on an FTP server you specify...

Therefore it may be quite interesting for you people interested in FTP, its adress is ; those who directly want the source may visit
Vikrant Korde <vakorde at hotmail dot com>
14-Nov-2003 01:35
<?

//If you want to move or replicate the folder hierarchy from your current server to another remote server. Then this will be helpful as this will browse the current server's directory and at the same time it will copy that file in the remote server in the same directory.

//This script will copy all the files from this directory and subdirectory to another remote server via FTP

function rec_copy ($source_path, $destination_path, $con)
{
  
ftp_mkdir($con, $destination_path);
  
ftp_site($con, 'CHMOD 0777 '.$destination_path);
  
ftp_chdir($con,$destination_path);

   if (
is_dir($source_path))
   {
      
chdir($source_path);
      
$handle=opendir('.');
       while ((
$file = readdir($handle))!==false)
       {
           if ((
$file != ".") && ($file != ".."))
           {
               if (
is_dir($file))
               {
                  
// here i am restricting the folder name 'propertyimages' from being copied to remote server. -- VK
                  
if($file != "propertyimages")
                   {
                      
rec_copy ($source_path."/".$file, $file, $con);
                      
chdir($source_path);
                      
ftp_cdup($con);
                   }
               }
               if (
is_file($file))
               {
                  
$fp = fopen($file,"r");
                  
// this will convert spaces to '_' so that it will not throw error.  -- VK
                  
ftp_fput ($con, str_replace(" ", "_", $file), $fp,FTP_BINARY);
                  
ftp_site($con, 'CHMOD 0755 '.str_replace(" ", "_", $file));
               }
           }
       }
      
closedir($handle);
   }
}

// make a FTP connection --VK
$con = ftp_connect("69.18.213.131",21);
$login_result = ftp_login($con,"username","password");   

// this is the root path for the remote server-- VK
$rootpath = "mainwebsite_html";   

// this is the physical path of the source directory. actually u can also use the relative path. -- VK
$sourcepath = realpath("../")."/resdesk";

// this directory name will only change the top most directory and not the inner one -- VK
$destination_dir_name = "resdesk_".$account_id."/";

rec_copy ($sourcepath, $destination_dir_name, $con);
if (
function_exists("ftp_close"))
{
  
ftp_close($con);
}
?>
postmaster at alishomepage dot com
24-Oct-2003 11:06
Here's another FTP interface over PHP (also uses MySQL)



PS: this script will ALSO allow you to download its source... So it becomes interesting for YOU PROGRAMMERS as well :D
arjenjb dot wanadoo dot nl
09-Mar-2003 06:29
Check for a FTP server written in PHP.
Supports Passive and Active FTP, and all other standard FTP commands as decribed in RFC959.
NOSPAMkent at ioflux dot NOSPAM dot com
20-Sep-2002 12:05
I think what some other posts were trying to say which may need clarification is that in PHP 4.2.3, ftp_connect("myhost.com") was failing most of the time, except it would work like every few minutes.

The fix is that ftp_connect seems to have a bug resolving addresses. If you do:

$hostip = gethostbyname($host);
$conn_id = ftp_connect($hostip);

It seems to solve the problem.
(Other users referred to an ftpbuf() error... not sure what that is, but this should fix it.)
sven at cartell-network dot de
13-Feb-2002 07:27
connection to a ftp server across proxy

$ftp_server = "proxy"; f.e. 123.456.789.10
$ftp_user_name = "username@ftpserver"; f.e. [email protected]
$ftp_user_pass = "password";

$conn_id = ftp_connect($ftp_server, 2121);
$login_result = ftp_login( $conn_id, $ftp_user_name, $ftp_user_pass );

<fribidi_log2visftp_alloc>
 Last updated: Tue, 21 Dec 2004
show source | credits | sitemap | contact | advertising | mirror sites 
Copyright © 2001-2005 The PHP Group
All rights reserved.
This unofficial mirror is operated at: /
Last updated: Mon Mar 14 08:13:06 2005 Local time zone must be set--see zic manual page