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

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

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

POSTはHTTPプロトコルのリクエストメソッドです。ファイルをアップロードしたときや入力フォームが送信されたときなど、クライアントがデータをサーバに送る際に利用されます。

PHP

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

アップロード

アップロードは特定のファイルをウェブサーバに送るプロセスのことを指します。

パフォーマンス

コード効率の向上や計算に関する質問には、このタグを使ってください。

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

Q&A

解決済

3回答

3898閲覧

大容量動画ファイルPOST時のパフォーマンス改善の方法を知りたい

makeneko_1988

総合スコア1

POST

POSTはHTTPプロトコルのリクエストメソッドです。ファイルをアップロードしたときや入力フォームが送信されたときなど、クライアントがデータをサーバに送る際に利用されます。

PHP

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

アップロード

アップロードは特定のファイルをウェブサーバに送るプロセスのことを指します。

パフォーマンス

コード効率の向上や計算に関する質問には、このタグを使ってください。

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

0グッド

1クリップ

投稿2021/06/08 16:08

初めて質問をします。

現在phpにて大容量のファイルアップロードと、アップロードしたファイルのgoogle driveへの連携機能を作成しています。

アップロードするファイルのサイズは最大700MBを想定しています。
このとき、クライアントからデータをPOSTする際にかなり時間を要してしまうのでこれを高速化したく思っております。

現在以下のように普通にユーザー指定のファイルをPOSTするようにしていますがこれを高速化する方法ありますでしょうか?
リクエストヘッダーを見る限りgzipが指定されていますが、contens-lengthを見る限りサイズはあまり変わっていないように見えます。

html

1 <form action="./index.php" method="post" id="form-index" enctype="multipart/form-data"> 2 <div class="form-group"> 3 <label class="control-label">動画ファイル 4 <span class="badge badge-danger">必須</span> 5 </label> 6 <div class="col-auto"> 7 <div class="form-row"> 8 <div class="form-check"> 9 <input class="form-control movie_file" type="file" name="movie_file"> 10 <div class="invalid-feedback"></div> 11 </div> 12 </div> 13 </div> 14 </div> 15 </form> 16

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

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

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

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

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

hentaiman

2021/06/08 18:04

漠然と何か方法はないかという事なら何も対策はありません 原因次第では改善方法はあります 何が原因だとお考えでしょうか?
m.ts10806

2021/06/08 22:35

テキストファイルでない限りはzipにしたところでサイズは変わりません。
makeneko_1988

2021/06/08 23:15

henaimanさん ご質問ありがとうございます。 動画のファイルサイズが大きいのが一番の原因だと考えております。 このような大容量のファイルを扱う場合のお作法的なものなどを知りたいです。 次点では通信環境やPOST先のサーバーのスペックなども関係はあるのかと考えております。 gzipのようなクライアント側で情報を圧縮などしてパフォーマンスが向上できないか?と考えております。
makeneko_1988

2021/06/08 23:16

m.ts10806 ご返信ありがとうございます。 gzipはテキストだけなんですね。 無知でした。ご指摘ありがとうございます。
m.ts10806

2021/06/08 23:48

>gzipはテキストだけなんですね。 もしかしたらこちらの書き方が悪かったかもしれませんが、画像やファイルなどは既に圧縮されてるので、圧縮されないという意味です。
hiok

2021/06/08 23:57

私もやったことはなく、少し気になったので調べたのですが、php post 分割 とかでググったらそれらしき情報はあるようです。試されました?
makeneko_1988

2021/06/09 01:26

hiokさん ご質問ありがとうございます。 試してはいないのですが、ネットワークを通る情報自体は変わらず、分割するコストと、 php側で分割した情報を再結合するコストを鑑みると変わらないか遅くなると考え一旦除外しています。 一度にpost可能なファイルサイズに制限があったり、同時に複数の大容量のリクエストを捌くような場合に、並行処理するのに向いているのかなと思いました。 こちらでの皆さんのご意見参考にしつつ試そうと思います。
hentaiman

2021/06/09 02:34

という事はつまり回線が弱いという事が原因ですね? そうなると対策はありません 自身でも理解されている通り分割したところで回線速度が上がる訳ではないので無駄です
makeneko_1988

2021/06/09 03:35

hentaimanさん 度々のコメントありがとうございます。 回線が弱いということを前提として、ブラウザ側でそれを補う手段があるかということを探しておりました。 私が知らないだけで、経験者的にはお決まりのテクニックがあると思い質問させていただきましたが、みなさまから回答をいただき私の結論に不足はなかったと判断しました。 ありがとうございます。
m.ts10806

2021/06/09 04:04

言語やフレームワークも万能ではないです。かかるものはかかる。 それを見せ方で(言い方は悪いが)誤魔化してる点も少なからずあります。 ローディングやスケルトンスクリーンなども誤魔化しスキルのうちですね。負荷が軽くなったわけではなく、ユーザー感覚を和らげるためのもの。
guest

回答3

0

ベストアンサー

一般的な動画や画像ファイルは最初から圧縮されているので転送時に
ファイルを効率化することは難しいでしょう
ネット回線およびサーバー側の処理能力の問題なので
クライアント側でできることはほぼありません
例えば分割して並行してアップロードするとしても回線がボトルネック
になればアップロード時間は理論的にはさほど変わらないはずです

分割してfetch

//send.html

javascript

1<script> 2window.addEventListener('DOMContentLoaded', ()=>{ 3 document.querySelector('#btn').addEventListener('click',e=>{ 4 e.preventDefault(); 5 const file=document.querySelector('#file'); 6 const url=file.form.getAttribute("action"); 7 const content = file.files[0]; 8 const blob=new Blob([content],{type:file.type}); 9 const fr = new FileReader(); 10 const sep_num=8;//好きなだけ分割してください 11 const fd=new FormData(); 12 fr.addEventListener('load',e=>{ 13 let src=e.target.result; 14 src=new Uint8Array(src); 15 src=String.fromCharCode.apply("",src); 16 const sep_size=parseInt(src.length/sep_num)+1; 17 new Array(sep_num).fill(null).forEach((_,x)=>{ 18 const sep_file=src.substr(x*sep_size,sep_size); 19 const buffer = new Uint8Array(sep_file.length).map((_,x)=>sep_file.charCodeAt(x)); 20 const blob2 = new Blob([buffer.buffer], {type: content.type}); 21 fd.append(file.getAttribute('name')+"[]",blob2,content.name); 22 }); 23 fetch(url,{method:"post",body:fd}).then(res=>res.blob()).then(console.log); 24 }); 25 fr.readAsArrayBuffer(blob); 26 }); 27}); 28</script> 29<form action="recv.php" method="post" enctype="multipart/form-data"> 30<input type="file" id="file" name="myfile"> 31<input type="button" value="fetch" id="btn"> 32<input type="submit" value="send"> 33</form>

// recv.php

PHP

1<?PHP 2if(count($_FILES)==0 or !isset($_FILES["myfile"])){ 3 print "no data"; 4}elseif(count($_FILES["myfile"]["tmp_name"])==1){ 5 header("Content-Type:".$_FILES["myfile"]["type"]); 6 readfile($_FILES["myfile"]["tmp_name"]); 7 exit; 8}else{ 9 header("Content-Type:".$_FILES["myfile"]["type"][0]); 10 foreach($_FILES["myfile"]["tmp_name"] as $val){ 11 readfile($val); 12 } 13 exit; 14}

投稿2021/06/09 00:15

編集2021/06/09 04:03
yambejp

総合スコア116724

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

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

makeneko_1988

2021/06/09 01:31

ご回答ありがとうございます。 やはり端末スペックに依存するので難しいですよね。 分割は他の方のご質問にも回答していますが、同じ認識です。 今は私一人がデータ送信をして検証していますが、これが一般ユーザが同時に処理命令を出した場合などに分割や役立つのかなとは思っています。
yambejp

2021/06/09 04:03

参考までに分割アップロードの仕方を追記しておきました。 受け側で合体させる必要がありますので受け側の処理も書いてあります
makeneko_1988

2021/06/09 06:45

参考URLまでありがとうございます。 サーバーを共有サーバーから専用サーバーのにして、回線を強くして検証進める予定ですが、 その中で不可分散の必要性が出てきましたら参考にさせていただきます。
hentaiman

2021/06/09 07:03

帯域制限されているかどうか分からない共用サーバー使ってる今の時点こそパラレルアップロードを試すタイミングだと思いますが 専用サーバーにした時点で帯域制限をするのはサーバーの所有者に限られるので、速度面を気にしてパラレルを試す意味がありません
guest

0

同期で送信してるなら非同期とか。
負荷は変わりませんが、ユーザ側への「いまサーバが頑張ってるな」感は与えにくくなると思います。

投稿2021/06/09 00:39

m.ts10806

総合スコア80875

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

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

makeneko_1988

2021/06/09 01:29

ご回答ありがとうございます。 現状は同期で送っています。非同期でも負荷が変わらないとのことですが、参考にさせていただきます。
m.ts10806

2021/06/09 01:34

払拭したい懸念事項は何かという点です。 ファイルが圧縮できない以上、またネットワーク環境やマシンスペックはユーザーに依存する以上、システム側で出来るのは「頑張ってる感」を見せないことかなと。 「ちゃんと動いてる感」を演出するためにローディングバーを出したりしますが、考え方は同じです。 (ただ、非同期でも送信途中に接続切ったりブラウザ閉じたりすると動作保証はできないと思います)
makeneko_1988

2021/06/09 02:35

>「ちゃんと動いてる感」を演出するためにローディングバー こちらはすでに実施しており、ちゃんと動いてる感は出せているのですが、 そもそもとしてファイルサイズが大きすぎるのと、共用のレンタルサーバーなのでスペックの部分の問題もあり、15分程度アップロードに時間がかかってしまっています。 この時間を短縮する方法を模索している状況です。
m.ts10806

2021/06/09 02:41

動機ならローディングも見た目止まってるように思います(どんな実装か知らないけれど) 先にも指摘されてる通り、システム側で出来ることはありません。どこに同じ負荷をもたせるかという点だけ。 非同期にすればユーザが待機する必要がなくなるだけです。 共有サーバーでの迷惑を懸念されるのでしたらスペックも容量も大きい専用サーバに移るのが最良です。
makeneko_1988

2021/06/09 03:33

度々コメントありがとうございます。 やはりできないということで、サーバ強化する方向で進めたいと思います。 >動機ならローディングも見た目止まってるように思います すみません。進捗ゲージということであれば、それは出していないです。 グルグル回るローディングのgifをpost処理が終わるまでユーザーには出しています。 無知であったらすみません。 >非同期にすればユーザが待機する必要がなくなるだけ ajaxなどの非同期通信でも、サーバーに対してpostを行うので、そのpostが完全に送られるまでは待機が必要だと思っていますが、認識あっていますよね?
m.ts10806

2021/06/09 04:00

あぁgifなら勝手に動いてますね。cssアニメーションかと思ってました
m.ts10806

2021/06/09 04:01

>サーバーに対してpostを行うので、 はい。ご認識のとおりです。 検証は必要と思います。 すぐ切断してもバックグラウンドで処理は継続されるのかとか
makeneko_1988

2021/06/09 06:45

コメントありがとうございます。 やはりそうですよね。参考にさせていただきます。
guest

0

みなさま、ご指導ご鞭撻ありがとうございました。
大容量のファイルのアップロードを行ったことがなく、私が知らないだけで有識者の方が私が調べ切れていない方法で速度改善の方法があると思い質問させていただきました。

やはりサーバ側が強くなければならないということで、共用サーバから専用VPNに切り替えるなどして改善されるか検証していきたいと思います。

投稿2021/06/09 06:48

makeneko_1988

総合スコア1

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問