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_file, FTP_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, $port, 150 );
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 == -1 )
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_replace( ftp_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);
}
?>
|