[[IT知识]] PHP实现高效分段下载技术,速度提升不是梦!

[复制链接]
查看: 34|回复: 0
发表于 2025-2-3 09:10:01 | 显示全部楼层 | 阅读模式
易博V9下载

PHP实现高效分段下载技术,速度提升不是梦!

php实现分段下载。

  1. <?php
  2. $url = 'https://www.phpernote.com/image/shop.zip';
  3. $st = time();
  4. download($url, 3);
  5. //file_put_contents('./file1', file_get_contents($url));
  6. $et = time();
  7. echo $et - $st;
  8. /
  9. * 获取文件大小
  10. * @param $url
  11. * @return mixed|string
  12. */
  13. function getFileSize($url) {
  14. $ch = curl_init();
  15. $headerData = [
  16. "Range: bytes=0-1"
  17. ];
  18. curl_setopt($ch, CURLOPT_HTTPHEADER, $headerData);
  19. //curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "HEAD");
  20. curl_setopt($ch, CURLOPT_URL, $url);
  21. curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); // return don't print
  22. curl_setopt($ch, CURLOPT_TIMEOUT, 0);
  23. curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/4.0 (compatible; MSIE 5.01; Windows NT 5.0)');
  24. curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1); // 302 redirect
  25. curl_setopt($ch, CURLOPT_MAXREDIRS, 7);
  26. curl_setopt($ch, CURLOPT_HEADER, true);//需要获取header头
  27. curl_setopt($ch, CURLOPT_NOBODY, 1); //不需要body,只需要获取header头的文件大小
  28. $sContent = curl_exec($ch);
  29. // 获得响应结果里的:头大小
  30. $headerSize = curl_getinfo($ch, CURLINFO_HEADER_SIZE);//获取header头大小
  31. // 根据头大小去获取头信息内容
  32. $header = substr($sContent, 0, $headerSize);//获取真实的header头
  33. curl_close($ch);
  34. $headerArr = explode("\r\n", $header);
  35. foreach ($headerArr as $item) {
  36. $value = explode(':', $item);
  37. if ($value[0] == 'Content-Range') {//通过分段,获取到文件大小
  38. $fileSize = explode('/', $value[1])[1];//文件大小
  39. break;
  40. }
  41. }
  42. return $fileSize;
  43. }
  44. /
  45. * 下载文件
  46. * @param $url
  47. * @param int $process_num 线程数
  48. */
  49. function download($url, $process_num = 5) {
  50. $fileSize = getFileSize($url);
  51. //开启多线程下载
  52. $mh = curl_multi_init();
  53. $handle = [];//n线程数组
  54. $data = [];//数据分段数组
  55. $fileData = ceil($fileSize / $process_num);
  56. for ($i = 0; $i < $process_num; $i++) {
  57. $ch = curl_init();
  58. //判断是否读取数量大于剩余数量
  59. if ($fileData >; ($fileSize - ($i * $fileData))) {
  60. $headerData = [
  61. "Range:bytes=" . $i * $fileData . "-" . ($fileSize)
  62. ];
  63. } else {
  64. $headerData = [
  65. "Range:bytes=" . $i * $fileData . "-" . (($i + 1) * $fileData)
  66. ];
  67. }
  68. //echo PHP_EOL;
  69. curl_setopt($ch, CURLOPT_URL, $url);
  70. curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); // return don't print
  71. curl_setopt($ch, CURLOPT_TIMEOUT, 0);
  72. curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/4.0 (compatible; MSIE 5.01; Windows NT 5.0)');
  73. curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1); // 302 redirect
  74. curl_setopt($ch, CURLOPT_HTTPHEADER, $headerData);
  75. curl_setopt($ch, CURLOPT_MAXREDIRS, 7);
  76. curl_multi_add_handle($mh, $ch); // 把 curl resource 放进 multi curl handler 里
  77. $handle[$i] = $ch;
  78. }
  79. $active = null;
  80. do {
  81. //同时执行多线程,直到全部完成或超时
  82. $mrc = curl_multi_exec($mh, $active);
  83. } while ($active);
  84. for ($i = 0; $i < $process_num; $i++) {
  85. $data[$i] = curl_multi_getcontent($handle[$i]);
  86. curl_multi_remove_handle($mh, $handle[$i]);
  87. }
  88. curl_multi_close($mh);
  89. $file = implode('', $data);//组合成一个文件
  90. file_put_contents('./file', $file);
  91. }
复制代码

PHP实现高效分段下载技术,速度提升不是梦!

php实现分段下载。

  1. <?php
  2. $url = 'https://www.phpernote.com/image/shop.zip';
  3. $st = time();
  4. download($url, 3);
  5. //file_put_contents('./file1', file_get_contents($url));
  6. $et = time();
  7. echo $et - $st;
  8. /
  9. * 获取文件大小
  10. * @param $url
  11. * @return mixed|string
  12. */
  13. function getFileSize($url) {
  14. $ch = curl_init();
  15. $headerData = [
  16. "Range: bytes=0-1"
  17. ];
  18. curl_setopt($ch, CURLOPT_HTTPHEADER, $headerData);
  19. //curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "HEAD");
  20. curl_setopt($ch, CURLOPT_URL, $url);
  21. curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); // return don't print
  22. curl_setopt($ch, CURLOPT_TIMEOUT, 0);
  23. curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/4.0 (compatible; MSIE 5.01; Windows NT 5.0)');
  24. curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1); // 302 redirect
  25. curl_setopt($ch, CURLOPT_MAXREDIRS, 7);
  26. curl_setopt($ch, CURLOPT_HEADER, true);//需要获取header头
  27. curl_setopt($ch, CURLOPT_NOBODY, 1); //不需要body,只需要获取header头的文件大小
  28. $sContent = curl_exec($ch);
  29. // 获得响应结果里的:头大小
  30. $headerSize = curl_getinfo($ch, CURLINFO_HEADER_SIZE);//获取header头大小
  31. // 根据头大小去获取头信息内容
  32. $header = substr($sContent, 0, $headerSize);//获取真实的header头
  33. curl_close($ch);
  34. $headerArr = explode("\r\n", $header);
  35. foreach ($headerArr as $item) {
  36. $value = explode(':', $item);
  37. if ($value[0] == 'Content-Range') {//通过分段,获取到文件大小
  38. $fileSize = explode('/', $value[1])[1];//文件大小
  39. break;
  40. }
  41. }
  42. return $fileSize;
  43. }
  44. /
  45. * <strong>下载文件</strong>
  46. * @param $url
  47. * @param int $process_num 线程数
  48. */
  49. function download($url, $process_num = 5) {
  50. $fileSize = getFileSize($url);
  51. //开启多线程下载
  52. $mh = curl_multi_init();
  53. $handle = [];//n线程数组
  54. $data = [];//数据分段数组
  55. $fileData = ceil($fileSize / $process_num);
  56. for ($i = 0; $i < $process_num; $i++) {
  57. $ch = curl_init();
  58. //判断是否读取数量大于剩余数量
  59. if ($fileData >; ($fileSize - ($i * $fileData))) {
  60. $headerData = [
  61. "Range:bytes=" . $i * $fileData . "-" . ($fileSize)
  62. ];
  63. } else {
  64. $headerData = [
  65. "Range:bytes=" . $i * $fileData . "-" . (($i + 1) * $fileData)
  66. ];
  67. }
  68. //echo PHP_EOL;
  69. curl_setopt($ch, CURLOPT_URL, $url);
  70. curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); // return don't print
  71. curl_setopt($ch, CURLOPT_TIMEOUT, 0);
  72. curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/4.0 (compatible; MSIE 5.01; Windows NT 5.0)');
  73. curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1); // 302 redirect
  74. curl_setopt($ch, CURLOPT_HTTPHEADER, $headerData);
  75. curl_setopt($ch, CURLOPT_MAXREDIRS, 7);
  76. curl_multi_add_handle($mh, $ch); // 把 curl resource 放进 multi curl handler 里
  77. $handle[$i] = $ch;
  78. }
  79. $active = null;
  80. do {
  81. //同时执行多线程,直到全部完成或超时
  82. $mrc = curl_multi_exec($mh, $active);
  83. } while ($active);
  84. for ($i = 0; $i < $process_num; $i++) {
  85. $data[$i] = curl_multi_getcontent($handle[$i]);
  86. curl_multi_remove_handle($mh, $handle[$i]);
  87. }
  88. curl_multi_close($mh);
  89. $file = implode('', $data);//组合成一个文件
  90. file_put_contents('./file', $file);
  91. }
复制代码
易博软件介绍
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

1、请认真发帖,禁止回复纯表情,纯数字等无意义的内容!帖子内容不要太简单!
2、提倡文明上网,净化网络环境!抵制低俗不良违法有害信息。
3、如果你对主帖作者的帖子不屑一顾的话,请勿回帖。谢谢合作!
3、问答求助区发帖求助后,如有其他用户热心帮您解决问题后,请自觉点击设为最佳答案按钮。

 
 
QQ在线客服
QQ技术支持
工作时间:
8:00-18:00
软著登字:
1361266号
官方微信扫一扫
weixin

QQ|小黑屋|Archiver|慈众营销 ( 粤ICP备15049986号 )|网站地图

自动发帖软件 | 自动发帖器 | 营销推广软件 | 网络营销工具 | 网络营销软件 | 网站推广工具 | 网络推广软件 | 网络推广工具 | 网页推广软件 | 信息发布软件 | 网站推广工具 | 网页推广软件

Powered by Discuz! X3.4   © 2012-2020 Comsenz Inc.  慈众科技 - Collect from 深圳吉宝泰佛文化有限公司 公司地址:罗湖区黄贝街道深南东路集浩大厦A1403

返回顶部 返回列表