在PHP中通过SFTP传输大文件

时间:2016-07-05 13:51:24

标签: php cron sftp phpseclib net-sftp

我有一个大文件(200 MB以上)。我需要通过PHP cron job转移它。使用Phpseclib会出现以下错误:

  

允许的内存大小为134217728字节耗尽(尝试分配   4133字节)/app/vendor/phpseclib/phpseclib/phpseclib/Net/SSH2.php

我可以使用PHP cron job执行此操作吗?

代码很简单,其中$ localFile是一个已经存在的CSV文件

$sftp->put('/Import/coupons/coupons_import_test.csv', $localFile, NET_SFTP_LOCAL_FILE);

PS 即可。这需要在PHP/tmp文件夹中生成该文件后完成,因此转移脚本的时间必须发挥作用。

[编辑] 我不打算增加内存限制,因为以后的文件可能会更大。我可以部分传输文件(附加模式)或使用PHP cron的一些shell脚本的解决方案是值得的

远程服务器上的文件大小为111.4 MB,而本地的实际文件大得多。

[修复后编辑] 从版本1.0更改为2.0.2版后,该问题消失了 我不得不修改put的代码

$sftp->put('/Import/coupons/coupons_import.csv', $localFile, $sftp::SOURCE_LOCAL_FILE);

3 个答案:

答案 0 :(得分:2)

Phpseclib应该可以很好地传输大文件,而无需增加可用内存。

我认为你可能遇到了旧的错误" SSH2:不计算数据长度与窗口大小"。你最有可能使用较旧版本的Phpseclib(即使使用相对较新的软件,例如Magento 1.9,也会捆绑旧版本。*)

如果不是最新版本,请检查您的版本https://github.com/phpseclib/phpseclib

答案 1 :(得分:1)

代替看到你正在使用我的猜测的代码是你正在尝试将200mb文件作为字符串加载,并且你试图将其作为字符串上传。例如。 C:\Users\Maddy\Desktop\PublicServer\skill_tests>npm install gulp -g npm WARN deprecated graceful-fs@3.0.8: graceful-fs v3.0.0 and before will fail on node releases >= v7.0. Please update to graceful-fs@^4.0.0 as soon as possible. Use 'npm ls graceful-fs' to find it in the tree. npm WARN deprecated minimatch@2.0.10: Please update to minimatch 3.0.2 or higher to avoid a RegExp DoS issue npm WARN deprecated minimatch@0.2.14: Please update to minimatch 3.0.2 or higher to avoid a RegExp DoS issue npm WARN deprecated lodash@1.0.2: lodash@<3.0.0 is no longer maintained. Upgrade to lodash@^4.0.0. npm WARN deprecated graceful-fs@1.2.3: graceful-fs v3.0.0 and before will fail on node releases >= v7.0. Please update to graceful-fs@^4.0.0 as soon as possible. Use 'npm ls graceful-fs' to find it in the tree. 。如果是这样,那么试试这个:

$sftp->put('filename.remote', file_get_contents('filename.local'));

答案 2 :(得分:0)

这实际上改变了一点,phpseclib版本&gt; = 2.0.5。您应该包含命名空间use phpseclib\Net\SFTP;,然后执行以下操作:

$sftp->put('filename.remote', 'filename.local', SFTP::SOURCE_LOCAL_FILE);