当前位置:   article > 正文

thinkphp5 正则采集远程图片并生成缩略图;Image::open 处理图片失败的情况_tp5生成图片失败

tp5生成图片失败

场景复现:对采集的图片进行压缩处理出现失败的情况,跟踪打印 image::open无返回值

采集流程:数据库提前录入产品的外部链接,正则匹配图片地址,获取到图片的url,通过curl下载到本地,再进行处理。

  1. //定时任务:定时采集有赞图片
  2. public function timing_get_goods_img(){
  3. $get_img = Db::name('goods')->field('goods_id,out_link')->where('out_link',"<>",'')->order('goods_id asc')->limit(1)->find();
  4. $result = trimall(file_get_contents($get_img['out_link']));
  5. $json = preg_match_all("/buyer_id(.*)null}}/",$result,$match);
  6. $str = '{"'.$match[0][0];
  7. $goods_info = json_decode($str,true);
  8. $goods_picture = $goods_info['goodsData']['goods']['pictures'];
  9. if(havedata($goods_picture)){
  10. $slide_img = [];
  11. foreach($goods_picture as $key=>$item){
  12. $url = $item['url'];
  13. $dir = ROOT_PATH . 'public'.DS .'uploads'.DS .'product/'.date("Ymd",time()).'/';
  14. $file_name = time().rand(10000,99999).getRandNumber().strrchr($url,'.');
  15. $download_effect = getImage($url,$dir,$file_name);
  16. if($download_effect['error'] == 0){
  17. $image = \think\Image::open($dir.$download_effect['file_name']);
  18. $image->thumb(500, 500,\think\Image:: THUMB_SCALING)->save($dir.$download_effect['file_name']);
  19. $slide_img[] = date('Ymd',time()).'/'.$download_effect['file_name'];
  20. }
  21. }
  22. //处理图片
  23. $update_data = [
  24. 'goods_img' => $slide_img[0],
  25. 'slide_img' => implode(",", $slide_img),
  26. 'out_link' => ''
  27. ];
  28. $effect = Db::name("goods")->where('goods_id',$get_img['goods_id'])->update($update_data);
  29. }
  30. }

公共函数:getImage,trimall,getRandNumber,havedata

  1. function getRandNumber($start=0,$end=9,$length=8){
  2. //初始化变量为0
  3. $connt = 0;
  4. //建一个新数组
  5. $temp = array();
  6. while($connt < $length){
  7. //在一定范围内随机生成一个数放入数组中
  8. $temp[] = mt_rand($start, $end);
  9. //$data = array_unique($temp);
  10. //去除数组中的重复值用了“翻翻法”,就是用array_flip()把数组的key和value交换两次。这种做法比用 array_unique() 快得多。
  11. $data = array_flip(array_flip($temp));
  12. //将数组的数量存入变量count中
  13. $connt = count($data);
  14. }
  15. //为数组赋予新的键名
  16. shuffle($data);
  17. //数组转字符串
  18. $str=implode(",", $data);
  19. //替换掉逗号
  20. $number=str_replace(',', '', $str);
  21. return $number;
  22. }
  23. //删除空格
  24. function trimall($str){
  25. $oldchar=array(" "," ","\t","\n","\r");
  26. $newchar=array("","","","","");
  27. return str_replace($oldchar,$newchar,$str);
  28. }
  29. //获取远程图片
  30. function getImage($url,$save_dir='',$filename='',$type=0){
  31. if(trim($url)==''){
  32. return array('file_name'=>'','save_path'=>'','error'=>1);
  33. }
  34. if(trim($save_dir)==''){
  35. $save_dir='./';
  36. }
  37. if(trim($filename)==''){//保存文件名
  38. $ext=strrchr($url,'.');
  39. if($ext!='.gif'&& $ext!='.jpg'){
  40. return array('file_name'=>'','save_path'=>'','error'=>3);
  41. }
  42. $filename=time().$ext;
  43. }
  44. if(0!==strrpos($save_dir,'/')){
  45. $save_dir.='/';
  46. }
  47. //创建保存目录
  48. if(!file_exists($save_dir)&&!mkdir($save_dir,0777,true)){
  49. return array('file_name'=>'','save_path'=>'','error'=>5);
  50. }
  51. //获取远程文件所采用的方法
  52. if($type){
  53. $ch=curl_init();
  54. $timeout=5;
  55. curl_setopt($ch,CURLOPT_URL,$url);
  56. curl_setopt($ch,CURLOPT_RETURNTRANSFER,1);
  57. curl_setopt($ch,CURLOPT_CONNECTTIMEOUT,$timeout);
  58. $img=curl_exec($ch);
  59. curl_close($ch);
  60. }else{
  61. ob_start();
  62. readfile($url);
  63. $img=ob_get_contents();
  64. ob_end_clean();
  65. }
  66. $fp2=@fopen($save_dir.$filename,'a');
  67. chmod($save_dir.$filename,777);
  68. fwrite($fp2,$img);
  69. fclose($fp2);
  70. unset($img,$url);
  71. return array('file_name'=>$filename,'save_path'=>$save_dir.$filename,'error'=>0);
  72. }
  73. //判断数组是否存在
  74. function havedata($array){
  75. if(isset($array) && !empty($array)){
  76. return true;
  77. }else{
  78. return false;
  79. }
  80. }

采集150个产品链接,采集到一半发现定时任务失败,去除掉缩略图生成程序就恢复正常,初步判断是缩略图生成问题,在确认了下载图片权限,路径都是对的之后,对失败的这个产品图片进行单独分析,结果发现下载下来的原图居然有5000*6000像素那么大,怀疑是不是因为图片太大问题,度娘一查,果然是因为处理高清图造成的内存崩溃所以无法返回处理结果。

处理方法:修改 memory_limit 为256M后,复试,成功。

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/盐析白兔/article/detail/184048
推荐阅读
相关标签
  

闽ICP备14008679号