Я в ситуации, когда мне приходится выполнять загрузку больших файлов (до 4 ГБ) с веб-сервера: Apache 2.4.4 через HTTP-протокол. Я пробовал несколько подходов, но лучшим решением является использование модуля X-SendFile.
Поскольку я предлагаю индикатор выполнения для загрузки файлов, мне нужна была бы такая же функция для загрузки файлов. Итак, вот мои вопросы:
Есть ли лучший вариант загрузки файлов в целом, который позволит мне отслеживать ход загрузки файлов? Это может быть клиент (JavaScript) или серверное решение (PHP). Есть ли какой-либо конкретный веб-сервер, который позволяет это?
В настоящее время я использую:
Много раз спасибо.
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, встроенный в:
Бьюсь об заклад, вы можете попытаться написать обработчик 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