如何在Laravel 5.1中通过Storage-ftp上传大文件

时间:2016-06-15 21:07:35

标签: php file laravel ftp storage

我尝试使用Laravel Storage功能将大文件上传到ftp服务器并且它会继续给我一个erorr

  

内存不足(分配473432064)(试图分配467402752字节)

我试图更改php.ini的内存限制,但是当我将文件正常上传到服务器并且其大小达到剂量时,它仍然无法正常工作。

我尝试了一切,但没有任何工作。 再次 - 我试图通过FTP上传。

还有一个问题:有一种方法可以将文件从客户端直接上传到ftp服务器吗?我看到存储首先上传到我的服务器然后转移到第二台服务器...

2 个答案:

答案 0 :(得分:0)

它肯定听起来像一个PHP限制,提高内存限制可能不是最好的方法,但这只会导致麻烦,相信我。

我能想到的最好的方法是使用Envoy(服务器脚本方法而不是部署服务)来组合SSH任务,这样就可以执行你的工作在外面 PHP,因此您不会受到相同的内存限制。您的Envoy脚本(项目根目录中的envoy.blade.php)可能看起来像这样;

@servers(['your_server_name' => 'your.server.ip'])

@task('upload', ['on' => ['your_server_name']])
    // perform your FTP setup, login etc.
    put your_big_file.extension
@endtask

我只是为Jenkins调用的部署工作设置了其中一个,所以我不确定你是否可以从Laravel中启动它,但是我从这样的命令行启动;

vendor/bin/envoy run myJobName

就像我说的那样,我唯一能记住的是,如果你可以在Laravel本身内运行Envoy,并且文档看起来有点朦胧,绝对是一个值得查看的选项:)

https://laravel.com/docs/5.1/envoy

答案 1 :(得分:0)

最后,我使用curl而不是Storage来解决问题。

$ch = curl_init();
$localfile = $file->getRealPath();
$fp = fopen($localfile, 'r');
curl_setopt($ch, CURLOPT_URL, 'ftp://domain/' . $fileName);
curl_setopt($ch, CURLOPT_USERPWD, "user:pass");
curl_setopt($ch, CURLOPT_UPLOAD, 1);
curl_setopt($ch, CURLOPT_INFILE, $fp);
curl_setopt($ch, CURLOPT_INFILESIZE, filesize($localfile));
curl_exec($ch);
$error_no = curl_errno($ch);
curl_close($ch);

工作完美!更好的laravel存储选项。