【问题标题】:PHP script always exceeds memory limit and maximum execution time - phpseclibPHP 脚本总是超过内存限制和最大执行时间 - phpseclib
【发布时间】:2021-06-08 02:35:19
【问题描述】:

我正在使用 phpseclib 连接 sftp 服务器,并使用$sftp->nlist 列出目录。我可以列出所有小目录,但是当列出一个包含超过 8000 个文件的目录时,超出了内存限制。我已经设置了ini_set('memory_limit','128M')ini_set('max_execution_time', '300'); 但无法等待请求的响应。 有没有办法一点一点的恢复这个数组,释放内存? 对不起英语不好

ini_set("display_errors",true);
ini_set('memory_limit', '128M'); 
ini_set('max_execution_time', '300');
set_include_path("/var/www/cremesp.com/_class/API/UnnamedOpenSourceGroup/phpseclib/");
include_once("Net/SFTP.php");

$ftp_server = "*****";
$ftp_username = "*****";
$ftp_password = "*****";
$sftp = new Net_SFTP($ftp_server, *****);
$sftp->login($ftp_username, $ftp_password);

$files_proc = $sftp->nlist("/PROC/");

如我所说,我可以列出其他目录,但是 /PROC 是最大的,大约需要 150 秒才能响应

【问题讨论】:

  • 显示代码...
  • $sftp->nlist 真的需要多长时间?
  • 您尝试过什么来解决问题?这可能是系统之间的网络问题吗?
  • 您确定是nlist 导致了问题吗?不是稍后在脚本中对文件进行一些处理吗? 8000也不算多。我无法想象它会导致nlist 出现问题,除非您的内存限制非常小。
  • 我很确定,因为正如我所说,当列出较小的目录时,反馈是即时的。另外,我可以列出“/PROC”,问题是生产中不可行的延迟

标签: php sftp phpseclib


【解决方案1】:

使用分页扫描目录并列出带有偏移量的文件名:

参考:https://www.php.net/scandir

$limit = 1000;
$offset = 0;

$dir = scandir($path);

for ($i = $offset; $i < $limit; $i++) {
    echo $dir[$i] . "<br />";
}

使用一些分页逻辑来增加偏移量。

您可以将 memory_limit 更新为 0:

ini_set("memory_limit", "-1");
set_time_limit(0);

请参考:PHP - read huge amount of files from directory

上面有使用 RecursiveDirectoryIterator 的答案,这可能会有所帮助

【讨论】:

  • 需要时间的是scandir(或在OP的问题中它的SFTP等价物)。限制打印条目的数量不会对整体执行时间产生太大影响。
  • 我已经用链接更新了答案stackoverflow.com/questions/46489228/…
  • 我不确定它是否有帮助。如果不迭代所有以前的文件,就无法使用迭代器实现分页。因此(如果迭代器被有效实现),当您使用它列出前几个“页面”时可能会有所帮助。但是一旦你想迭代最后几页,你又回到了原来的问题。
  • 更不用说这个问题是关于 SFTP,而不是本地文件。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-01-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多