通过PHP中的SFTP传输大文件
我有一个大文件(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);
PS 。 这需要在PHP
在/tmp
文件夹中生成该文件后完成,因此传输脚本的时间必须发挥作用。
[编辑]我不打算增加内存限制,因为后面的文件可能更高。 一个解决方案,我可以传输文件的部分(追加模式)或使用一些shell脚本与PHP cron可能是值得的
远程服务器上的文件大小为111.4 MB,而实际文件在本地大得多。
[修复后修改]从版本1.0更改为版本2.0.2后,问题消失我必须修改put的代码
$sftp->put('/Import/coupons/coupons_import.csv', $localFile, $sftp::SOURCE_LOCAL_FILE);
Phpseclib应该可以很好地传输大文件,而无需增加可用内存。
我想你可能会碰到旧的bug“SSH2:不要根据窗口大小计算数据长度”。 您最有可能使用旧版本的Phpseclib(旧版故障版本即使是相对较新的软件也是如此,例如Magento 1.9。*)
检查你的版本,如果不是最新的重新下载它从https://github.com/phpseclib/phpseclib
代替看到你使用我的猜测的代码是,你试图以字符串的形式加载200mb文件,而你试图以字符串的形式上传它。 例如。 $sftp->put('filename.remote', file_get_contents('filename.local'));
。 如果是这样,那么试试这个:
$sftp->put('filename.remote', 'filename.local', NET_SFTP_LOCAL_FILE);
这实际上改变了一点,phpseclib版本> = 2.0.5。 您应该包含use phpseclibNetSFTP;
的命名空间use phpseclibNetSFTP;
,然后做这样的事情:
$sftp->put('filename.remote', 'filename.local', SFTP::SOURCE_LOCAL_FILE);
链接地址: http://www.djcxy.com/p/34947.html
上一篇: Transfer large file via SFTP in PHP
下一篇: Does every Class we create in Delphi need to have destructor?