Hyperf 对接阿里云 CDN
2026/4/25 8:34:40 网站建设 项目流程
推荐使用阿里云官方新版 SDK(Darabonba 生成,V2.0): alibabacloud-sdk-php/cdn-20180510 这是阿里云官方维护的最新 CDN PHP SDK,对应 API 版本2018-05-10,支持所有 CDN 操作(刷新、预热、域名管理等)。旧版 alibabacloud/client 已不推荐。 ---1. 安装依赖composerrequire alibabacloud/darabonba-openapicomposerrequire alibabacloud-sdk-php/cdn-20180510 或直接在 composer.json 中添加:{"require":{"alibabacloud/darabonba-openapi":"^0.2","alibabacloud-sdk-php/cdn-20180510":"^2.0"}}---2. 配置文件 config/autoload/cdn.php<?phpreturn['access_key_id'=>env('ALIYUN_ACCESS_KEY_ID',''),'access_key_secret'=>env('ALIYUN_ACCESS_KEY_SECRET',''),'endpoint'=>env('ALIYUN_CDN_ENDPOINT','cdn.aliyuncs.com'),];.envALIYUN_ACCESS_KEY_ID=your_access_key_idALIYUN_ACCESS_KEY_SECRET=your_access_key_secretALIYUN_CDN_ENDPOINT=cdn.aliyuncs.com ---3. CDN Service 封装 app/Service/CdnService.php<?php declare(strict_types=1);namespace App\Service;use AlibabaCloud\SDK\Cdn\V20180510\Cdn;use AlibabaCloud\SDK\Cdn\V20180510\Models\RefreshObjectCachesRequest;use AlibabaCloud\SDK\Cdn\V20180510\Models\PushObjectCacheRequest;use AlibabaCloud\SDK\Cdn\V20180510\Models\DescribeRefreshTasksRequest;use Darabonba\OpenApi\Models\Config;use Hyperf\Contract\ConfigInterface;class CdnService{private Cdn$client;publicfunction__construct(ConfigInterface$config){$cfg=new Config(['accessKeyId'=>$config->get('cdn.access_key_id'),'accessKeySecret'=>$config->get('cdn.access_key_secret'),]);$cfg->endpoint=$config->get('cdn.endpoint','cdn.aliyuncs.com');$this->client=new Cdn($cfg);}/** * 刷新 CDN 缓存(URL 或目录) * * @param string|array$urls单个 URL 或 URL 数组 * @param string$typeFile(文件)|Directory(目录) */ publicfunctionrefresh(string|array$urls, string$type='File'): array{$objectPath=is_array($urls)? implode("\n",$urls):$urls;$request=new RefreshObjectCachesRequest(['objectPath'=>$objectPath,'objectType'=>$type,]);$response=$this->client->refreshObjectCaches($request);return['request_id'=>$response->body->requestId,'refresh_task_id'=>$response->body->refreshTaskId,];}/** * 预热 CDN(将资源提前推送到节点) * * @param string|array$urls* @param string$areadomestic(国内)|overseas(海外)|global(全球) */ publicfunctionprefetch(string|array$urls, string$area='domestic'): array{$objectPath=is_array($urls)? implode("\n",$urls):$urls;$request=new PushObjectCacheRequest(['objectPath'=>$objectPath,'area'=>$area,]);$response=$this->client->pushObjectCache($request);return['request_id'=>$response->body->requestId,'push_task_id'=>$response->body->pushTaskId,];}/** * 查询刷新/预热任务状态 * * @param string$taskId* @param string$taskActionRefreshObject|PreloadObject */ publicfunctionqueryTask(string$taskId, string$taskAction='RefreshObject'): array{$request=new DescribeRefreshTasksRequest(['taskId'=>$taskId,'taskAction'=>$taskAction,]);$response=$this->client->describeRefreshTasks($request);$tasks=$response->body->tasks->task ??[];returnarray_map(fn($task)=>['task_id'=>$task->taskId,'status'=>$task->status, // Complete|Pending|Refreshing|Failed'object_path'=>$task->objectPath,'process'=>$task->process,],$tasks);}}---4. 注册到容器 config/autoload/dependencies.php<?phpreturn[\App\Service\CdnService::class=>\App\Service\CdnService::class,];---5. 在 Controller 中使用<?php declare(strict_types=1);namespace App\Controller;use App\Service\CdnService;use Hyperf\Di\Annotation\Inject;use Hyperf\HttpServer\Annotation\Controller;use Hyperf\HttpServer\Annotation\PostMapping;use Hyperf\HttpServer\Contract\RequestInterface;#[Controller(prefix: '/cdn')]class CdnController extends AbstractController{#[Inject]private CdnService$cdnService;// 刷新单个文件#[PostMapping(path: '/refresh')]publicfunctionrefresh(RequestInterface$request): array{$urls=$request->input('urls');// string 或 array$type=$request->input('type','File');return$this->cdnService->refresh($urls,$type);}// 预热#[PostMapping(path: '/prefetch')]publicfunctionprefetch(RequestInterface$request): array{$urls=$request->input('urls');return$this->cdnService->prefetch($urls);}// 查询任务状态#[PostMapping(path: '/task')]publicfunctionqueryTask(RequestInterface$request): array{$taskId=$request->input('task_id');return$this->cdnService->queryTask($taskId);}}---6. 异步刷新(推荐生产环境) 生产环境刷新 CDN 建议放入队列,避免阻塞请求:<?php declare(strict_types=1);namespace App\Job;use App\Service\CdnService;use Hyperf\AsyncQueue\Job;class CdnRefreshJob extends Job{publicfunction__construct(private array$urls, private string$type='File'){}publicfunctionhandle(): void{$service=make(CdnService::class);$service->refresh($this->urls,$this->type);}}分发任务: use App\Job\CdnRefreshJob;use Hyperf\AsyncQueue\Driver\DriverFactory;$driver=$this->container->get(DriverFactory::class)->get('default');$driver->push(new CdnRefreshJob(['https://example.com/image.jpg']));--- 关键限制(阿里云配额) ┌──────────┬────────────┬─────────────┐ │ 操作 │ 每次上限 │ 每日配额 │ ├──────────┼────────────┼─────────────┤ │ 刷新 URL │2000条/次 │10000条/天 │ ├──────────┼────────────┼─────────────┤ │ 刷新目录 │100条/次 │100条/天 │ ├──────────┼────────────┼─────────────┤ │ 预热 URL │1000条/次 │500条/天 │ └──────────┴────────────┴─────────────┘ --- 总结 核心链路:alibabacloud-sdk-php/cdn-20180510 → CdnService 封装 → 队列异步执行。这套方案用的是阿里云官方最新 V2 SDK,长期维护有保障,API 覆盖完整。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询