2017-03-20 9 views
0

私は、遠隔地のサーバのルートディレクトリからssh経由でファイルを取得する必要があります。ローカルマシンはphp7を使用しています。私はこのスクリプトを作成しました:ssh2のopendirは決して止まらない

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

これは動作します。つまり、ファイルはフェッチされますが、スクリプトは決して停止しません。

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

をして、ファイルがフェッチされ、スクリプトがその実行の終わりで停止:私は取得するファイルの名前を知っていた場合
は、スクリプトは次のようになり。

phpseclibはコンポーザーを必要とするため使用できません。私はロケールマシンで使用できません。

スクリプトを無限に実行することなくopendir()readdir()に何ができますか?

答えて

1

は、例えば、あなたのfile_put_contents

後にブレークしてみてください:

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

または最善のアプローチとして、あなたは `closedir`は間違いである

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を使用することができます私が 'while 'の中に入れた場合、最初のファイルだけが取得されます。 'while'の後に置くと、すべてのファイルが取得され、スクリプトは停止します。あなたが私がそれを受け入れることを統合するためにあなたの答えを編集することができれば。どうもありがとう。 – OSdave

+0

ループの外側に突き当てておけば解決しますか?しかし、別の方法で同じことをする必要がある場合は、ファイルを数えることができます。インデックスがカウントに等しい場合は、dirを閉じます。 – hassan

+0

ループの外側にある 'closedir'が私にとってはうまくいく、ちょうど私が必要なもの:) – OSdave

関連する問題