1

ユーザーが大きなファイルをアップロードできるようにするツールを開発しています(つまり、「サイズは重要ではありません」という意味です)。JavaScriptで実際に「アップロード」を処理するコードの一部を以下に貼り付けました。コード自体は問題なく動作します。約 500 MB のファイルをアップロードしました。15分 つまり、サーバーとしても機能する粗末なコンピューターで。実際のサーバーでは、はるかにうまく機能することを期待しています。

私が求めているのは、パフォーマンスに大きな影響を与える必要のないセキュリティの提案と、パフォーマンスのアップグレードです。私の見方では、サーバーに送信されたデータをエンコード/パックしようとすると、パフォーマンスに大きな影響があります。

もう 1 つの問題は、chunkSize です。ファイルの「スライス」の大きさをプログラマーに選択させました。ただし、制限はサーバーの max_post_size です。デフォルトでは、1024 * 512 バイトに設定されています。

チャンクサイズを大きくすると、アップロードのプロセス全体が高速に動作することに気付きました (無数のテストにより)。理由は明らかです。progress イベントとサーバーとの通信がトリガーされる頻度が低くなります。ただし、プログレス バーの場合、精度が非常に低くなり、アプリケーションがクラッシュしたとユーザーが信じてページを閉じてしまう可能性があります。

だから基本的に私はこれらの2つの質問があります:

1: パフォーマンスに (あまり) 影響を与えずにデータをエンコード/パックする方法

2: ツールの全体的なパフォーマンスを向上させるにはどうすればよいですか?

その間、私は自分でいくつかの研究を行います。

アップロードを処理するコードは次のとおりです。

Uploader.UploadFile = function (file, instance) {
    var fr = new FileReader;
    chunkSize = instance.settings.chunkSize > window.maxPost ? window.maxPost : instance.settings.chunkSize;
    var chunks = Math.ceil(file.size / chunkSize);
    var chunk = 0;
    var startTime = (new Date()).getTime();
    function SendSlice() {
        var start, end;
        start = chunk * chunkSize;
        if (start > file.size) {
            start = end + 1;
        }
        end = start + (chunkSize) >= file.size ? file.size : start + (chunkSize);
        status = chunk == 0 ? "start" : (chunk == chunks ? "end" : "progress");
        if (status == 'start') {
            if(instance.settings.onStartUpload && instance.settings.onStartUpload.call) {
                var event = new Uploader.Event.StartUpload({
                    time : (new Date()).getTime(),
                    file : file,
                    target : instance.element
                });
                instance.settings.onStartUpload(event);
            }
        }
        fr.onload = function(e) {
            var sliceData = e.target.result;
            $.ajax({
                type : "POST",
                url : "uploader.php",
                data : {
                    filename : file.name,
                    path : instance.settings.path,
                    status : status,
                    slice : sliceData
                }
            }).success(function(data) {
                if (++chunk <= chunks) {
                    if(instance.settings.onProgress && instance.settings.onProgress.call) {
                        var event = new Uploader.Event.Progress({
                            time : (new Date()).getTime(),
                            file : file,
                            target : instance.element,
                            pieces: chunks,
                            currentPiece : chunk,
                            percent : (chunk / chunks) * 100,
                            bytesUploaded : end,
                            bytesRemaining : file.size - end
                        });
                        instance.settings.onProgress(event);
                    }
                    SendSlice();
                } else {
                    if(instance.settings.onCompleteFile && instance.settings.onCompleteFile.call) {
                        var time = (new Date()).getTime();
                        var duration = time - startTime;
                        var event = new Uploader.Event.FileComplete({
                            time : time,
                            file : file,
                            target : instance.element,
                            duration : duration
                        });
                        instance.settings.onCompleteFile(event);
                    }
                }
            });
        };
        fr.readAsDataURL(file.slice(start, end));
    }
    SendSlice();
}
4

0 に答える 0