2009-05-19 8 views
0

J'écris un script d'automatisation sur un serveur de production qui, entre autres choses, doit récupérer une liste de fichiers distants via FTP (FTP est la seule option pour interagir avec le système de fichiers distant) et les télécharger sélectivement.Comment puis-je utiliser PHP CLI pour automatiser FTP lorsque je n'ai pas accès au handle FTP natif de PHP?

Pourquoi je ne peux pas utiliser wrappers FTP natif de PHP

Ceci est un serveur de production dans un environnement très fragile. Je l'écris en utilisant PHP CLI, puisque la plupart des scripts d'automatisation existants sont écrits de cette façon. Cependant, même si j'ai une toute nouvelle installation de PHP 5.1.2, je ne suis pas capable de la recompiler avec --with-ftp, et cette option n'est pas activée.

Les options restantes

Alors, mes options sont pour vous connecter, obtenir ma liste de fichiers et télécharger de manière sélective à l'aide shell_exec() ou les fonctions de php_filesystem en utilisant un flux FTP et les fonctions du système de fichiers natif PHP.

Malheureusement, je ne trouve pas de bons exemples de code. Lorsque j'essaie de shell_exec en utilisant des commandes FTP, le programme se bloque, probablement parce que le contrôle reste sur le shell une fois que j'ouvre l'invite FTP.

$ftp_connect_command = "ftp -v -n $bl_ftp_host"; 
$ftp_login_command = "user $bl_ftp_user $bl_ftp_password"; 
$ftp_bye_command = "bye"; 

$ftp_connect_response = shell_exec("$ftp_connect_command"); 
// this never executes, because it hangs here waiting for a return to shell 
$ftp_login_response = shell_exec($ftp_login_command); 

Ou, j'imagine que le flux basé façon de le faire serait:

$ftp_path = "ftp://$bl_ftp_user:[email protected]$bl_ftp_host/"; 
$stream_options = array('ftp' => array('overwrite' => false)); 
$context = stream_context_create(); 
if ($dh = opendir($ftp_path, $context)) 
{ 
    while (filename = readdir($dh)) 
    { 
     print($filename); 
    } 
} 

Mais je ne sais pas si cela est considéré comme une méthode fiable.

Quelqu'un peut-il fournir des exemples de code montrant comment capturer une liste de répertoires et télécharger des fichiers par l'une ou l'autre de ces méthodes?

+0

5.3 n'est pas encore sorti. Pourquoi utilisez-vous cela dans un environnement de production en premier lieu? – troelskn

+0

Mon mauvais, c'est 5.1.2, le message est mis à jour. Quant à savoir pourquoi les restrictions sont en place? C'est une longue histoire. – danieltalsky

Répondre

2

Apparemment, utilise pemftp pour wordpress FTP pur PHP (sur les systèmes compilés sans support FTP)

0

Avez-vous regardé la bibliothèque FTP PHP native? http://us2.php.net/ftp

+0

J'ai clarifié un peu la question. Je ne suis pas capable de recompiler PHP dans ce cas. – danieltalsky