在laravel项目中集成阿里云的视频点播服务时, 需要上传视频后获取视频时长,由于视频时长并不是能马上获取到的参数(应该是在阿里云视频转码之后才能得到), 什么时候能获取到并不确定, 因此考虑使用laravel的队列服务来延迟获取.
<?php
namespace App\Jobs;
use App\Models\Video;
use App\Service\AliVod;
use Carbon\Carbon;
use Illuminate\Bus\Queueable;
/**
* 上传后获取视频长度
* Class GetVideoDuration
* @package App\Jobs
*/
class GetVideoDuration extends Job
{
use Queueable;
protected $video;
public function __construct($id)
{
$this->video = Video::find($id);
}
public function handle()
{
try {
$video_info = AliVod::get_video_info($this->video->video_id);
$duration = $video_info['Video']->Duration;
if (0 != $duration) {
$this->video->update([
'duration' => $duration
]);
\Log::info('获取视频时间成功, 视频表id ==> ' . $this->video->id);
} else {
\Log::info('视频时间为 0 , 视频表id ==> ' . $this->video->id. ', 重新分发');
dispatch((new GetVideoDuration($this->video->id))->delay(Carbon::now()->addMinutes(3)));
}
} catch (\Exception $e) {
\Log::info('获取视频时间失败, 视频表id ==> ' . $this->video->id . ', 原因 : '. $e->getMessage() . ', 重新分发');
dispatch((new GetVideoDuration($this->video->id))->delay(Carbon::now()->addMinutes(3)));
}
}
}
期间遇到的问题是队列第一次能正常运行, 之后再次分发的话, 会一直报下面这个错误:
ErrorException: Undefined index: cn-shanghai#vod in /workspace/dev6/ctjy_api_server/app/Service/VodServer/aliyun-php-sdk-core/Regions/LocationService.php:82
找到报错的阿里云的sdk的位置, 在这个方法前面加上代码对这个变量进行判断
private function checkCacheIsExpire($key)
{
if(!self::$lastClearTimePerProduct) return false; // 加上代码
$lastClearTime = self::$lastClearTimePerProduct[$key];
if ($lastClearTime == null)
{
$lastClearTime = time();
self::$lastClearTimePerProduct[$key] = $lastClearTime;
}
$now = time();
$elapsedTime = $now - $lastClearTime;
if ($elapsedTime > CACHE_EXPIRE_TIME)
{
$lastClearTime = time();
self::$lastClearTimePerProduct[$key] = $lastClearTime;
return true;
}
return false;
}
网友评论