2010-09-16 14 views
15

Używam poniższego skryptu PHP do testowania połączeń FTP. Obecnie drukuje tablicę plików, jeśli pomyślnie się połączy.Przetestuj połączenie FTP z PHP

Jak mogę go ustawić, aby wyświetlał również komunikat, jeśli jest w stanie się połączyć? Jak "Połączenie powiodło się".

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

EDIT

mam to działa teraz, ale ja testowałem to na kilku domen mam na serwerze MediaTemple i wszystkie one wydają się być rozrządu. Działa jednak ze wszystkimi innymi domenami, które wypróbowałem. Czy ich serwery blokują żądanie?

Odpowiedz

13

Po prostu sprawdź, czy ftp_nlist() jest tablicą.

odczuwalna:

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

Referencje:

+0

Dzięki, że działa świetnie :). Przetestowałem to jednak na kilku domenach, które mam na serwerze MediaTemple i wszystkie wydają się być limitowane. Działa jednak ze wszystkimi innymi domenami, które wypróbowałem. Czy ich serwery blokują żądanie? – Batfan

+1

@ Batfan - może jednak spróbować poniżej odpowiedzi 'mr.w', ponieważ zawiera instrukcję try/catch, która dostarczy ci' $ e-> getMessage(); 'jeśli wystąpi błąd, oferując pewien wgląd w to, co się stało (timout/nieprawidłowe uwierzytelnienie, itp.). – Jakub

+0

Hmmm, próbowałem skryptu pana W i nadal nie działa w hostowanych domenach MediaTemple, bez wyświetlania błędu. – Batfan

1

Pamiętaj, że jesteś już die ing, gdy nie uda się c onnect, więc możesz założyć, że jesteś połączony. Jednakże, można również sprawdzić stan połączenia przy użyciu:

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

ftp_connect: Zwraca strumień FTP w przypadku sukcesu, FALSE w przypadku błędu.

21

Zarówno ftp_connect(), jak i ftp_login() zwracają wartość typu boolean, która wskazuje na sukces. Tak więc coś takiego powinno zrobić to, co chcesz, jeśli dobrze interpretuję:

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

W moim przypadku 'ftp_login' generuje ostrzeżenie. Może to zależy od ustawień php. – FreeLightman

5

Hej. Jestem tu nowy, więc może ogłoszenie tej późnej odpowiedzi nie jest mile widziane, ale może pomóc ludziom w przyszłości.

Powodem, dla którego nie działa z MediaTemple, jest fakt, że akceptują tylko połączenia pasywne.

Po zalogowaniu się na ftp_login(), po prostu zadzwoń pod numer ftp_pasv($ftp, TRUE);, a zostaniesz ustawiony.

+0

Komentarz jest zdecydowanie mile widziany. Dzięki za informację :) Będę musiał dać temu wir. – Batfan

1

Witam Próbowałem tego .. Praca poprawnie.

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

Chociaż zgadzam się z logiką w przyjętym odpowiedź od @Jakub wywołania ftp_nlist() i testowanie typ danych z is_array(), to może być bardzo powolne i uciążliwe ze szczególnie dużych, opasłych katalogów ftp, takich jak te, które obecnie jestem pracować nad. I nie podoba mi się pomysł utworzenia pustego katalogu tylko do testowania, który może być później zmieniony/usunięty, co uważane jest za niepotrzebne, być może przez innego programistę lub dlatego, że zapomniałeś, co zostało tam umieszczone.

Używam pasywnego połączenia FTP, więc na mój cel na skrypty crona, który może zająć dużo czasu, aby wykonać i potencjalnie wymagają ponownego łączenia, wykryć przy użyciu to:

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

Wydanie nowego połączenia do ftp_pasv() nie zmieni stanu połączenia ftp, ale będzie odpowiadał prawdzie, jeśli połączenie jest aktywne i zalogowane/false, jeśli nie, możesz zaprogramować ponowne połączenie :)

Powiązane problemy