@armenka29
Программист, бизнесмен

PHP как передавать POST большие файлы быстро?

Нужно закачивать на сайт видео файлы размер ну где то от 500 мб до 2 гб.
Сделана форма с dropzone чтобы передавать файлы с прогрессом
Дак вот, файлы 30 мб, жуть как долго едут. До 10-15 минут
Я даже боюсь пробовать туда пихать гиговые файлы.
В php ini настроил большие значения max upload, max post
Скажите как то можно ускорить загрузку? Или она зависит только от скорости доступа к серверу?
Тоесть тут никак не повлиять?
А то по фтп вроде шустро загружаются, ну не так чтоб шустро но быстрее чем через форму.
  • Вопрос задан
  • 2284 просмотра
Пригласить эксперта
Ответы на вопрос 3
@mantyr
Пишу много Golang кода с удовольствием:)
Что бы не упираться в ограничения:
  • разбивать файл на чанки равной длины
  • загружать чанки параллельно на несколько разных суб.доменов (st1.example.com, st2.example.com ... stN.example.com)
  • использовать http2 соединение
  • передавать файлы (и чанки в том числе) в бинарном виде


Если количество входных точек меньше чем количество чанков то на некоторые адреса будет несколько отправлений, желательно не переустанавливать соединение, а держать хотя бы keep-alive, а ещё лучше разобраться как передать данные после текущей отправки в текущее соединение.

Замерять скорость:
  • сети между серверами и клиентом
  • пропускную способность веб-сервера
  • общую нагрузку на сервер
  • io диска куда складываются данные


Возможно есть проблема:
  • со скоростью работы диска, может быть он сбоит и потерял 80% своей скорости
  • с загрузкой канала между сервером и клиентом
  • слишком много запросов к веб-серверу и он просто блокируется постоянно
  • браузер перегружен плагинами или слишком много js кода который убивает отзывчивость


Так же попробуйте отправить файл на другой сервер похожим образом и сравнить.

Более подробно про отправку файла чанками:
sendFile: function(file) {
            if (file.size > this.maxFileSize) {
                this.alert('Файл слишком большой!');
                return false;
            }

            var fd = new FormData();
                  fd.append("file", file);

            // Создаем запрос
            var xhr = new XMLHttpRequest();
            xhr.upload.addEventListener('progress', context({obj: this}, this.uploadProgress), false);
            xhr.onreadystatechange = context({obj: this, html: html}, obj.uploadFinish);
            xhr.open('POST', this.handler);
            xhr.send(fd);
        },


Тут мы видим xhr.send(fd), теперь идём в один из примеров, например https://learn.javascript.ru/xhr-resume и видим вариант с отправкой части файла:
var slice = file.slice(10, 100); // прочитать байты с 10-го по 99-й включительно
xhr.send(slice); // ... и отправить эти байты в запросе.


Если у вас получится сделать механизм многопоточной загрузки то можете контрибьютить в этот репозитарий: https://github.com/mantyr/js-drag-n-drop-file-uplo... так как он чуть более объектный чем классический dropzone
Ответ написан
Sanasol
@Sanasol Куратор тега PHP
нельзя просто так взять и загуглить ошибку
Причем здесь максимальный размер загружаемого и скорость загрузки...

Это от вашего интернета зависит.
Ну и хоста конечно, хотя там минимум 100мб, поэтому упирается не в его скорость явно.
Ответ написан
Комментировать
skobkin
@skobkin
Гентушник, разработчик на PHP и Symfony.
Загружать файлы не через PHP, а, например, через mod_upload в Nginx.
Это всё, само собой не исключает необходимости проверить скорость сети и прочие советы, которые вам написали рядом. Разве что разбивать на чанки файлы я бы стал в последнюю очередь.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы