【问题标题】:opendir on ssh2 never stopsssh2 上的 opendir 永远不会停止
【发布时间】:2017-08-11 20:59:31
【问题描述】:

我需要通过ssh从远程服务器的根目录获取一些文件,本地机器使用php7。我制作了这个脚本:

<?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,因为它需要 composer 并且我不能在本地机器上使用它。

如果不让脚本无限运行,我可以对opendir()readdir() 做什么?

【问题讨论】:

    标签: php php-7 opendir readdir libssh2


    【解决方案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);
    

    【讨论】:

    • closedir 绝对是要走的路,但如果我把它放在while 中,只会获取第一个文件。如果我把它放在while 之后,所有文件都被提取并且脚本停止。如果您可以编辑您的答案以整合,我会接受它。非常感谢。
    • 所以你在循环之外的对接解决了它?但是如果你需要用另一种方法做同样的事情,你可以对文件进行计数,如果索引等于计数,则关闭目录;
    • 是的,循环外的closedir 对我有用,正是我需要的:)
    猜你喜欢
    • 2013-06-17
    • 1970-01-01
    • 2023-04-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多