2017-03-20 13 views
0

나는 먼 서버의 루트 디렉토리에서 ssh를 통해 파일을 가져와야한다. 로컬 컴퓨터는 php7을 사용한다. 이 스크립트를 만들었습니다 :opendir on ssh2 결코 멈추지 않는다

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

을하거나 가장 좋은 방법으로 직접 데이터

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을 사용할 수있다'closedir' 확실히이다 길을 가야하지만, 'while'안에 넣으면 첫 번째 파일 만 가져옵니다. 'while' 후에 모든 파일을 가져 오면 스크립트가 멈 춥니 다. 만약 당신이 내가 그것을 받아 들일 것입니다 통합하기 위해 귀하의 답변을 수정할 수 있습니다. 고마워. – OSdave

+0

루프 외부에 붙어 있어도 해결할 수 있습니까? 그러나 다른 접근법을 사용하여 동일한 작업을 수행해야하는 경우 파일을 계산할 수 있으며 인덱스가 개수와 같으면 dir을 닫습니다. – hassan

+0

네, 루프 바깥 쪽의'closedir'이 나에게 필요한 것입니다. :) – OSdave