Загрузка файла HTTP: мониторинг загрузки

Я в ситуации, когда мне приходится выполнять загрузку больших файлов (до 4 ГБ) с веб-сервера: Apache 2.4.4 через HTTP-протокол. Я пробовал несколько подходов, но лучшим решением является использование модуля X-SendFile.

Поскольку я предлагаю индикатор выполнения для загрузки файлов, мне нужна была бы такая же функция для загрузки файлов. Итак, вот мои вопросы:

  • Есть ли способ, в том числе обходной путь, для отслеживания прогресса загрузки файлов?
  • Есть ли способ, в том числе обходной путь, для расчета скорости загрузки файлов?
  • Есть ли лучший способ обеспечить эффективную загрузку файлов с веб-сервера, чем использование модуля X-Sendfile?

Есть ли лучший вариант загрузки файлов в целом, который позволит мне отслеживать ход загрузки файлов? Это может быть клиент (JavaScript) или серверное решение (PHP). Есть ли какой-либо конкретный веб-сервер, который позволяет это?

В настоящее время я использую:

  • Apache 2.4.4
  • Ubuntu

Много раз спасибо.

    2 идеи (не подтверждены):

    Первый:

    Вместо того, чтобы размещать регулярные ссылки на файлы (которые вы хотите загрузить) на своей странице, используйте такие ссылки, как … / dowanload.php, которые могут выглядеть так:

    <?php // download.php file session_start(); // if needed $filename = $_GET['filename']); header( 'Content-type: text/plain' ); // use any MIME you want here header( 'Content-Disposition: attachment; filename="' . htmlspecialchars($filename) . '"' ); header( 'Pragma: no-cache' ); // of course add some error handling $filename = 'c:/php/php.ini'; $handle = fopen($filename, 'rb'); // do not use file_get_contents as you've said files are up to 4GB - so read in chunks while($chunk = fread($handle, 1000)) // chunk size may depend on your filesize { echo $chunk; flush(); // write progress info to the DB, or session variable in order to update progress bar } fclose($handle); ?> 

    Таким образом, вы можете следить за процессом загрузки. Тем временем вы можете записывать информацию о ходе работы в состояние чтения бара DB / session var и update из DB / session var, используя AJAX, конечно, опросив скрипт, который считывает информацию о ходе.

    Это очень упрощено, но я думаю, что он может работать так, как вы хотите.

    Во- вторых:

    Apache 2.4 имеет язык Lua, встроенный в:

    • mod_lua
    • Создание крючков и скриптов с помощью mod_lua

    Бьюсь об заклад, вы можете попытаться написать обработчик LUA Apache, который будет отслеживать вашу загрузку – отправить прогресс в базу данных и обновить индикатор выполнения, используя PHP / AJAX, чтобы получить информацию о ходе работы с БД.

    Аналогично – существуют модули для perl и даже python (но не для победы)

    Я вижу основную проблему в том, что выходное буферирование php + apache может быть размещено в нескольких местах:

    Браузер <= 1 => Apache <= 2 => Обработчик PHP <= 3 => Процесс интерпретации PHP

    Вам нужно управлять первым буфером. Но напрямую с PHP это невозможно.

    Возможные решения:

    1) Вы можете написать собственный мини-демон, основная функция которого будет отправлять только файлы и запускать их на 80 портах 8880, например. И процесс загрузки файлов и мониторинга выходного буфера оттуда. Буфер вывода будет только один, и вы можете управлять им:

    Браузер <= 1 => Процесс интерпретации PHP

    2) Также вы можете взять mod_lua и управлять выходными буферами непосредственно из apache.

    3) Также вы можете взять nginx и управлять выходными буферами nginx, используя встроенный perl (он стабилен)

    4) Попробуйте использовать встроенный веб-сервер PHP и напрямую контролировать буфер вывода php. Я не могу сказать ничего о том, как он стабилен, извините. Но вы можете попробовать. 😉

    Я думаю, что nginx + php + встроенный perl является более стабильным и мощным решением. Но вы можете выбрать и, возможно, использовать другое решение, не входящее в этот список. Я буду следовать этой теме и с интересом ждать вашего окончательного решения.

    Считывание и запись в базу данных через короткие промежутки времени приводит к гибели производительности.

    Я бы предложил использовать сеансы (увеличивая значение отправленных данных в цикле), с которыми вы можете безопасно отключиться совсем другим файлом php, вы можете возвращать данные как JSON, которые могут использоваться функцией javascript / plugin.

    Если вы используете версию php> = 5.4, это может помочь вам http://www.php.net/manual/en/session.upload-progress.php