Что может ограничить мой максимальный размер загружаемого файла в стеке RASPBRE Pi LAMP?

491
Eric F

Итак, у меня есть веб-сервер LAMP, размещенный на Raspberry Pi 3. К Raspberry Pi подключен RAID 10 через аппаратный контроллер RAID. Моя цель - иметь возможность загружать большие файлы через мою веб-страницу с помощью PHP через установку стека LAMP на Raspberry Pi.

Я могу успешно загрузить файл размером 0,97 ГБ, но не 1,32 ГБ, поэтому я должен предположить, что размер загружаемого файла должен быть примерно 1 ГБ.

В php.ini у меня есть следующий набор прямо сейчас:

  • memory_limit: 1000 м
  • post_max_size: 4G
  • upload_max_filesize: 4G
  • upload_tmp_dir: /mnt/raid10/Files/Temp(Это на подключенном RAID, так что это не просто дамп файла на SD - карту, что Raspberry Pi использует Обратите внимание, что добавление этого. Сделало помощь до размера макс от прежде, чем ниже на.)

Я не могу понять, какие другие настройки я должен попытаться настроить, и я открыт для любых предложений.

2
Какой веб-сервер вы используете для размещения сайта? Это также может иметь максимальный размер файла. Worthwelle 5 лет назад 0
Pi3 имеет 1 ГБ физической памяти на борту. Я предполагаю, что это ограничивающий фактор. davidgo 5 лет назад 0
Попробуйте перезапустить Apache с помощью `sudo service apache2 restart`. Возможно, он еще не получил изменения из php.ini. [Это] (http://httpd.apache.org/docs/1.3/mod/core.html#limitrequestbody) - единственная ссылка на конкретную конфигурацию Apache, которую я вижу, но она довольно устарела. Worthwelle 5 лет назад 0
Вы пытаетесь загрузить локально, и сколько времени это занимает? Другая возможность заключается в том, что вы используете неисполненное время max_execution. davidgo 5 лет назад 1
@davidgo https://superuser.com/questions/1351721/cannot-upload-files-larger-than-1gb-in-php-under-apache-even-with-post-max-size/1351727?noredirect=1# comment2026741_1351727 Согласно ответу, кажется, что ограничение памяти не должно влиять на размер загрузки, так как это прямой поток. Я думал то же самое, поэтому я отправил это первоначально. Позвольте мне попробовать увеличить время max_execution, хотя Eric F 5 лет назад 0
@EricF Я только что прочитал больше на эту тему, и собирался указать на https://stackoverflow.com/questions/6777624/configuring-apache-for-large-uploads, который показывает способ обработки файлов в PHP, не сталкиваясь с ограничение памяти - я полагаю, что стандартный механизм загрузки пытается удержать все это в памяти. davidgo 5 лет назад 0
max_execution time = 200000 (я полагаю, это секунды?) Eric F 5 лет назад 0
Загляните на https://www.plupload.com/ - я никогда не сталкивался с вашей проблемой, не использовал ее, но, кажется, это рекламируется как решение (то есть решение проблемы размера с помощью «Chunking») davidgo 5 лет назад 0
@Davidgo Это отличная идея, чтобы попробовать. Мой обработчик загрузки выглядит следующим образом: https://github.com/blueimp/jQuery-File-Upload/blob/master/server/php/UploadHandler.php, где размер чанка по умолчанию, по-видимому, установлен равным 10 МБ. Eric F 5 лет назад 0
@davidgo Это работает! что должно означать, что при загрузке он использует / использует память. Я добавил maxChunkSize: 10 * 1024 * 1024 к моей функции #fileupload, и теперь она делает это в соответствующем размере чанка. Если вы хотите записать это как ответ, я приму это, в противном случае я могу в любом случае. Спасибо! Eric F 5 лет назад 0
Спасибо за возможность написать это - вероятно, лучше, если вы сделаете это, так как это было просто образованное предположение с моей стороны, и кажется, что вы на самом деле реализовали решение, так что лучше ответить. davidgo 5 лет назад 0
Это хороший дополнительный вопрос к [вашему другому вопросу] (https://superuser.com/q/1351721/167207)! Для справки: PHP - это язык программирования, а Apache - веб-сервер, который использует PHP в качестве модуля для сценариев. Технически вы используете стек LAMP: Linux, Apache, MySQL и PHP. Да, часть MySQL на самом деле не фактор, а терминология. Вы, кажется, быстро и хотите узнать об этом конкретном материале, поэтому просто сохраняйте стек LAMP в контексте любых проблем, с которыми вы можете столкнуться. JakeGould 5 лет назад 0
Кроме того, просто любопытно, но сколько места на SD-карте вы используете для «upload_tmp_dir»? JakeGould 5 лет назад 0
@JakeGould SD-карта 12 ГБ или около того, но я поместил временный каталог на RAID, который составляет 2 ТБ Eric F 5 лет назад 0

1 ответ на вопрос

2
Eric F

Снятие ограничений на размер загружаемого файла

Для настройки LAMP (Linux, Apache, MySQL, PHP), которая позволяет пользователю загружать большие файлы на свой сервер, необходимо сделать следующее:

Измените следующие переменные в php.ini

  1. memory_limit = 1000M - установить ограничение памяти на то, что доступно в системе
  2. post_max_size= 4G - убедитесь, что это значение больше или равно upload_max_filesizeзначению
  3. upload_max_filesize = 4G - установите это на то, что вы хотите максимум
  4. upload_tmp_dir: /mnt/raid10/Files/Temp- По умолчанию это отключено, что делает временное местоположение на том же диске, где установлена ​​ОС. В моем случае запускать все с Raspberry Pi, что делает его SD-картой. Чтобы иметь меньше ограничений, я установил вместо этого местоположение моего сетевого диска.

После выполнения вышеизложенного ограничение размера загружаемого файла - это физическая память, доступная для устройства, независимо от того, для чего она установлена memory_limit, и ограничения файловой системы (4 ГБ для файловой структуры FAT). В случае моего Raspberry Pi 3 это было 1 ГБ.

Обход ограничения памяти для загрузки файла, превышающего объем доступной памяти

Единственный способ преодолеть ограничение памяти - разделить загрузку. После включения чанкинга во время загрузки происходит следующее:

  1. Загрузка начата на веб-странице.
  2. Данные из исходного файла передаются в память веб-сервера.
  3. Данные сбрасываются из памяти веб-сервера во временное местоположение файла.
  4. Как только временный файл достигает установленного размера порции, эти данные сбрасываются в файл конечного расположения и временный файл удаляется.
  5. Повторите шаг 2, пока файл не будет завершен.

Как использовать чанкинг

Если вы используете обработчик загрузки, похожий на этот ( https://github.com/blueimp/jQuery-File-Upload/blob/master/server/php/UploadHandler.php ), то доступно множество встроенных опций.

В моем случае, когда объявлена ​​#fileupload, я добавил строку для maxChunkSize:

$('#fileupload').fileupload({ maxChunkSize: 10 * 1024 * 1024, // 10 MB <-----This is the line I added add: function (e, data) { blah blah blah } }); } }); 

Какое бы значение здесь ни ставилось, будет использоваться размер чанка. Выбранный вами размер требует небольших экспериментов, так как небольшой размер значительно замедлит скорость загрузки, а слишком большой размер приведет к тому, что пользователь сайта не будет видеть прогресс на своей панели прогресса в течение достаточно долгого времени. Для меня 10МБ было счастливым носителем.

* Обратите внимание, что индикатор выполнения для загрузки будет перемещаться только при запуске каждого чанка, поэтому он становится более изменчивым, чем приятный непрерывный индикатор выполнения, но я на самом деле с этим согласен.

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