php - 在 PHP 中从 SFTP 获取最新文件(使用 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);
推荐阅读
- cmd - 在 cmd 中显示带有子文件夹、文件和大小的文件夹属性
- python - 使用 numpy、matplotlib 检查坐标是否重叠
- javascript - 从 fetch 请求中提取数据并将其导出
- python - 使用网格在 tkinter 框架内放置标签
- python-3.x - 关于 PySpark 中 window(),partitionBy().orderby() 的输出
- pine-script - Pine 脚本中的线条渐变
- javascript - Javascript 验证与 PHP 验证冲突?
- python-3.x - 在 Streamit 上部署时,DataVisualization 在 python 中无法正常工作
- python - math.remainder() 和 % 运算符的不同结果
- ios - 在 SwiftUI 中获取中文本地化的年龄