7

我有一个大文件(200 MB 以上)。我需要通过 PHP cron 作业传输它。使用Phpseclib给出以下错误:

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

有没有办法我可以做到这一点PHP cron job

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

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

附言。这需要在文件夹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);
4

3 回答 3

2

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

我认为您可能遇到了旧错误“SSH2:不根据窗口大小计算数据长度”。您很可能正在使用旧版本的 Phpseclib(即使与相对较新的软件(例如 Magento 1.9.*)也捆绑了旧的故障版本)

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

于 2016-07-14T01:36:09.937 回答
1

代替看到您正在使用的代码,我的猜测是您正在尝试将 200mb 文件作为字符串加载,并且您正在尝试将其作为字符串上传。例如。$sftp->put('filename.remote', file_get_contents('filename.local'));. 如果是这样,那么试试这个:

$sftp->put('filename.remote', 'filename.local', NET_SFTP_LOCAL_FILE);
于 2016-07-06T14:52:15.493 回答
0

这实际上在 phpseclib 版本 >= 2.0.5 时有所改变。您应该包含 namespace use phpseclib\Net\SFTP;,然后执行以下操作:

$sftp->put('filename.remote', 'filename.local', SFTP::SOURCE_LOCAL_FILE);
于 2017-06-01T09:57:06.740 回答