2010-09-16 3 views
15

Я использую скрипт PHP ниже для проверки FTP-соединений. В настоящее время он печатает массив файлов, если он успешно подключается.Проверка FTP-соединения с PHP

Как я могу получить его, чтобы отобразить сообщение, если оно способно подключиться? Как «Успешное соединение».

$con = ftp_connect($server) or die("Couldn't connect"); 
ftp_login($con, $username, $password); 
print_r(ftp_nlist($con, ".")); 
ftp_close($con); 

EDIT

У меня он работает сейчас, но я испытал это на нескольких доменах у меня есть на сервере Mediatemple и все они, кажется, быть таймаут. Тем не менее, он работает со всеми другими доменами, которые я пробовал. Их серверы блокируют запрос?

ответ

13

Просто сделайте проверку, если ftp_nlist() - это массив.

Как:

echo is_array(ftp_nlist($con, ".")) ? 'Connected!' : 'not Connected! :(';

Ссылки:

+0

Спасибо, это отлично работает :). Тем не менее, я протестировал это на нескольких доменах, которые у меня есть на сервере MediaTemple, и все они, похоже, устарели. Тем не менее, он работает со всеми другими доменами, которые я пробовал. Их серверы блокируют запрос? – Batfan

+1

@Batfan - может быть, однако попробуйте ответить 'mr.w' ниже, так как он включил оператор try/catch, который даст вам' $ e-> getMessage(); 'если есть ошибка, предлагающая некоторое понимание того, что произошло (тайм-аут/недействительная аутентификация и т. д.). – Jakub

+0

Хммм, я попробовал скрипт мистера У, и он все еще терпит неудачу на размещенных доменах MediaTemple, при этом не отображается ошибка. – Batfan

1

Обратите внимание, что вы уже die ИНГ, когда вы не в состоянии с onnect, поэтому вы можете предположить, что вы подключены. Тем не менее, вы также можете проверить статус соединения с помощью:

echo $con !== FALSE ? 'Connected' : "Couldn't connect"; 

ftp_connect: Возвращает FTP поток в случае успешного завершения или FALSE в случае ошибки.

21

Оба ftp_connect() и ftp_login() возвращают логическое значение, указывающее на успех. Таким образом, что-то вроде этого должно делать то, что вы хотите, если я правильно интерпретирую:

try { 
    $con = ftp_connect($server); 
    if (false === $con) { 
     throw new Exception('Unable to connect'); 
    } 

    $loggedIn = ftp_login($con, $username, $password); 
    if (true === $loggedIn) { 
     echo 'Success!'; 
    } else { 
     throw new Exception('Unable to log in'); 
    } 

    print_r(ftp_nlist($con, ".")); 
    ftp_close($con); 
} catch (Exception $e) { 
    echo "Failure: " . $e->getMessage(); 
} 
+0

В моем случае 'ftp_login' выдает предупреждение. Возможно, это зависит от настроек php. – FreeLightman

5

Привет. Я новичок здесь, поэтому, возможно, публикация этого позднего ответа не приветствуется, но это может помочь людям в будущем.

Причина, по которой он не работает с MediaTemple, заключается в том, что они принимают только пассивные соединения.

После входа в систему с ftp_login() просто позвоните ftp_pasv($ftp, TRUE);, и вы будете установлены.

+0

Комментарий определенно приветствуется. Спасибо за информацию :) Я должен буду дать этому вихрь. – Batfan

1

Привет, я пробовал это. Работать правильно.

set_time_limit(300);//for setting 
$path='/'.date('dmY').''; 
$ftp_server=''; 
$ftp_server_port=""; 
$ftp_user_name=''; 
$ftp_user_pass=""; 

// set up a connection to ftp server 
$conn_id = ftp_connect($ftp_server, $ftp_server_port); 
// login with username and password 
$login_result = ftp_login($conn_id, $ftp_user_name, $ftp_user_pass); 

// check connection and login result 
if ((!$conn_id) || (!$login_result)) { 
    echo "Fail</br>"; 
} else { 
    echo "Success</br>"; 
    // enabling passive mode 
    ftp_pasv($conn_id, true); 
    // get contents of the current directory 
    $contents = ftp_nlist($conn_id, $path); 
    // output $contents 
    var_dump($contents); 
} 

// close the FTP connection 
ftp_close($conn_id); 
2

Хотя я согласен с логикой в ​​принятом ответе от @Jakub вызова ftp_nlist() и тестирования типа данных с is_array(), это может быть очень медленными и громоздкими с особенно большими, раздутым фтпом каталогами, как те, которые я нахожусь в настоящее время работа над. И мне не нравится идея создания пустого каталога только для тестирования, который может быть переименован/удален позже, как считается ненужным, возможно, другим разработчиком или потому, что вы забыли, для чего он был помещен там.

Я использую пассивный FTP соединение, поэтому для моей цели на хрон сценариев, которые могут занять много времени, чтобы выполнить и потенциально требуют повторного подключения, я обнаруживаю, используя это:

function check_connection_status($conn_id) { 
    return ftp_pasv($conn_id, true); 
} 

Выдача запрашивали ftp_pasv() не будет изменять состояние соединения ftp, но он ответит true, если соединение активно и зарегистрировано в/false, если вы не можете запрограммировать повторное подключение снова :)

Смежные вопросы