PHP大文件分片上传的实现方法


Posted in PHP onOctober 28, 2018

一、前言

在网站开发中,经常会有上传文件的需求,有的文件size太大直接上传,经常会导致上传过程中耗时太久,大量占用带宽资源,因此有了分片上传。

分片上传主要是前端将一个较大的文件分成等分的几片,标识当前分片是第几片和总共几片,待所有的分片均上传成功的时候,在后台进行合成文件即可。

二、开发过程中遇到的问题

  1. 分片的时候每片该分多大size?太大会出现“413 request entity too large”
  2. 分片上传的时候并不是严格按照分片的序号顺序上传,如何判断所有的分片均上传成功?
  3. 合成文件的时候如何判断保证合成一个完整的文件而不出错?多个分片同时上传的时候,读写文件没有独占锁的时候会导致合成错误。

三、问题解决

当出现413的时候,修改了 nginx.conf 和php.ini

(1)nginx中添加client_max_body_size和client_body_buffer_size

PHP大文件分片上传的实现方法

(2)php.ini添加post_max_size 和 upload_max_filesize

重启nginx和php-fpm

代码逻辑梳理和分享

    (1)先获取当前分片是第几片以及总共几片

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

 PHP大文件分片上传的实现方法

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

PHP大文件分片上传的实现方法

    (4)当$done===true的时候,代表所有分片上传完成,合成文件。     

PHP大文件分片上传的实现方法

       $target变量代表合成后的文件名,file_exists判断是否已经合成成功,然后追加方式创建打开文件,循环将每个分片内容写入一个文件中。

       在读取每个分片之前先判断当前分片是否存在,是为了防止多个进程执行合成文件代码块的时候导致某个分片已经写入删除,最后导致合成的文件是不完整的,此时需要删除合成的不完整的文件并退出exit当前进程。

       其中每个分片最好设置独占锁,flock($in, LOCK_EX),用来保证读写分片的时候其他进程不会操作该分片。最后删除分片unlink以及释放独占锁。

总结

以上所述是小编给大家介绍的PHP大文件分片上传的实现方法,希望对大家有所帮助,如果大家有任何疑问欢迎给我留言,小编会及时回复大家的!

PHP 相关文章推荐
PHP中的串行化变量和序列化对象
Sep 05 PHP
Mysql的常用命令
Oct 09 PHP
亲密接触PHP之PHP语法学习笔记1
Dec 17 PHP
php 空格,换行,跳格使用说明
Dec 18 PHP
PHP通过正则表达式下载图片到本地的实现代码
Sep 19 PHP
php变量作用域的深入解析
Jun 03 PHP
PHP的Json中文处理解决方案
Sep 29 PHP
php正则表达式基本知识与应用详解【经典教程】
Apr 17 PHP
Yii2框架中使用PHPExcel导出Excel文件的示例
Aug 09 PHP
PHP实现非阻塞模式的方法分析
Jul 26 PHP
PHP如何根据文件头检测文件类型实例代码
Oct 14 PHP
Yii2处理密码加密及验证的方法
May 12 PHP
PHP array_reduce()函数的应用解析
Oct 28 #PHP
php 中phar包的使用教程详解
Oct 26 #PHP
Linux基于php-fpm模式的lamp搭建phpmyadmin的方法
Oct 25 #PHP
phpstudy2018升级MySQL5.5为5.7教程(图文)
Oct 24 #PHP
实例解析php的数据类型
Oct 24 #PHP
网站被恶意镜像怎么办 php一段代码轻松搞定(全面版)
Oct 23 #PHP
PHP中使用mpdf 导出PDF文件的实现方法
Oct 22 #PHP
You might like
php中的观察者模式
2010/03/24 PHP
利用php-cli和任务计划实现刷新token功能的方法
2017/05/03 PHP
PHP实现在windows下配置sendmail并通过mail()函数发送邮件的方法
2017/06/20 PHP
PHP命名空间用法实例分析
2019/09/04 PHP
PHP 文件写入和读取操作实例详解【必看篇】
2019/11/04 PHP
PHP使用gearman进行异步的邮件或短信发送操作详解
2020/02/27 PHP
jQuery LigerUI 使用教程表格篇(1)
2012/01/18 Javascript
探索Emberjs制作一个简单的Todo应用
2012/11/07 Javascript
当滚动条滚动到页面底部自动加载增加内容的js代码
2014/05/13 Javascript
jquery实现简单的轮换出现效果实例
2015/07/23 Javascript
jQuery实现的类似淘宝网站搜索框样式代码分享
2015/08/24 Javascript
javascript实现图片延迟加载方法汇总(三种方法)
2015/08/27 Javascript
Mongoose学习全面理解(推荐)
2017/01/21 Javascript
微信小程序五星评分效果实现代码
2017/04/06 Javascript
详解vue+vueRouter+webpack的简单实例
2017/06/17 Javascript
Vue中的无限加载vue-infinite-loading的方法
2018/04/08 Javascript
JS实现table表格内针对某列内容进行即时搜索筛选功能
2018/05/11 Javascript
详解vuex中action何时完成以及如何正确调用dispatch的思考
2019/01/21 Javascript
JavaScript实现捕获鼠标坐标
2020/04/12 Javascript
python统计字符串中指定字符出现次数的方法
2015/04/04 Python
举例讲解Python程序与系统shell交互的方式
2015/04/09 Python
python 实现上传图片并预览的3种方法(推荐)
2017/07/14 Python
解决nohup执行python程序log文件写入不及时的问题
2019/01/14 Python
Python中注释(多行注释和单行注释)的用法实例
2019/08/28 Python
Python文件操作函数用法实例详解
2019/12/24 Python
Python 从attribute到property详解
2020/03/05 Python
Python实现壁纸下载与轮换
2020/10/19 Python
医院护士的求职信
2014/01/03 职场文书
小学教学随笔感言
2014/02/26 职场文书
旅游市场营销方案
2014/03/09 职场文书
北京故宫导游词
2015/01/31 职场文书
宾馆前台接待岗位职责
2015/04/02 职场文书
地道战观后感500字
2015/06/04 职场文书
go开发alertmanger实现钉钉报警
2021/07/16 Golang
教你使用一行Python代码玩遍童年的小游戏
2021/08/23 Python
Sql Server 行数据的某列值想作为字段列显示的方法
2022/04/20 SQL Server