2010-09-16 48 views
15

Estoy usando el script PHP a continuación para probar las conexiones FTP. Actualmente está imprimiendo una matriz de archivos, si se conecta con éxito.Prueba de conexión FTP con PHP

¿Cómo puedo obtener que también muestre un mensaje, si se puede conectar? Como 'Conexión exitosa'.

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

EDITAR

que tienen que trabajar ahora, pero, he probado esto en unos pocos dominios que tengo en el servidor MediaTemple y todos ellos parecen ser el tiempo de espera. Sin embargo, funciona con todos los demás dominios que he probado. ¿Sus servidores están bloqueando la solicitud?

Respuesta

13

Simplemente haga una comprobación si ftp_nlist() es una matriz.

igual:

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

Referencias:

+0

Gracias, eso funciona genial :). Sin embargo, he probado esto en algunos dominios que tengo en un servidor de MediaTemple y todos parecen estar agotando el tiempo. Sin embargo, funciona con todos los demás dominios que he probado. ¿Sus servidores están bloqueando la solicitud? – Batfan

+1

@Batfan: podría ser, sin embargo intente la respuesta de 'mr.w' a continuación, ya que incluyó una declaración try/catch que le dará el' $ e-> getMessage(); 'si hay un error, ofreciendo una idea de lo que sucedió (autenticación de tiempo/inválida, etc.). – Jakub

+0

Hmmm, probé la secuencia de comandos del Sr. W y sigue fallando en los dominios alojados de MediaTemple, sin que se muestre ningún error. – Batfan

1

Tenga en cuenta que ya se encuentra die ing cuando usted no puede c onnect, para que pueda asumir que está conectado. Sin embargo, también se puede comprobar el estado de la conexión usando:

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

ftp_connect: Devuelve una secuencia FTP en caso de éxito o FALSE en caso de error.

21

Tanto ftp_connect() como ftp_login() devuelven un booleano que indica éxito. Por lo tanto, algo como esto debería hacer lo que quiera, si estoy interpretando correctamente:

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

En mi caso 'ftp_login' arroja una advertencia. Tal vez depende de la configuración de php. – FreeLightman

5

Hey. Soy nuevo aquí, por lo que quizás publicar esta respuesta tardía no sea bienvenido, pero puede ayudar a las personas en el futuro.

La razón por la que no está funcionando con MediaTemple es porque solo aceptan conexiones pasivas.

Después de iniciar sesión con ftp_login(), simplemente llame al ftp_pasv($ftp, TRUE); y se establecerá.

+0

El comentario definitivamente es bienvenido. Gracias por la información :) Tendré que darle un giro. – Batfan

1

Hola He intentado esto ... Trabajar correctamente.

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

Aunque estoy de acuerdo con la lógica de la respuesta aceptada de @Jakub de llamar ftp_nlist() y prueba de tipo de datos con is_array(), esto puede ser muy lento y engorroso con particularmente grandes directorios, ftp hinchados como los que estoy actualmente trabajando en. Y no me gusta la idea de crear un directorio en blanco solo para pruebas, que puede renombrarse/eliminarse más tarde si se considera que no lo necesita, quizás otro desarrollador o porque se olvidó de lo que se colocó allí.

estoy usando una conexión FTP pasivo, por lo que para mi propósito en scripts de cron que puede tomar mucho tiempo para ejecutar y potencialmente requiere la reconexión, detecto el uso de este:

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

La emisión de un nuevo llamado a ftp_pasv() no hará ninguna alteración en el estado de la conexión ftp, pero responderá verdadero si la conexión está activa e iniciada/falsa si no puede programarse para volver a conectar :)

Cuestiones relacionadas