我正在尝试使用 phpseclib 的 sftp 传输大型 zip 文件 put方法。 1 GB 左右以下的文件传输没有任何问题。但是,较大的文件在传输过程中达到 1 GB 标记后很快就会失败。
我收到此 PHP 错误:
"PHP Fatal error: Out of memory (allocated 89653248)
(tried to allocate 3717163274 bytes) in
../lib/phpseclib/Net/SSH2.php on line 1553".
代码:
require_once('phpseclib/Net/SFTP.php');
require_once('phpseclib/Crypt/RSA.php');
$sftp = new Net_SFTP($host);
$key = new Crypt_RSA();
$key->loadKey(file_get_contents($privatekey));
$sftp->login($username, $key);
$sftp->put($remotefile, $localfile, NET_SFTP_LOCAL_FILE);
我的 php.ini 中的 memory_limit 设置为 -1。是否有任何其他 PHP 设置可能导致此限制?或者 phpseclib 库中的任何设置可以提供帮助?
最佳答案
您正在运行超旧版本的 phpseclib。您所指的 1.21/1.46 版本是通过 CVS keyword $Id: $ 填充的而且 phpseclib 已经很多年没有使用 CVS 了。
使用这些版本的 phpseclib 的最后一个发布版本(而不是单个文件提交版本)是 0.2.1,该版本的最后一次提交是在 2010 年 4 月:
https://github.com/phpseclib/phpseclib/blob/0.2.1/phpseclib/Net/SFTP.php#L51
与没有 CVS 关键字 $Id: $
内容的 0.2.2 版本进行对比:
https://github.com/phpseclib/phpseclib/blob/0.2.2/phpseclib/Net/SFTP.php#L48
phpseclib 目前版本为 0.3.7。自 0.2.1 以来已经发布了 6 个版本(0.2.2、0.3.0、0.3.1、0.3.5、0.3.6 和 0.3.7),因此请尝试 upgrading .
关于Phpseclib sftp put 超过 1 GB 的文件内存不足,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23302098/