Загрузка большого файла PHP по частям

PHP

Введение

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

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

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

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

  1. Когда появится 413, измените nginx.conf и php.ini.
    (1) Добавьте client_max_body_size и client_body_buffer_size в nginx.
    (2) php.ini добавляет post_max_size и upload_max_filesize
  2. перезапустить nginx и php-fpm
  3. Сортировка и совместное использование логики кода
    (1)先获取当前分片是第几片以及总共几片

图片描述

    (2)创建一个文件夹用来存储所有的分片以及合成的文件

图片描述

    (3)变量$done初始为true,用来判断是否所有的分片都上传完成,每个分片保存的时候使用分片序号作为文件名,然后判断所有的分片文件是否存在

图片描述

    (4)当$done===true的时候,代表所有分片上传完成,合成文件。     
       $target变量代表合成后的文件名,file_exists判断是否已经合成成功,然后追加方式创建打开文件,循环将每个分片内容写入一个文件中。
       在读取每个分片之前先判断当前分片是否存在,是为了防止多个进程执行合成文件代码块的时候导致某个分片已经写入删除,最后导致合成的文件是不完整的,此时需要删除合成的不完整的文件并退出exit当前进程。
       其中每个分片最好设置独占锁,flock($in, LOCK_EX),用来保证读写分片的时候其他进程不会操作该分片。最后删除分片unlink以及释放独占锁。

图片描述