繁体   English   中英

从 PHP 中的 SFTP 获取最新文件(使用 CURL)

[英]Getting latest file from SFTP in PHP (using CURL)

我有这个功能可以从 SFTP 上的目录中获取文件。 它返回文件夹中的所有文件,但文件时间难以解析。

我想要的是获取最新修改的文​​件。

private function getDirList()
    {
        $ch = curl_init();
        curl_setopt($ch, CURLOPT_URL, $this -> host);
        curl_setopt($ch, CURLOPT_USERPWD, $this -> user . ":" . $this -> pass);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);

        if (curl_exec($ch) === false) {
            echo 'Curl error: ' . curl_error($ch);
            exit();
        }

        curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'LIST');
        $result = trim(curl_exec($ch));
        $files = array();
        foreach (explode("\n", trim($result, "\n")) as $line) {
            $files[] = $line;
        }

        return $files;
    }

我从函数中得到了什么:

Array
(
    [0] => -rw-rw-rw-   1 user     group     4482926 Jan 19 01:30 file1.csv
    [1] => -rw-rw-rw-   1 user     group     4291169 Oct 21 00:33 file2.csv
    [2] => -rw-rw-rw-   1 user     group     4469721 Dec 14 01:30 file3.csv
    [3] => -rw-rw-rw-   1 user     group     4275439 Sep 28 00:30 file4.csv
    [4] => -rw-rw-rw-   1 user     group     4244881 Sep  6  2018 file5.csv
    [5] => -rw-rw-rw-   1 user     group     4310557 Nov  2 01:30 file6.csv
    [6] => -rw-rw-rw-   1 user     group     4310765 Nov  5 01:30 file7.csv
    [7] => -rw-rw-rw-   1 user     group     4245407 Sep 11 00:30 file8.csv
    [8] => -rw-rw-rw-   1 user     group     4198017 Sep  1  2018 file9.csv
    [9] => -rw-rw-rw-   1 user     group     4311228 Nov 10 01:31 file10.csv
...

我可以为每个文件进行调用并获得更好的文件时间吗? 我可以为不同的列表发送不同的自定义请求吗?

考虑使用phpseclib

有了它,您可以使用以下代码:

$sftp = new phpseclib\Net\SFTP($hostname);

$sftp->login($username, $password) or die("Cannot login");

$files = $sftp->rawlist($path);

// filter out folders     
$files_only_callback = function($a) { return ($a["type"] == NET_SFTP_TYPE_REGULAR); };
$files = array_filter($files, $files_only_callback);

// sort by timestamp
usort($files, function($a, $b) { return $b["mtime"] - $a["mtime"]; });
// In PHP 7, you can use spaceship operator instead:
// usort($files, function($a, $b) { return $a["mtime"] <=> $b["mtime"]; }); 

// pick the latest file
$latest = $files[0]["filename"];

phpseclib 不需要任何安装。 只需将源代码包与您的代码一起提取即可。 虽然要加载最新的 phpseclib 2.0,但他们建议使用Composer 如果您不想依赖另一个库进行加载,可以使用以下代码加载 phpseclib:

spl_autoload_register(function ($class) {
    $file = stream_resolve_include_path(
        str_replace('\\', DIRECTORY_SEPARATOR, $class).'.php');
    if ($file !== false) {
        require $file;
        return true;
    }
    return false;
});

$phpseclib_path = "phpseclib";
set_include_path(get_include_path() . PATH_SEPARATOR . $phpseclib_path);

(基于测试文件是否存在于包含路径中的任何位置

只需使用以下选项列出目录名称。

curl_easy_setopt(curl, CURLOPT_DIRLISTONLY, 1L);

使用curl_easy_setopt(curl, CURLOPT_DIRLISTONLY); 到包含所有信息的目录。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM