質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Amazon EC2

Amazon EC2は“Amazon Elastic Compute Cloud”の略称です。Amazon Web Services(AWS)の一部であり、仮想化されたWebサーバーのコンピュータリソースをレンタルできるサービスです。

Laravel 5

Laravel 5は、PHPフレームワークLaravelの最新バージョンで、2014年11月に発表予定です。ディレクトリ構造がが現行版より大幅に変更されるほか、メソッドインジェクションやFormRequestの利用が可能になります。

Q&A

解決済

2回答

7138閲覧

大容量ファイルアップロード時のメモリ使用について

uemon

総合スコア37

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Amazon EC2

Amazon EC2は“Amazon Elastic Compute Cloud”の略称です。Amazon Web Services(AWS)の一部であり、仮想化されたWebサーバーのコンピュータリソースをレンタルできるサービスです。

Laravel 5

Laravel 5は、PHPフレームワークLaravelの最新バージョンで、2014年11月に発表予定です。ディレクトリ構造がが現行版より大幅に変更されるほか、メソッドインジェクションやFormRequestの利用が可能になります。

1グッド

0クリップ

投稿2019/08/16 00:45

EC2+Laravel(PHP)で、大容量ファイル(1G程度)をユーザーがPOSTでアップロードするプログラムを書いています。
EC2のメモリは1Gです。

メモリとアップロードの関係がよくわからないのですが、以下の解釈のどちらが正しいのでしょうか?

####(解釈1)
「1GBのファイルは一旦メモリに載せられるため、複数人が同時にアップロードすると、メモリが足りなくなり、システムが不安定になる。」

####(解釈2)
「1GBのファイルをアップロードしても、PHP側で適切にメモリを処理するため、複数人が同時にアップロードしても、そう簡単にはメモリ不足になることはない。」

 
実際、700MBのファイルをアップロード中に、SSHで、free -m を使ってメモリの推移を見たのですが、
イメージ説明
このように、【Mem:】のところは、どんどん「used」が増えて「free」が減っていくのですが、
【-/+ buffers/cache:】の「free」のところは、810MB付近であまり変化しませんでした。

これは(解釈2)が正しいということになるのでしょうか?

それとも、別の解釈として、今回はアップロードのフロント側に、『Dropzonejs』というAjax型のJSを使用しているため、

####(解釈3)
「本来、解釈1が正しいが、この実験では、Dropzonejsを使用してAjaxで非同期処理がなされているため、解釈2のように、メモリがそれほど使用されないようになっている。」

という解釈3が正しいのでしょうか?

どうぞよろしくお願い致します。

nullbot👍を押しています

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

解釈1が正しいです。PHPでアップロードを処理する場合、いったんPHPがPOSTデータを処理してファイルに書き出す必要がありますので、対応した分だけのメモリが必要になります。

もちろん、S3のアップロードパスを取得して、ブラウザからS3に直接アップロードするような仕組みを作った場合は、PHPは無関係となります。

投稿2019/08/16 00:51

maisumakun

総合スコア145123

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

uemon

2019/08/16 01:09 編集

回答ありがとうございます。 「PHPがPOSTデータを処理してファイルに書き出す必要がある」とのことですが、ファイルに書き出しが終わると、メモリは解放されると思ってよいのでしょうか? すなわち、例えば分割アップロードにした場合、分割単位で「メモリ使用→ファイル書きだし→メモリ解放」が行われるので、メモリ不足になりにくい、と思ってよろしいでしょうか? どうぞよろしくお願い致します。
guest

0

ベストアンサー

*下記の回答は少なくともPHPの中ではの話です。

実装によりますが、基本的に全ての解釈が間違っております。

  • アップロードされたけど、何もしない場合は、メモリを使いません。
  • rename関数のように、直接ファイルを移動する系(原理上、ファイルのパスだけ書き換えるため物理位置は変わらない)の操作の場合もメモリはほとんど使用しません。
  • fopenし、少しずつ読み書きするストリーム系処理もメモリの使用量は少なくなります。
  • 一括で、file_get_contentsをする場合のみ、メモリを大幅に使用します。

メモリ使う例

file_put_contents('test', file_get_contents($_FILES['file']['tmp_name']));

使わない例

rename( $_FILES['file']['tmp_name'], 'test');

メモリ上の処理とストリーム処理について、一旦調べることをお勧めします。

なお、PHPのメモリ使用量は memory_get_peak_usage() で取得できます。

maisumakunさんの回答では

PHPでアップロードを処理する場合

というワードが重要です。(太字で書いてくれている)

投稿2019/08/16 12:52

mikkame

総合スコア5036

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

uemon

2019/08/17 00:34

回答ありがとうございました。ファイルをアップロードした時点では、php.iniのupload_tmp_dirで指定した場所にファイルが保存され、その時点ではメモリは消費しない。それをPHPで移動処理する際に、file_get_contentsのようなPHP関数を使うと、メモリを大量に消費する、という理解であってますでしょうか。
mikkame

2019/08/17 04:39

はい、そういう解釈です
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問