CutImgOne.php 6.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206
  1. <?php
  2. namespace app\jobs;
  3. use think\queue\Job;
  4. use think\facade\Console;
  5. use app\model\VrFloder;
  6. use app\model\VrGroup;
  7. use app\model\VrView;
  8. use vr\Krpano;
  9. use OSS\OssClient;
  10. use think\facade\Log;
  11. class CutImgOne
  12. {
  13. public function fire(Job $job, $queuedata)
  14. {
  15. // Log::close();
  16. try {
  17. if($job->attempts() > 1) {
  18. //通过这个方法可以检查这个任务已经重试了几次了
  19. $job->delete();
  20. }else{
  21. $res = $this->jobDone($queuedata);
  22. if($res){
  23. $job->delete();
  24. }else{
  25. VrView::where('id',$queuedata['view_id'])->update(['cut_img_status'=>3,'cut_img_ing'=>0]);
  26. }
  27. }
  28. } catch (OssException $e) {
  29. //报错直接结束
  30. VrView::where('id',$queuedata['view_id'])->update(['cut_img_status'=>3,'cut_img_ing'=>0]);
  31. $job->delete();
  32. }
  33. }
  34. public function failed($queuedata)
  35. {
  36. // ...任务达到最大重试次数后,失败了
  37. }
  38. //切图
  39. //VrView::where('id',23)->update(['cut_img_size'=>0]);
  40. private function jobDone($data){
  41. $t = microtime(true);
  42. $vid = $data['view_id'];
  43. VrView::where('id',$vid)->update(['cut_img_size'=>1]);
  44. // Log::close();
  45. // //场景信息
  46. $info = VrView::where('id',$data['view_id'])->field('id,vr_path,structure,vr_group_id')->findOrEmpty();
  47. // //切图中或切图完成直接结束
  48. if ($info->isEmpty() || in_array($info->cut_img_status,[4])) return true;
  49. VrView::where('id',$vid)->update(['cut_img_size'=>12]);
  50. // //切图开始时间
  51. $info->cut_img_time = time();
  52. $info->save();
  53. // //原图
  54. $ali_oss_bindurl = config('app.vr_ali_oss_bindurl');
  55. $url = 'https://' . $ali_oss_bindurl . '/';
  56. $path = $info->structure.$info->vr_path.'.jpg';
  57. $info->pic_path = $url.$path;
  58. VrView::where('id',$vid)->update(['cut_img_size'=>123]);
  59. //垃圾数据
  60. if(strpos($info->pic_path,'.jpg')===false) return false;
  61. //oss文件是否存在
  62. if(!$this->ossCheck($path)) return false;
  63. VrView::where('id',$vid)->update(['cut_img_size'=>1234]);
  64. // //下载原图
  65. $inputfile = 'public/upload/wzh/'.$info->vr_path.'.jpg';// 原图保存地址
  66. // // $measurement = '?x-oss-process=image/resize,w_100';//下载图片尺寸
  67. $measurement = '';
  68. $this->dlfile($info->pic_path.$measurement,$inputfile);
  69. //下载原图失败
  70. if(!file_exists($inputfile)) return false;
  71. VrView::where('id',$vid)->update(['cut_img_size'=>12345]);
  72. //开始切图
  73. $outputfilepath = 'public/upload/wzh/'.$info->vr_path.'/';//切图保存地址
  74. $krpano = new Krpano();
  75. $i = false;
  76. try {
  77. // 生成六面体的6张图
  78. $krpano->spheretocubeCube($inputfile, $outputfilepath);
  79. // 生成封面图
  80. $krpano->makepreview($inputfile, $outputfilepath);
  81. // 生成竖版预览图
  82. $krpano->spheretocubeVcube($inputfile, $outputfilepath);
  83. } catch (Exception $e) {
  84. trace($e->getMessage(), 'error');
  85. $i = true;
  86. }
  87. VrView::where('id',$vid)->update(['cut_img_size'=>123456]);
  88. @unlink($inputfile);//删除本地原图
  89. $arr = ['image_b','image_d','image_f','image_l','image_r','image_u','preview','thumb'];
  90. $res = 0;
  91. foreach ($arr as $key => $value) {
  92. $res++;
  93. }
  94. return $res;
  95. echo '-';
  96. //切图失败,可能只切成一张图
  97. if ($i) {
  98. foreach ($arr as $v1) {
  99. $img = $outputfilepath.$v1.'.jpg';//切图保存地址
  100. if(file_exists($img)) @unlink($img);////删除已经生成的切图
  101. }
  102. @rmdir('public/upload/wzh/'.$info->vr_path);//删除空文件夹
  103. return false;
  104. }
  105. VrView::where('id',$vid)->update(['cut_img_size'=>1234567]);
  106. //切图成功 上传oss
  107. $size = 0;//切图大小
  108. VrView::where('id',$vid)->update(['logo_path'=>'','mask'=>'','hotspot'=>'','hlookat'=>'']);
  109. $oss = $this->ossObject();
  110. $bucket = config('app.vr_ali_oss_bucket');
  111. foreach ($arr as $v2) {
  112. $view = VrView::where('id',$vid)->find();
  113. VrView::where('id',$vid)->update(['logo_path'=>$view->logo_path.','.$v2]);
  114. //切图保存地址
  115. $img = $outputfilepath.$v2.'.jpg';
  116. $file = $info->structure.$v2.'.jpg';
  117. $t1 = microtime(true);
  118. $tt = $t1 - $t;
  119. VrView::where('id',$vid)->update(['hlookat'=>$tt]);
  120. $res = $this->ossUpload($file,$img,$oss,$bucket);
  121. VrView::where('id',$vid)->update(['mask'=>$view->mask.','.$img]);
  122. VrView::where('id',$vid)->update(['hotspot'=>$view->hotspot.','.$file]);
  123. $str = $res ? '1' : '0';
  124. if ($res) $size += filesize($img);
  125. @unlink($img);//删除本地文件
  126. }
  127. @rmdir('public/upload/wzh/'.$info->vr_path);//删除空文件夹
  128. VrView::where('id',$vid)->update(['cut_img_size'=>12345678]);
  129. $info->cut_img_status = 4;
  130. $info->cut_img_size = $size;
  131. $info->save();
  132. VrGroup::where('id',$info->vr_group_id)->inc('size',$size)->update();
  133. return true;
  134. }
  135. //下载图片
  136. private function dlfile($file_url, $save_to)
  137. {
  138. $in= fopen($file_url, "rb");
  139. $out= fopen($save_to, "wb");
  140. while ($chunk = fread($in,8192))
  141. {
  142. fwrite($out, $chunk, 8192);
  143. }
  144. fclose($in);
  145. fclose($out);
  146. }
  147. /*
  148. * oss文件上传
  149. */
  150. private function ossUpload($path, $file,$oss,$bucket)
  151. {
  152. try {
  153. $oss->uploadFile($bucket, $path, $file);
  154. } catch (OssException $e) {
  155. return false;
  156. }
  157. return true;
  158. }
  159. /*
  160. 0,单个vr头部分享
  161. 1,分享单个vr
  162. 2,侧边栏电话
  163. * 获取oss对象
  164. */
  165. private function ossObject()
  166. {
  167. $accessKeyId = config('app.vr_ali_oss_access_key_id');
  168. $accessKeySecret = config('app.vr_ali_oss_access_key_secret');
  169. $endpoint = config('app.vr_ali_oss_end_point');
  170. $oss = new OssClient($accessKeyId, $accessKeySecret, $endpoint);
  171. return $oss;
  172. }
  173. /*
  174. * oss检测文件
  175. */
  176. private function ossCheck($file)
  177. {
  178. // $file = 'vr/2023/03/18/9F8E30932ECE44EB9C7FBC87A44FBD3D/9F8E30932ECE44EB9C7FBC87A44FBD3D.jpg';
  179. $accessKeyId = config('app.vr_ali_oss_access_key_id');
  180. $accessKeySecret = config('app.vr_ali_oss_access_key_secret');
  181. $endpoint = config('app.vr_ali_oss_end_point');
  182. $bucket = config('app.vr_ali_oss_bucket');
  183. $oss = new OssClient($accessKeyId, $accessKeySecret, $endpoint);
  184. try {
  185. $exist = $oss->doesObjectExist($bucket, $file);
  186. return $exist;
  187. } catch (OssException $e) {
  188. return false;
  189. }
  190. }
  191. }