Рубрики
Uncategorized

Способ реализации загрузки больших файлов PHP по частям

Автор оригинала: David Wong.

I. Предисловие

При разработке веб-сайтов часто возникает необходимость в загрузке файлов. Некоторые файлы слишком велики для прямой загрузки, что часто приводит к тому, что процесс загрузки занимает много времени, требует большого объема ресурсов пропускной способности, поэтому загрузка происходит по частям.

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

II. Проблемы, возникающие в процессе разработки

  1. Насколько велик размер каждого среза при нарезке? “413 запрос сущности слишком велик”
  2. При загрузке фрагментов они не загружаются строго в соответствии с серийным номером фрагментов. Как определить, что все фрагменты загружены успешно?
  3. При синтезе документа, как вы решаете обеспечить, чтобы полный документ был синтезирован без ошибок? При одновременной загрузке нескольких фрагментов чтение и запись файлов без исключительных блокировок могут привести к ошибкам синтеза.

III. Решение проблемы

Когда появилось 413, nginx.conf и php .ini были изменены.

(1) Добавьте client_max_body_size и client_body_buffer_size в nginx

(2) php.ini добавляет post_max_size и upload_max_filesize

Перезагрузите nginx и php-fpm

Логическое расчесывание кода и совместное использование

(1) Сначала получите текущие фрагменты и общее количество фрагментов

(2) Создайте папку для хранения всех фрагментированных и синтезированных файлов

(3) Переменная $done изначально верна, чтобы определить, все ли фрагменты были загружены. При сохранении каждого фрагмента в качестве имени файла используется серийный номер фрагмента, а затем определяется существование всех фрагментированных файлов.

(4) Когда, загрузите все фрагменты от имени завершения, файлы синтеза. _

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

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

Лучше всего установить эксклюзивную блокировку для каждого фрагмента, flock ($in, LOCK_EX), чтобы гарантировать, что никакой другой процесс не будет управлять фрагментом во время чтения или записи фрагмента. Наконец, удалите фрагмент, разорвите связь и снимите эксклюзивную блокировку.

резюме

Выше упоминался метод реализации загрузки файлов HP в сегментах, представленный Xiaobian. Я надеюсь, что это будет полезно для вас. Если у вас есть какие-либо вопросы, пожалуйста, оставьте мне сообщение. Сяобянь ответит вам вовремя.