2016-06-21 113 views
1

私はストレージ・ファサードを使用してAWS S3バケットにファイルをアップロードしようとしているLaravel 5.2を使用する:PHP S3バケットにアップロードするときにメモリ不足 - Laravel 5.2

$file = Input::file('file'); 

    Storage::put('filename', file_get_contents($file)); 

をしかし、私は取得していますエラーメッセージ:

FatalErrorException in RequestException.php line 107: 
Allowed memory size of 134217728 bytes exhausted (tried to allocate 47696229 bytes) 

ファイルサイズはallowerdメモリサイズの範囲内である、と私はphp.iniで許可されたメモリサイズを増やした場合にかかわらず、それはまだ同じエラーがスローされます。

何が間違っている可能性がありますか?

+0

これをphp.iniに追加する "ini_set( 'memory_limit'、 '-1');"それが動作するかどうかを確認しますか? – error2007s

+0

は関係ありません。ファイルをロードして文字列として渡しています。これは、ENTIREファイルがメモリにロードされていることを意味します。 put()呼び出しの中で何が起こるかに応じて、その文字列の複数のCOPIを作成することもできます。つまり、メモリのオーバーヘッドは、そのファイルのサイズよりもはるかに大きくなります。 –

+0

@ error2007s "ini_set( 'memory_limit'、 '-1');"を追加しました。 php.iniと私のウェブサーバがクラッシュしました。 – TimothyBuktu

答えて

0

最初にやってみたいのは、非常に小さいファイルをアップロードすることです。 100KBとしましょう。次に、1MBのファイル。アプリケーションがクラッシュするまで続きます。

私はあなたがS3にファイルをアップロードするためにLaravelを使用することを好むだろうと知っています。この段階ではアップロードしているファイルサイズに応じて、代わりにs3cmdのようなコマンドラインツールを使用することができます。これの背後にある理由は、あなたが行っているときにウェブスタッキング内のアップロードが便利ではないということです。

1 - 縮尺は変わりません。 1MBのファイルは機能するかもしれませんが、1,00001MBのファイルがアプリケーションをクラッシュさせる可能性があります。

2これは、PHPに大量のメモリを消費させる必要があります。したがって、同じ操作を行う複数の別々のプロセスがWebスタックを停止させ、ダウンタイムを発生させる可能性があります。これをキューとは別の別のプロセスでスピンすることで、システムのスケールアップが可能になります。

3 - Laravelにアップロードを依頼する場合は、CLIが実際のアップロードを行い、Webスタックではないようにします。この場合も、キューを使用します。

一般的なアドバイスとして、天文学の値にメモリの制限を増やしてスクリプトを動作させると、はるかに効果的に行うことができる何か間違ったことが起こりそうです。

+0

提案していただきありがとうございますが、私はスケールについてあまり心配していません。少数のユーザーだけが使用する小さなアプリケーションです。アップロードされるすべてのファイルは、100MBを超えないビデオファイルです。 Storageファサードが機能しているはずなので、何が間違っているのか把握し、回避策を見つけるのではなく修正する必要があります。 – TimothyBuktu

関連する問題