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

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

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

Apacheは、Apache HTTP Serverの略で、最も人気の高いWebサーバソフトウェアの一つです。安定性が高いオープンソースソフトウェアとして商用サイトから自宅サーバまで、多くのプラットフォーム向けに開発・配布されています。サーバーソフトウェアの不具合(NCSA httpd)を修正するパッチ(a patch)を集積、一つ独立したソフトウェアとして開発されました。

XHR

XHR(別名XMLHttpRequest)はJavaScriptなどのスクリプト言語を使ってサーバーとHTTP通信を行うAPIを指します。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

Q&A

解決済

4回答

2401閲覧

低速回線の xhr でファイルを送れません

Ungaahhhh

総合スコア10

Apache

Apacheは、Apache HTTP Serverの略で、最も人気の高いWebサーバソフトウェアの一つです。安定性が高いオープンソースソフトウェアとして商用サイトから自宅サーバまで、多くのプラットフォーム向けに開発・配布されています。サーバーソフトウェアの不具合(NCSA httpd)を修正するパッチ(a patch)を集積、一つ独立したソフトウェアとして開発されました。

XHR

XHR(別名XMLHttpRequest)はJavaScriptなどのスクリプト言語を使ってサーバーとHTTP通信を行うAPIを指します。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

0グッド

3クリップ

投稿2019/08/06 23:51

編集2019/08/20 06:05

前提・実現したいこと

JavaScript で xhr を用いて PHP に向けてファイルをアップロードしています。
普通の回線ではファイルが届くのですが、低速回線にすると failed になってしまいます。
PHP側ではファイルサイズ[0]など空の情報が届いています。
ファイルサイズとも相関しているようで、軽いファイルは送れたりします。

こういったケースでファイルを届けるには、分割するしかないのでしょうか。
一般のサービスなどでは時間がかかるものの、1本の通信で送れているように見受けられます。
また、フロント・サーバーともにタイムアウトしているかも知れませんが、こちらはまだ調べきれてません。

低速回線でも失敗せずに xhr でファイルを送信できるようにするには、どういったアプローチがありますか?

※4.46MのPDFに対して200kbpsと設定すると、25秒ぐらいでfailedになります。

発生している問題・エラーメッセージ

xhr が failed readyState は 1 → 4 となってしまい 2 になりません。

該当のソースコード

<html lang="ja"> <head> <meta charset="utf-8" /> <script type="text/javascript"> function upload() { let typeFileInput = document.getElementById("typeFile"); let file = typeFileInput.files[0]; let formdata = new FormData(); formdata.append("input", file); let xmlhttp = new XMLHttpRequest(); xmlhttp.onreadystatechange = function() { console.log("readyState", xmlhttp.readyState); console.log("responseText", xmlhttp.responseText); console.log(xmlhttp.status, xmlhttp.statusText); }; xmlhttp.open("POST", "test.php", true); xmlhttp.send(formdata); } </script> </head> <body> <div> <input id="typeFile" type="file" /> <button type="button" onclick="upload()">upload</button> </div> </body> </html>
<html lang="ja"> <head> <meta charset="utf-8" /> </head> <body> <form action="test.php" method="POST" enctype="multipart/form-data"> <input id="typeFile" name="input" type="file" /> <input type="submit" value="submit" /> </form> </body> </html>

試したこと

PHP 使用メモリを上げる
FormData をやめる
Apache の conf にて以下を設定

SSLSessionCacheTimeout 300000 Timeout 300000

max_input_time 60 → 60000 に
4.46M 200kbps は 26秒程度で failed
4.46M 2400kbps なら 成功
パケットキャプチャを覗いてみる

補足情報

すべて Docker によるローカル環境(Apache)
低速回線の検証は Chrome の開発者ツールを利用
PHPはログを出力するだけ
パケットキャプチャによると、ファイルを送る POST 自体が届かずにサーバーから RST が送られ failed となっていました

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

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

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

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

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

x_x

2019/08/07 01:14

時間はどのくらいかかるのでしょうか? また、max_input_time の設定はどうなっていますか?
Ungaahhhh

2019/08/07 05:45 編集

max_input_time 60 だったので 60000 にしてみましたが、結果は変わらずです。 同じく 25秒 程度で failed になりました。 -1 にしても同じでした。
guest

回答4

0

自己解決

Apache の conf に RequestReadTimeout を適宜設定してやることで接続を持続することができました。

投稿2019/09/19 06:40

Ungaahhhh

総合スコア10

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

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

Ungaahhhh

2019/10/03 03:16

Apache 2.4.39 固有のバグで RequestReadTimeout の初期値がおかしくなっていたそうです。 Apache 2.4.41 以降は直ってるらしいです。
guest

0

パケットキャプチャによると、ファイルを送る POST 自体が(サーバに)届かずに(、クライアントから見ると)サーバーから RST が送られ failed となっていました

もしも上記のような現象なのであれば、クライアントとサーバの間にプロバイダの透過プロキシが居て、そこで通信がタイムアウトしているような気配がします。サーバ側をちゃんとSSL/TLS化してあげると遅い回線でもこの現象は起こらなくなる or 少なくともPOSTがサーバに届くようになると思います。

投稿2019/08/20 11:18

YouheiSakurai

総合スコア6142

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

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

Ungaahhhh

2019/08/21 05:39

Docker なので プロバイダは間に挟んでないとは思いますが、似たようなものがある気はしています。 もちろん、外界の疑似テストですのでその可能性は十分にあり得ますね。
guest

0

PHP側での処理時間がわからないとなんとも言えませんがTimeout 300000っていうのは長すぎかと(5000時間)
もう少し短い時間で指定してみてください。

投稿2019/08/17 00:20

編集2019/08/17 00:32
kyoya0819

総合スコア10429

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

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

Ungaahhhh

2019/08/19 06:02

900 で試してみましたが、待たされる時間も変わらずダメでした。
guest

0

普通のformでpostしてエラーがでるか確認してください
またfetchでもだめでしょうか?

投稿2019/08/07 00:07

yambejp

総合スコア114814

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

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

Ungaahhhh

2019/08/07 05:21

普通の form にしたところ、遷移にしばらく時間がかかり「このサイトにアクセスできません」となってしまいました。 fetch は後で試してみます。
Ungaahhhh

2019/09/17 03:03

ごめんなさい fetch は採用できないらしいので諦めました。
yambejp

2019/09/17 03:06

httpのアップロードで時間制限でセッションがきれてしまう状況なら ftpなど別のプロトコルを検討べきかもしれません
Ungaahhhh

2019/09/18 06:17

今気づいたのですが、巷のサービスは http2 なのかも知れないので、そもそも条件が違いますね。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問