我有一个大文件(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);
答案 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);