2017-03-20 7 views
0

J'ai besoin de récupérer des fichiers depuis le répertoire racine d'un serveur distant via ssh, la machine locale utilise php7. Je l'ai fait ce script:opendir sur ssh2 ne s'arrête jamais

<?php 
$strServer = "my-server.com"; 
$strServerPort = "22"; 
$strServerUsername = "my.username"; 
$strServerPassword = "my-password"; 
$resConnection = ssh2_connect($strServer, $strServerPort); 
if(ssh2_auth_password($resConnection, $strServerUsername, $strServerPassword)) { 
    $files = array(); 
    $resSFTP = ssh2_sftp($resConnection); 
    $dirHandle = opendir("ssh2.sftp://" . intval($resSFTP) . "/"); 
    while ($dirHandle && ($file = readdir($dirHandle)) !== false) { 
     if ($file == "." || $file == "..") { 
      continue; 
     } 
     $strData = file_get_contents("ssh2.sftp://" . intval($resSFTP) . "/" . $file); 
     file_put_contents('/path/to/dir/' . $file, $strData); 
    } 
    ssh2_exec($resConnection, 'exit'); 
    unset($resConnection); 
} 

die; 

Il fonctionne, à savoir les fichiers sont récupérés, mais le script arrête jamais.
Si je connaissais le nom du fichier pour aller chercher, le script serait alors:

if(ssh2_auth_password($resConnection, $strServerUsername, $strServerPassword)) { 
    $files = array(); 
    $resSFTP = ssh2_sftp($resConnection); 
    $file = 'name_of_the_file.xlsx'; 
    $strData = file_get_contents("ssh2.sftp://" . intval($resSFTP) . "/" . $file); 
    file_put_contents('/path/to/dir/' . $file, $strData); 
} 

et le fichier est chercher et le script arrête à la fin de son exécution.

Je ne peux pas utiliser phpseclib car il faut composer et je ne peux pas l'utiliser sur la machine locale. Que puis-je faire à opendir() et readdir() sans avoir le script s'exécuter à l'infini?

Répondre

1

essayer de casser après votre file_put_contents

par exemple:

if (file_put_contents('/path/to/dir/' . $file, $strData) !== false) { 
    break; 
} 

ou une meilleure approche que vous pouvez utiliser closedir directement après avoir mis vos données

do { 
    if ($file == "." || $file == "..") { 
     continue; 
    } 
    $strData = file_get_contents("ssh2.sftp://" . intval($resSFTP) . "/" . $file); 
    if (file_put_contents('/path/to/dir/' . $file, $strData)) { 
     break; 
    } 
} while ($dirHandle && ($file = readdir($dirHandle)) !== false); 

closedir($dirHandle); 
+0

'closedir' est certainement le chemin à parcourir, mais si je le mets dans le 'while', seul le premier fichier est récupéré. Si je le mets après le 'while' tous les fichiers sont récupérés et le script s'arrête. Si vous pouviez éditer votre réponse pour l'intégrer, je l'accepterai. Merci beaucoup. – OSdave

+0

donc votre butting en dehors de la boucle le résout? Cependant, si vous devez faire la même chose avec une autre approche, vous pouvez compter le fichier et si l'index est égal au nombre, fermez le répertoire; – hassan

+0

oui, 'closedir' en dehors de la boucle fonctionne pour moi, juste ce dont j'avais besoin :) – OSdave