采集的文章远程图片路径本地化存储解决方案-站群软件采用的图片下载方案附代码
2024-10-30 11:25:42文章站群
摘要:详细介绍文章站群系统内采集的远程图片如何分布式方案及代码
以站群系统的文章来源出发,讲解下mysql采集到的远程图片如何实现本地化存储的所有流程。技术代码分享给大家:
1、我们弄来的文章图片的字段刚开始是存放的远程的,我们先启动一个定时检测脚本来检查。
文章站群代码:dingshi_chk_img_news.php和dingshi_chk_img_news.sh 这两个文件,
启动的时候开启一个screen专门开启这个脚本。下面我们分析下他的核心原理:
getMessage()); } echo "===========【定时检测采集图片本地化】 现在时间:".date('Y-m-d H:i:s')." ===============\n"; $sql0=mysql_query("select * from tb_sites order by id asc",$conn); while($info0=mysql_fetch_array($sql0)){ $site_id=$info0['id']; $site_name=$info0['site_name']; $img_pre=$info0['img_pre']; echo "\n正在检查[".$site_id."]【".$site_name."】下数据。\n"; /*检测新数据 开始*/ $arr_send=array();//准备数据集合 $news_last_id=0; if($ssdb->get('news_last_id_'.$site_id)!='') $news_last_id=$ssdb->get('news_last_id_'.$site_id); echo "\n【news_last_id:".$news_last_id."】\n"; $sql=mysql_query("select count(*) as total from s".$site_id."_news where id >'".$news_last_id."' and (imgs like '%bing%')",$conn); $info=mysql_fetch_array($sql); $total=$info['total']; echo $total; if($total==0){ $news_last_id=0; echo "\n从头开始检测\n"; }else{ $sql=mysql_query("select * from s".$site_id."_news where id >'".$news_last_id."' and (imgs like '%bing%') order by id asc limit 0,10",$conn); while($info=mysql_fetch_array($sql)){ $arr_row=array(); $id=$info["id"]; $news_last_id=$id; $title=$info["title"]; $imgs=$info["imgs"]; echo '准备处理['.$catid.']【'.$id.'】['.$title.']'; echo "\n"; echo 'imgs:['.$imgs.']'; echo "\n"; echo "--------------------------------------"; echo "\n"; $arr_row['id']=$id; $arr_row['title']=$title; $arr_row['imgs']=$imgs; $arr_row['site_id']=$site_id; $arr_row['cms']='cms3'; $arr_send[]=$arr_row; } } $ssdb->set('news_last_id_'.$site_id,$news_last_id); /*获取本地处理的所有ids集合*/ $num=count($arr_send); if($num>0){ /*按每份5个均分,一份一份的发送*/ $arr2=array_chunk($arr_send,5); foreach ($arr2 as $v) { $ser=serialize($v); /*send msg start*/ $shujubao=$ser; $data=array( 'shujubao'=> $shujubao ); $xiancheng=sjs_xiancheng(); switch ($xiancheng) { case '0': $queue_name='img_news'; break; default: $queue_name='img_news'; break; } $cdn_url=$img_pre; echo $cdn_url.'/aaa_sh/aaa_'.$queue_name.'.php'; $ch = curl_init(); curl_setopt($ch,CURLOPT_URL,$cdn_url.'/aaa_sh/aaa_'.$queue_name.'.php'); curl_setopt($ch,CURLOPT_TIMEOUT,0); curl_setopt($ch,CURLOPT_RETURNTRANSFER,1); curl_setopt($ch,CURLOPT_HEADER,0); curl_setopt($ch,CURLOPT_CONNECTTIMEOUT,15); curl_setopt($ch, CURLOPT_POST, 1); // 发送一个常规的Post请求 curl_setopt($ch, CURLOPT_POSTFIELDS, $data); // Post提交的数据包 $result = curl_exec($ch); // 执行操作 echo '【'.$result.'】'; echo "\n\r"; /*send msg end*/ } } } function sjs_xiancheng($length=1) { // $chars = '0123456'; $chars = '0'; $str = ''; for($i=0;$i<$length;$i++){ $str .= $chars[mt_rand(0,strlen($chars)-1)]; } return $str; } ?>
这个脚本会以一种巡查的方式去检测所有的未本地化的文章,一次检查20条,然后记录一个id,轮完一轮再从id1开始,如果发现有未本地化数据则发送数据至专门的图片服务器进程去下载
我们的站群的图片存储目前采用阿里云单独的一台vps进行存储,
下面说下图片下载程序接收的程序代码:
核心接收处理下载图片并回传sql至文章站群系统的代码如下:
getMessage()); } $qname='img_news'; $qsize=$ssdb->qsize($qname); if($qsize==0) return; echo "待处理任务:【".$qsize.'】'; echo "\n"; $num_chuli=20;//每次处理的个数 if($qsize<$num_chuli) $num_chuli=$qsize; $arr_qrange=$ssdb->qrange($qname,0,$num_chuli); // print_r($arr_qrange); if(count($arr_qrange)>0){ if($ssdb->qtrim_front($qname,$num_chuli)){ // echo 'qtrim_front ok'; } foreach ($arr_qrange as $key => $data) { echo "\n\r".date('Y-m-d H:i:s')." Recevie 【img_news】 Command...\n\r"; $arr_data=unserialize($data); foreach ($arr_data as $key => $value) { /*循环每一条数据 开始*/ $cms=$value['cms']; $site_id=$value['site_id']; $id=$value['id']; $title=$value['title']; $imgs=$value['imgs']; $arr_xin=array(); $arr_small_images=explode('|', $imgs); foreach ($arr_small_images as $url_row) { $url_row=trim($url_row); if($url_row!=''){ $arr222=explode('?', $url_row); $arr_xin[]=$arr222[0]; } } $small_images=implode('|', $arr_xin); echo "正在下载[".$site_id."][".$id."][".$title."]的图片数据\n"; $arr_urls2=array();////远程图片2 $arr_small_images=explode('|', $small_images); foreach ($arr_small_images as $url_row) { if(trim($url_row)!='') $arr_urls2[]=trim($url_row); } $arr_urls2_ok=array();//未来替换2 $sj_dir=sjs0(2); $dir=PICDIR.'/'.$site_id.'/'.date('Y-m-d').'/'.$sj_dir.'/'; // 下载多图片 开始 if(count($arr_urls2)>0){ foreach ($arr_urls2 as $pic_url_web) { /*开始下载每一个图片*/ echo "\n***********************\n"; echo $pic_url_web; echo "\n"; if(strpos($pic_url_web, 'bing')===false){ echo $pic_url_web.'已经采集过,不做任何处理'; echo "\n"; $arr_urls2_ok[]=$pic_url_web; }else{ $arr_path=explode('/', $pic_url_web); $k_last=count($arr_path)-1; $file_name=$arr_path[$k_last]; // echo "\n"; // echo '旧文件:'.$file_name; // echo "\n"; $wenjianming=md5($file_name); $houzhui='jpg'; $new_file_name=md5($wenjianming).'.'.$houzhui; // echo '新文件:'.$new_file_name; // echo "、"; // echo "\n***********************\n"; $arr_res=getFile($pic_url_web,$dir,$new_file_name,1);//保存 if(isset($arr_res['error']) && $arr_res['error']==0){ echo "下载:【".$arr_res['file_name']."】成功!".";"; $arr_urls2_ok[]='/uploads/imagecdn3/'.$site_id.'/'.date('Y-m-d').'/'.$sj_dir.'/'.$new_file_name; } } } } // 下载多图片 结束 // print_r($arr_urls_ok); // echo "\n"; // print_r($arr_urls2_ok); // echo "\n"; $arr_sql=array(); if(count($arr_urls2_ok)>0){ $small_images_new=implode('|', $arr_urls2_ok); $arr_sql[]="imgs='".$small_images_new."'"; } // print_r($arr_sql); if(count($arr_sql)>0){ $sql=implode(',', $arr_sql); // echo $sql; $data_send=array( 'site_id'=>$site_id, 'id'=>$id, 'title'=>$title, 'sql'=>$sql, ); $ser=serialize($data_send); /*send msg start*/ $shujubao=$ser; $data=array( 'shujubao'=> $shujubao ); $queue_name='sql_news'; $ch = curl_init(); curl_setopt($ch,CURLOPT_URL,$back_url.'/aaa_sh/aaa_'.$queue_name.'.php'); curl_setopt($ch,CURLOPT_TIMEOUT,0); curl_setopt($ch,CURLOPT_RETURNTRANSFER,1); curl_setopt($ch,CURLOPT_HEADER,0); curl_setopt($ch,CURLOPT_CONNECTTIMEOUT,15); curl_setopt($ch, CURLOPT_POST, 1); // 发送一个常规的Post请求 curl_setopt($ch, CURLOPT_POSTFIELDS, $data); // Post提交的数据包 $result = curl_exec($ch); // 执行操作 echo '【'.$result.'】'; echo "\n\r"; /*send msg end*/ } echo "\n\r--------------------------\n\r"; /*循环每一条数据 结束*/ } echo "\n\r--------------------------\n\r"; echo "----------------------------------------------------------------\n\r"; } } $qsize=$ssdb->qsize($qname); echo "待处理任务剩余:【".$qsize.'】'; echo "\n"; /*下载文件到本地*/ function getFile($url,$save_dir='',$filename='',$type=0){ if(trim($url)==''){ return array('file_name'=>'','save_path'=>'','error'=>1); } if(trim($save_dir)==''){ $save_dir='./'; } if(trim($filename)==''){//保存文件名 $ext=strrchr($url,'.'); if($ext!='.gif' && $ext!='.jpg' && $ext!='.png' && $ext!='.css' && $ext!='.js'){ return array('file_name'=>'','save_path'=>'','error'=>3); } $filename=time().$ext; } if(0!==strrpos($save_dir,'/')){ $save_dir.='/'; } //创建保存目录 if(!file_exists($save_dir)&&!mkdir($save_dir,0777,true)){ return array('file_name'=>'','save_path'=>'','error'=>5); } //获取远程文件所采用的方法 if($type){ $ch = curl_init(); $ip = '116.179.32.197'; // 百度蜘蛛 $timeout = 10; curl_setopt($ch,CURLOPT_URL,$url); curl_setopt($ch,CURLOPT_TIMEOUT,0); //伪造百度蜘蛛IP curl_setopt($ch,CURLOPT_HTTPHEADER,array('X-FORWARDED-FOR:'.$ip.'','CLIENT-IP:'.$ip.'')); //伪造百度蜘蛛头部 curl_setopt($ch,CURLOPT_USERAGENT,"Mozilla/5.0 (compatible; Baiduspider/2.0; +http://www.baidu.com/search/spider.html)"); curl_setopt($ch,CURLOPT_RETURNTRANSFER,1); curl_setopt($ch,CURLOPT_HEADER,0); curl_setopt($ch,CURLOPT_CONNECTTIMEOUT,$timeout); $img = curl_exec($ch); }else{ ob_start(); readfile($url); $img=ob_get_contents(); ob_end_clean(); } //$size=strlen($img); //文件大小 $fp2=@fopen($save_dir.$filename,'w'); fwrite($fp2,$img); fclose($fp2); unset($img,$url); return array('file_name'=>$filename,'save_path'=>$save_dir.$filename,'error'=>0); } function sjs0($length=6) { $chars = '123456789'; $str = ''; for($i=0;$i<$length;$i++){ $str .= $chars[mt_rand(0,strlen($chars)-1)]; } return $str; } ?>
站群系统的文章更新图片字段的时候时间字段也会更新,然后站群的缓存机制是根据这个时间也会进行局部缓存更新。
有此疑惑的小伙伴,请联系客服,我们会为您详细讲解代码的运行原理。