2010-09-16 93 views
15

我正在使用下面的PHP腳本來測試FTP連接。目前它正在打印一組文件,如果它成功連接的話。使用PHP測試FTP連接

如何獲得它也顯示一條消息,如果它能夠連接?像'連接成功'。

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

編輯

我現在的工作,但是,我已經對我有一個MEDIATEMPLE服務器上的幾個域測試這一點,他們似乎都被超時。然而,它適用於我嘗試過的所有其他域。他們的服務器是否阻止了請求?

回答

13

只要做一個檢查,如果ftp_nlist()是一個數組。

像:

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

參考文獻:

+0

謝謝,這很有用:)。但是,我已經在MediaTemple服務器上的幾個域上測試過了,它們都似乎超時。然而,它適用於我嘗試過的所有其他域。他們的服務器是否阻止了請求? – Batfan 2010-09-16 21:24:17

+1

@Batfan - 可以,但是請嘗試'mr.w'的答案在下面,因爲他包含了一個try/catch語句,它會給你'$ e-> getMessage();'如果有錯誤,提供一些洞察發生了什麼(timout /無效身份驗證等)。 – Jakub 2010-09-17 12:22:05

+0

嗯,我試過W先生的腳本,它仍然在MediaTemple託管的域上失敗,沒有顯示任何錯誤。 – Batfan 2010-09-17 15:29:54

1

需要注意的是,當你失敗到c是已經die ING onnect,所以你可以假設你已經連接。但是,你也可以用檢查連接的狀態:

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

FTP_CONNECT:返回上錯誤的成功或FALSE FTP流。

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 2018-03-07 04:36:58

5

嘿。我是新來的,所以可能發佈這個遲到的答案是不受歡迎的,但它可能會在未來幫助人們。

它不與MediaTemple配合工作的原因是它們只接受被動連接。

ftp_login()登錄後,只需撥打ftp_pasv($ftp, TRUE);即可設置。

+0

評論絕對值得歡迎。感謝您的信息:)我將不得不給它一個旋風。 – Batfan 2010-11-23 00:11:31

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目錄,如我目前的那些工作。我不喜歡爲測試創建一個空白目錄的想法,可以稍後重新命名/刪除它,也許由另一個開發人員或因爲您忘記了它放在那裏。

我使用的是被動FTP連接,所以我在cron腳本的目的,可以採取很長的時間來執行,並可能需要重新連接,我發現使用此:

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

發放到ftp_pasv()一個新的調用將不會改變ftp連接的狀態,但是如果連接處於活動狀態並且已登錄,它將作出響應/如果不是,則爲false,因此您可以重新編程以重新連接:)