扫码关注官方订阅号
php如何上传大文件,配置里好像最大设置成8M,我想知道对于一个几百M的文件如何上传(不使用专门的客户端软件),好像是要分片什么的,有知道具体如何做的吗
学习是最好的投资!
服务器端Apache/Nginx是支持断点续传的,客户端cURL也是支持断点续传的.浏览器默认支持下载断点续传,可以用jQuery-File-Upload实现分块上传和断点续传,服务器则用PHP实现接收.https://github.com/blueimp/jQuery-File-Upload/wiki/Chunked-file-uploads#resuming-file-uploadshttps://github.com/blueimp/jQuery-File-Upload/blob/master/server/php/UploadHandler.php为了避免大文件上传阻塞PHP服务,可以单独开一个用于上传的PHP-FPM进程池,利用PHP-FPM提供的池的隔离性,分离计算密集和I/O密集(上传)操作,可以减少阻塞对整个PHP应用的影响.
后续补充说明:
info.php <?php if( isset($_POST['submit']) ) { header('Content-Type: text/plain; charset=utf-8'); //chmod 777 uploads move_uploaded_file($_FILES['upload_file']['tmp_name'], 'uploads/'.$_FILES['upload_file']['name']); print_r($_FILES['upload_file']); exit(); } else { header('Content-Type: text/html; charset=utf-8'); } ?> <!DOCTYPE HTML> <html> <head> <meta charset="utf-8"> <title>PHP文件上传测试</title> </head> <body> <!-- enctype="multipart/form-data" 以二进制格式POST传输数据 --> <form action="<?php echo pathinfo(__FILE__)['basename']; ?>" method="POST" enctype="multipart/form-data"> <p>文件1 <input type="file" name="upload_file" /></p> <p><input type="submit" name="submit" value="提交" /></p> </form> </body> </html>
Nginx和PHP-FPM的工作进程都只开1个.以2KB每秒上传图片:
time trickle -s -u 2 curl \ -F "action=info.php" \ -F "upload_file=@linux.jpeg;type=image/jpeg" \ -F "submit=提交" \ http://www.example.com/app/info.php sudo netstat -antp|egrep "curl|nginx|fpm"
发现只有nginx和curl处于ESTABLISHED状态,nginx和fpm都没有被阻塞.
top -p 4075 可见Nginx单线程. sudo strace -p 4075 可见Nginx调用recvfrom接收数据并且pwrite保存数据. sudo strace -p 13751 可见PHP-FPM是在Nginx接收完成用户上传的数据时才获取数据.
既然如此,我上面设想的另开FPM进程池处理上传操作的用处就不是太大了.在文件上传过程中PHP-FPM并不会被阻塞,因为Nginx接收完上传的内容后才一次性交给PHP-FPM.附:以2KB每秒下载图片
time trickle -s -d 2 \ wget http://www.example.com/app/uploads/linux.jpeg -O /dev/null
使用第三方的断点续传控件(activex 控件)
比如 Xproer.HttpUploader5,类似 QQ 邮箱的超大附件
或者使用 SWFUpload ,据说最大支持到2G左右
php配置文件是可以改成比较大的,不过上传的东西比较大不做断点续传,实际在用的时候很难受的,经常断了只能重新传, https://github.com/blueimp/jQuery-File-Upload
微信扫码关注PHP中文网服务号
QQ扫码加入技术交流群
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号
PHP学习
技术支持
返回顶部
服务器端Apache/Nginx是支持断点续传的,客户端cURL也是支持断点续传的.
浏览器默认支持下载断点续传,可以用jQuery-File-Upload实现分块上传和断点续传,服务器则用PHP实现接收.
https://github.com/blueimp/jQuery-File-Upload/wiki/Chunked-file-uploads#resuming-file-uploads
https://github.com/blueimp/jQuery-File-Upload/blob/master/server/php/UploadHandler.php
为了避免大文件上传阻塞PHP服务,可以单独开一个用于上传的PHP-FPM进程池,利用PHP-FPM提供的池的隔离性,分离计算密集和I/O密集(上传)操作,可以减少阻塞对整个PHP应用的影响.
后续补充说明:
Nginx和PHP-FPM的工作进程都只开1个.
以2KB每秒上传图片:
发现只有nginx和curl处于ESTABLISHED状态,nginx和fpm都没有被阻塞.
既然如此,我上面设想的另开FPM进程池处理上传操作的用处就不是太大了.在文件上传过程中PHP-FPM并不会被阻塞,因为Nginx接收完上传的内容后才一次性交给PHP-FPM.
附:以2KB每秒下载图片
使用第三方的断点续传控件(activex 控件)
比如 Xproer.HttpUploader5,类似 QQ 邮箱的超大附件
或者使用 SWFUpload ,据说最大支持到2G左右
php配置文件是可以改成比较大的,不过上传的东西比较大不做断点续传,实际在用的时候很难受的,经常断了只能重新传, https://github.com/blueimp/jQuery-File-Upload