Добро пожаловать!
Здесь вы можете найти ответ на интересующий вас вопрос в отрасли сайтостроения, познакомится ближе с web технологиями и web стандартами.

PHP и MySQL

9. Работа с FTP средствами PHP

9.1. Основные возможности PHP при работе с FTP

Протокол FTP (File Transfer Protocol - протокол передачи файлов) - один из старейших протоколов Интернета, предназначенный для передачи файлов между двумя хостами.

Как правило, при работе с FTP выполняются следующие стандартные действия:

  • соединение с удаленным FTP-сервером
  • регистрация на FTP-сервере
  • загрузка файлов с сервера или на сервер
  • закрытие соединения

9.1.1. Соединение с FTP-сервером

Соединение с удаленным FTP-сервером выполняется с помощью функции ftp_connect:

  resource ftp_connect ( string host [, int port [, int timeout]] )

В качестве обязательного параметра эта функция принимает имя хоста host, с которым необходимо установить соединение. Второй необязательный параметр port указывает на номер порта, через который осуществляется соединение. Если этот параметр не указан, то соединение осуществляется через порт 21, являющийся стандартным FTP-портом. Третий необязательный параметр определяет максимально время выполнения сценария (тайм-аут) и по умолчанию равен 90 секундам.

Соединение с удаленным FTP-сервером:

<?php
  $host 
"ftp://ftp.server.ru";
  
$connect ftp_connect$host );
  if( !
$connect )
  {
    exit( 
"Ошибка соединения" );
  }
  else
  {
    echo 
"Соединение установлено";  
  }
?>

9.1.2. Регистрация на FTP-сервере

После того, как соединение установлено, необходимо зарегистрироваться на сервере с определенным именем и паролем. Сделать это можно при помощи функции ftp_login.

  bool ftp_login ( resource connect, string username, string password )

Функция принимает три параметра: дескриптор FTP-соединения, возвращаемый функцией ftp_connect, имя пользователя и пароль.

Замечание:

Регистрация на сервере не требуется, если FTP-сервер является анонимным.

Регистрация на FTP-сервере:

<?
  $user 
"maks";
  
$password "password";
  
$result ftp_login$connect$user$password );
?>

9.1.3. Загрузка файлов с сервера

Загрузка файлов с сервера осуществляется при помощи функции ftp_get:

  bool ftp_get ( resource connect, string local_file,
                 string remote_file, int mode );

Аргумент mode, задающий режим пересылки файлов, должен быть указан как константа FTP_BINARY или FTP_ASCII. Режим FTP_ASCII используется для пересылки файлов, состоящих только из ASCII-символов (т. е. текстовых файлов), а двоичный режим - для пересылки всех остальных файлов.

<?
  $local_file 
"/users/local.txt";
  
$remote_file "remote.txt";
  
ftp_get$connect$local_file$remote_fileFTP_BINARY );
?>

9.1.4. Закрытие соединения

По окончании сеанса связи с FTP-сервером, нужно закрыть FTP-соединение с помощью функции ftp_close, принимающей в качестве единственного параметра дескриптор FTP-соединения:

  bool ftp_close ( resource connect );

9.2. Другие возможности при работе с FTP

9.2.1. Переход в родительский каталог

Изменение текущего рабочего каталога на родительский производится с помощью функции ftp_cdup:

  bool ftp_cdup ( resource connect );

Пример:

<?php
  $host 
"ftp.server.ru";
  
$port 21;
  
$user "maksim";
  
$passwrod "password";

  
$connect ftp_connect$host$port150 );
  if ( !
$connect ) exit( "Ошибка соединения" );  
  
$result ftp_login$connect$user$password );
  if ( 
$result )
  {
    
// сохраняем имя текущего рабочего каталога
    
$current_dir ftp_pwd$connect );
    
// переходим в родительский каталог 
    
ftp_cdup$connect );
    
// сохраняем имя нового каталога
    
$new_dir ftp_pwd$connect );
  }
  else
  {
    
ftp_close$connect );
    exit( 
"Неправильный логин или пароль" );
  }

  
// закрываем соединение
  
ftp_close$connect );
?>

9.2.2. Изменение текущего рабочего каталога

Изменение текущего рабочего каталога на указанный осуществляется при помощи функции ftp_chdir:

<?php
  $new_dir 
"web";
  
ftp_chdir$connect$new_dir );
?>

Как видно из этого листинга, функция ftp_chdir имеет два параметра: дескриптор соединения $connect и имя нового каталога $new_dir.

9.2.3. Удаление файлов

Удалить файл с FTP-сервера можно с помощью функции ftp_delete:

  bool ftp_delete ( resource connect, string remote_file );

Здесь connect - дескриптор соединения, а remote_file - имя удаляемого файла.

9.2.4. Создание каталога

Новый каталог можно создать, используя функцию ftp_mkdir:

  string ftp_mkdir ( resource connect, string directory );

Эта функция возвращает имя созданного каталога или false в случае неудачи:

<?php
  $dir 
"web";
  
$created_dir ftp_mkdir$connect$dir );
?>

9.2.5. Перечисление файлов в каталоге

Узнать, какие файлы находятся в текущем каталоге, можно применив функцию ftp_nlist:

  array ftp_nlist ( resource connect, string directory );

Пример:

<?php
  $file_list 
ftp_nlist$connect"." );
  if ( 
is_array($file_list) )
  {
    foreach( 
$file_list as $file )
    {
      echo 
$file."<br/>";
    }
  }
?>

9.2.6. Переименование файлов

Переименовать файлы на FTP-сервере можно с помощью функции ftp_rename:

  bool ftp_rename ( resource connect, string from, string to );

9.2.7. Удаление каталогов

Для удаления каталогов применяется функция ftp_rmdir:

   bool ftp_rmdir ( resource connect, string directory );

9.2.8. Определение размера файлов

Для определения размера файлов существует функция ftp_size:

  int ftp_size( resource connect, string filepath );

В случае неудачи функция возвращает -1. К примеру:

<?php
  $file 
"/web/user/file.txt";
  
$file_size ftp_size$connect$file );
  if ( 
$file_size == -)
    echo 
"Размер файла не определен";
  else
    echo 
"Файл ".$file." имеет размер ".$file_size." байт";
?>

9.2.9. Посылка команды на сервер

Послать на сервер команду можно с помощью функции ftp_site:

  bool ftp_site ( resource connect, string command );

Эта функция посылает на сервер команду command. Как правило, с помощью ftp_site выполняются такие команды операционной системы, как chmod. Список команд, поддерживаемый сервером можно узнать, подключившись к нему и выполнив команду REMOTEHELP. Ниже приведен код, позволяющий изменить права доступа к файлу на удаленном сервере:

<?php
  $command 
"chmod 0766 /web/user/file.txt";
  
ftp_site$connect$command );
?>

9.2.10. Работа через брандмауэр

При работе с FTP-сервером через брандмауэр часто бывает необходимо изменить активный режим, при котором соединение инициируется сервером, на пассивный, при котором соединение инициируется клиентом. Это можно сделать, применив функцию ftp_pasv:

<?php
  $pasv_flag 
true;
  
$pasv_result $pasv_flag "enabled" "disabled";
  
ftp_pasv$connect$pasv_flag );
?>

9.3. Проект: FTP-клиент

<?php
if (!isset($_GET['host'],$_GET['login'],$_GET['pass']))
{
  echo 
"Введите данные сервера:<br/>\n";
  echo 
"<form action='".$_SERVER["PHP_SELF"]."' method='GET'>\n";
  echo 
"Адрес: <input type='text' name='host'><br/>\n";
  echo 
"Логин: <input type='text' name='login'><br/>\n";
  echo 
"Пароль: <input type='text' name='pass'><br/>\n";
  echo 
"<input type='submit' value='Connect'>\n";

else 
{
  
$connect ftp_connect($_GET['host']) or die ("Не удалось установить соединение с сервером");
  if (
ftp_login($connect,$_GET['login'],$_GET['pass']))
  {
    if ( !isset(
$_GET['folder']) or empty($_GET['folder']) ) $_GET['folder'] = "/";
    if ( @!
ftp_chdir($connect$_GET['folder']) )  echo "Путь ".$_GET['folder']." не найден.<br/>\n";
    
$parent "/";
    
$tmp "";
    if ( 
ftp_pwd($connect) != "/" )
    {
      
$pos strrpos ftp_pwd($connect), "/" );
      if ( 
$pos )  $parent substr_replaceftp_pwd($connect), ""$pos );
      
$tmp "/";
      echo 
"<a href='".$_SERVER["PHP_SELF"]."?host=".$_GET['host']
                      .
"&login=".$_GET['login']."&pass=".$_GET['pass']
                      .
"&folder=".$parent."'>Родительская директория</a><br/>\n";
    }
    echo 
"<hr>";
    echo 
"<b>Текущая директория: ".ftp_pwd($connect)."</b><br/><br/>\n";
    
$nlist ftp_nlist($connect".");
    for (
$i 0$i count($nlist); $i++) 
    {
      if ( 
$nlist[$i] == "." or $nlist[$i] == ".."  ) continue;
      echo 
"<a href='".$_SERVER["PHP_SELF"]."?host=".$_GET['host']
                      .
"&login=".$_GET['login']."&pass=".$_GET['pass']
                      .
"&folder=".ftp_pwd($connect).$tmp.$nlist[$i]."'>".$nlist[$i]."</a><br/>\n";
    }
  } 
  else 
  {
    echo 
"Не удалось войти на сервер под именем ".$_GET['login'];
  }
  
ftp_close($connect);
}
?>