@FastClick
Я человек, а ты? :)

Как ускорить процесс загрузки файлов в PHP?

Использую следующий код для загрузки файлов:

<form action="file-upload.php" method="post" enctype="multipart/form-data">
  Файлы:<br />
  <input name="userfile[]" type="file" /><br />
  <input name="userfile[]" type="file" /><br />
  <input type="submit" value="Отправить" />
</form>


Загрузка 10 Мб выполняется за 40 секунд, что довольно много. В то же облако Яндекс, Мэл.ру загрузка происходит почти моментально.

Код в файле file-upload.php выполняется очень быстро, менее, чем за несколько секунд, но вот дело именно в загрузке файлом после нажатия на кнопку Отправить. Как можно ускорить загрузку файлов? Скорость канала на сервере — 200 Мбит/с, на клиенте — 300 Мбит/с. Пинг от клиента до сервера 20-30.
  • Вопрос задан
  • 365 просмотров
Решения вопроса 2
ThunderCat
@ThunderCat Куратор тега PHP
{PHP, MySql, HTML, JS, CSS} developer
Скорость канала на сервере — 200 Мбит/с
Вангую что это скорость на выход, на вход будет совершенно другая скорость, не указанная в рекламном буклете, или написанная где-то под звездочкой оооочень мелким шрифтом.
Есть вероятность что в вебсервере стоит ограничение на скорость загрузки на клиента, но это можно выяснить и через просмотр конфигов, если таковые доступны.

Что делать?
1) Пнуть провайдера и спросить про скорость аплоуда.
2) Если молчат - проверить самостоятельно, например замерить скорость загрузки файла курлом.
3) Проверить загрузку через фтп/сфтп
4) Много думать, ругаться с провайдером
5) Профит
Ответ написан
Комментировать
@DooX
Очень интересно. Кто то бы написал что-то плохое. Но я помню себя так лет 5 назад так что!

по физике php и судя по тому что я вижу html ты отправляешь сразу несколько файлов. а может быть у тебя ещё репитер стоит и ты шлешь больше двух. Но ты делаешь один канал связи и шлешь в порядки очереди эти файлы пока они загрузятся все форма висит. ТАк как php не асинхронный.
1. это не как не решить, просто визуально js показывай что файлы грузятся.
2. Используй ajax и отправляешь при клике в цикле каждый файл отдельно но не ожидая загрузки первого а сразу открываешь несколько соиденений с сервером и грузишь (сокращая время загрузки на 30-60%) просто они идут параллельно. так делают и на майле и яндексе ит д и т п.
2.1. А можно вообще намутить так:
создаешь на сервере ендпоинт допустим pre_upload.php
Повесить евент на input file как только он изменился ты делаешь сразу загрузку асинхронно на сервер вызывая pre_upload.php , pre_upload.php вернет тебе то что ты там настроишь, допустим загрузку во временную папку и возврат эксклюзивное имя файла.
Пока идет загрузка файла ты на фронте делаешь анимацию загрузки и как промис вернул положительным ты в input hidden записываешь имя файла.

тем самым юзер видит что что то происходит и может в форме сразу же выбрать несколько файлов. в момент нажатия загрузить ты по факту ничего не грузишь а тупо отправляешь на file-upload.php массив из имен файлов
там скрипт проверяет папку временной загрузки находит эти файлы и перемещает на постоянное место.

что в итоге мы получаем? Юзер видит какие то либо действия, и в момент нажатия кнопки отправить по факту уже все загружено и складывается впечатление что прошли секунды.

если Юзер передумал грузить какой то либо файл он нажал удалить файл и ты опять удаляешь из временой папки файл.
3. На сервере настрой keep-alive.
4. upload_max_filesize и post_max_size для пыхи
5. gzip

Так же ещё сервисы большие юзают CDN, если понимаешь принцип то тут ясно почему у них кажется что быстрее все грузится.
Удачи в покорении вершин!
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
zkrvndm
@zkrvndm
Архитектор решений
Попробуй отправить файл в составе JSON, в base64 кодировке, вдруг быстрее будет.
Ответ написан
Ваш ответ на вопрос

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

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