如何通过PHP中的SFTP递归列出远程服务器中的所有文件?
opendir
或scandir
仅列出当前文件夹。
答案 0 :(得分:2)
phpseclib library具有内置的递归列表,只需将Net_SFTP.nlist()
与$recursive = true
一起使用:
set_include_path(get_include_path() . PATH_SEPARATOR . 'phpseclib');
require_once("Net/SFTP.php");
$sftp = new Net_SFTP($hostname);
if (!$sftp->login($username, $password))
{
die("Cannot login to the server");
}
if (!($files = $sftp->nlist($path, true)))
{
die("Cannot read directory contents");
}
foreach ($files as $file)
{
echo "$file\n";
}
如果您甚至需要列出文件夹名称(以便捕获空文件夹),则必须重新实现nlist
的作用:
function nlist_with_folders($sftp, $dir)
{
$files = $sftp->rawlist($dir);
if ($files === false)
{
$result = false;
}
else
{
$result = array();
foreach ($files as $name => $attrs)
{
if (($name != ".") && ($name != ".."))
{
$path = "$dir/$name";
$result[] = $path;
if ($attrs["type"] == NET_SFTP_TYPE_DIRECTORY)
{
$sub_files = nlist_with_folders($sftp, $path);
$result = array_merge($result, $sub_files);
}
}
}
}
return $result;
}
phpseclib不需要任何安装,也没有任何强制性的依赖关系。这是一个“纯PHP” 代码。您只需下载包含PHP代码的归档文件,然后将其解压缩到Web服务器(或者,如果您没有Shell访问Web服务器的权限,则将其本地提取并上传提取的代码)。在我的示例中,我将其提取到phpseclib
子文件夹中。