请问如何高效率下载 API 中的 2000 万 张图片?一张一张下载要下载 2-3月以上!
public function handle()
{
///API中有大约 2000万张图片
/// 需要下载到服务里面
$url = 'https://www.x.com';
//API数据结构
[
'total'=>200000000000000,
'img'=>[
'1'=>'https://www.x.com/1.png',
'2'=>'https://www.x.com/2.png',
'3'=>'https://www.x.com/3.png'
]
];
//获取的全部循环次数以及图片地址
$response = Http::get($url);
for ($i=0;$i<$response->json()['total'];$i++){
//请求图片真是地址返回对象结果
$img= Http::get($response->json()['img'][$i]);
//进行图片下载并且返回图片保存的随机名字
$imagesName[$i] = Storage::disk('public')->put('images',$img);
//保存到数据库
Pic::create($imagesName[$i]);
}
如果只是按照以上的写法一张一张下载保存,我粗略的计算下需要下载2-3月差不多能下载完成;服务器16核,24G内存!请问下如何能更快的下载完成?
如果启用多次每次都是从第一张开始循环,也是没有用的!
php artisan down:img
希望大家给我指条明路 -如果方便的话可以附上代码 在此先谢谢了!
关于 LearnKu
多进程
可以搜一下 guzzle多线程。有很多例子。
多进程
每个下载都生成一个任务扔队列里,队列设置多点线程
用swoole或go的协程不香吗 :joy:
这种 io 操作就别用 php 了,用 node 什么的快的多。
swoole 协程下载图片
类似需求我之前做过,是用的 go 写个脚本开协程去下载,速度嗖嗖的
swoole ,
七牛云,镜像存储,然后get_headers,七牛云会帮你自动下载
python 也可以,比较香
拿移动硬盘去拷估计比较快 :joy:
用 laravel 写可以把具体操作图片的代码放到队列里去,然后循环分发任务,队列多开几个进程,其实很简单,耗时任务都是这么玩的,完全不需要 swoole node.js go,一个小功能,没必要小题大做
第一步 查询接口数据 将下载图片任务写入队列 第二步 服务器开多个执行队列进程
用迅雷不香吗?
人生苦短,不如python
用laravel 多个 job 下载