【问题标题】:Test FTP connection with PHP用 PHP 测试 FTP 连接
【发布时间】:2011-04-13 09:10:47
【问题描述】:

我正在使用下面的 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 服务器上的几个域上测试了它,它们似乎都超时了。然而,它适用于我尝试过的所有其他域。他们的服务器是否阻止了请求?

【问题讨论】:

    标签: php ftp


    【解决方案1】:

    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();
    }
    

    【讨论】:

    • 就我而言,ftp_login 会发出警告。也许这取决于 php 设置。
    【解决方案2】:

    只需检查ftp_nlist() 是否是一个数组。

    喜欢:

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

    参考资料:

    【讨论】:

    • 谢谢,效果很好:)。但是,我已经在 MediaTemple 服务器上的几个域上对此进行了测试,它们似乎都超时了。然而,它适用于我尝试过的所有其他域。他们的服务器是否阻止了请求?
    • @Batfan -- 可能是,但是请在下面尝试mr.w 的答案,因为他包含一个 try / catch 语句,如果出现错误,它将为您提供$e->getMessage();,提供一些见解发生了什么(超时/无效身份验证等)。
    • 嗯,我尝试了 W 先生的脚本,但它在 MediaTemple 托管域上仍然失败,没有显示错误。
    • 有更好的方法。 if(!$con){echo "Not connected.";}
    【解决方案3】:

    嘿。我是新来的,所以可能不欢迎发布这个迟到的答案,但它可能会在未来帮助人们。

    它不能与 MediaTemple 一起工作的原因是因为它们只接受被动连接。

    使用ftp_login() 登录后,只需拨打ftp_pasv($ftp, TRUE); 即可完成设置。

    【讨论】:

    • 绝对欢迎评论。谢谢你的信息:)我得试一试。
    【解决方案4】:

    您好,我已经尝试过这个..工作正常。

    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);
    

    【讨论】:

      【解决方案5】:

      虽然我同意@Jakub 接受的答案中的逻辑,即调用ftp_nlist() 并使用is_array() 测试数据类型,但对于像我目前使用的特别大、臃肿的 ftp 目录,这可能会非常缓慢和麻烦工作。而且我不喜欢仅仅为了测试而创建一个空白目录的想法,以后可以将其重命名/删除,因为认为不需要,可能是由另一个开发人员或因为您忘记了放置它的目的。

      我正在使用被动 ftp 连接,因此对于可能需要很长时间才能执行并可能需要重新连接的 cron 脚本,我检测到使用此连接:

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

      重新调用ftp_pasv() 不会改变 ftp 连接的状态,但如果连接处于活动状态,它会响应 true,如果没有登录/则返回 false,这样您就可以编程重新连接 :)

      【讨论】:

        【解决方案6】:

        请注意,当您连接失败时,您已经dieing,因此您可以假设您已连接。但是,您也可以使用以下命令检查连接状态:

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

        ftp_connect:成功时返回 FTP 流,错误时返回 FALSE。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2018-06-18
          • 2013-02-09
          • 1970-01-01
          • 2011-04-10
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多