更新时间:2024-07-02 GMT+08:00

PHP SDK使用指导

本章节介绍了PHP SDK的使用说明,您可以参考本章节进行快速集成开发。

开发前准备

  • 注册华为账号并开通华为云,完成实名认证

    国际站和欧洲站用户在以下情况下需要进行账号实名认证。

    • 根据中国大陆相关法规要求,购买和使用中国大陆节点云产品服务的用户需要实名认证。
    • 购买视频直播服务时,如果您选择的区域包含中国大陆,则需要实名认证。
  • 具备已备案的域名用于直播推流和播放,并在视频直播控制台添加推流和播放域名,且已完成域名关联
  • 已具备开发环境 ,支持 PHP 5.6及以上版本。
  • 已获取华为云账号对应的Access Key(AK)和Secret Access Key(SK)。请在华为云控制台我的凭证 > 访问密钥页面上创建和查看您的AK/SK。具体请参见访问密钥
  • 已获取直播服务对应区域的项目ID,请在华为云控制台我的凭证 > API凭证页面上查看项目ID。具体请参见API凭证

安装SDK

视频直播服务端SDK支持PHP 5.6及以上版本。执行“ php --version”,检查当前PHP的版本信息。

推荐使用Composer安装SDK。

Composer是PHP的依赖管理工具,允许您在项目中声明依赖关系并安装这些依赖。
1
2
3
4
# 安装 Composer
curl -sS https://getcomposer.org/installer | php 
# 安装 PHP SDK
composer require huaweicloud/huaweicloud-sdk-php
安装完毕后,您需要引入Composer的自动加载文件。
1
require 'path/to/vendor/autoload.php';

开始使用

  1. 导入依赖模块。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    namespace HuaweiCloud\SDK\Live\V1\Model;
    require_once "vendor/autoload.php";
    use HuaweiCloud\SDK\Core\Auth\BasicCredentials;
    use HuaweiCloud\SDK\Core\Http\HttpConfig;
    use HuaweiCloud\SDK\Core\Exceptions\ConnectionException;
    use HuaweiCloud\SDK\Core\Exceptions\RequestTimeoutException;
    use HuaweiCloud\SDK\Core\Exceptions\ServiceResponseException;
    // 导入指定Live的库
    use HuaweiCloud\SDK\Live\V1\LiveClient;
    

  2. 配置客户端属性。

    1. 默认配置。
      1
      2
      // 使用默认配置
      $config = HttpConfig::getDefaultConfig();
      
    2. (可选操作)配置代理。
      1
      2
      3
      4
      5
      6
      7
      8
      // 使用代理服务器可选
      // 代理服务器的password直接写入代码会有很大安全风险建议密文形式存储在配置文件或者环境变量中待使用时再解密以确保安全
      // 代理配置设置前请先在本地环境中设置环境变量PROXY_PASSWORD
      $config->setProxyProtocol('http');
      $config->setProxyHost('proxy.huawei.com');
      $config->setProxyPort(8080);
      $config->setProxyUser('username');
      $config->setProxyPassword(getenv('PROXY_PASSWORD'));
      
    3. (可选操作)配置连接。
      1
      2
      // 配置连接超时可选),支持统一指定超时时长timeout=timeout或分别指定超时时长timeout=(connect timeout, read timeout)
      $config->setConnectionTimeout(3);
      
    4. (可选操作)配置SSL。
      1
      2
      3
      4
      # (可选)配置跳过服务端证书校验
      $config->setIgnoreSslVerification(true);
      # 配置服务器端CA证书,用于SDK验证服务端证书合法性
      $config->setCertFile("{yourCertFile}");
      

  3. 初始化认证信息。

    支持两种方式认证,您可以根据实际情况进行选择。

    • 使用永久AK/SK

      首先需要获取永久AK和SK,以及projectId,您可以参考开发前准备获取。

      1
      $basicCredentials = new BasicCredentials($ak,$sk,$projectId);
      
    • 使用临时AK/SK

      首先需要获得临时AK、SK和SecurityToken,您可以通过token获取或者通过委托授权获取

      1
      $basicCredentials = BasicCredentials(ak, sk, projectId).withSecurityToken(securityToken);
      
    相关参数说明如下所示:
    • ak:华为云账号Access Key,建议以密文形式存储在配置文件或者环境变量中,待使用时再解密,以确保安全。
    • sk:华为云账号Secret Access Key,建议以密文形式存储在配置文件或者环境变量中,待使用时再解密,以确保安全。
    • project_id:云服务所在项目ID ,根据您需要操作的项目所属区域选择对应的项目ID 。
    • security_token:采用临时AK/SK认证场景下的安全票据。

  4. 初始化客户端。

    1
    2
    3
    4
    5
    6
    7
    // 初始化直播服务的客户端
    $client = LiveClient::newBuilder(new LiveClient)
      ->withHttpConfig($config)
      ->withEndpoint($endpoint)
      ->withCredentials($credentials)
      ->build();
    $request = new CreateDomainRequest();
    

    endpoint:直播服务应用区域和各服务的终端节点,具体请参见地区和终端节点

  5. 发送请求并查看响应。

    1
    2
    3
    4
    // 初始化请求以调用查询转码模板接口为例
    $request = new ShowTranscodingsTemplateRequest("play.example.huaweicloud.com");
    $response = $client->ShowTranscodingsTemplate($request);
    echo $response;
    

  6. 异常处理。

    表1 异常处理

    一级分类

    一级分类说明

    二级分类

    二级分类说明

    ConnectionException

    连接类异常

    HostUnreachableException

    网络不可达、被拒绝

    SslHandShakeException

    SSL认证异常

    RequestTimeoutException

    响应超时异常

    CallTimeoutException

    单次请求,服务器处理超时未返回

    RetryOutageException

    在重试策略消耗完成以后,仍无有效的响应

    ServiceResponseException

    服务器响应异常

    ServerResponseException

    服务端内部错误,Http响应码:[500,]

    ClientRequestException

    请求参数不合法,Http响应码:[400, 500)

     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    13
    14
    15
    // 异常处理
    try {
      $response = $client->ShowTranscodingsTemplate($request);
    } catch (ConnectionException $e) {
      $msg = $e->getMessage();
      echo "\n". $msg ."\n";
    } catch (RequestTimeoutException $e) {
      $msg = $e->getMessage();
      echo "\n". $msg ."\n";
    } catch (ServiceResponseException $e) {
      echo "\n";
      echo $e->getHttpStatusCode(). "\n";
      echo $e->getErrorCode() . "\n";
      echo $e->getErrorMsg() . "\n";
    }
    

  7. 原始Http侦听器。

    在某些场景下可能对业务发出的Http请求进行Debug,需要看到原始的Http请求和返回信息,SDK提供侦听器功能来获取原始的和加密的Http请求和返回信息。

    原始信息打印仅在debug阶段使用,请不要在生产系统中将原始的Http头和Body信息打印到日志,这些信息并未加密且其中包含敏感数据;当Body体为二进制内容,即Content-Type标识为二进制时body为"***",详细内容不输出。

     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    $requestHandler = function ($argsMap) {
        if (isset($argsMap['request'])) {
            $sdkRequest = $argsMap['request'];
            $requestHeaders = $sdkRequest->headerParams;
            $requestBase = "> Request " . $sdkRequest->method . ' ' .
                $sdkRequest->url . "\n";
            if (count($requestHeaders) > 0) {
                $requestBase = $requestBase . '> Headers:' . "\n";
                foreach ($requestHeaders as $key => $value) {
                    $requestBase = $requestBase . '    ' . $key . ' : ' .
                        $value . "\n";
                }
                $requestBase = $requestBase . '> Body: ' .
                    $sdkRequest->body . "\n\n";
            }
            if (isset($argsMap['logger'])) {
                $logger = $argsMap['logger'];
                $logger->addDebug($requestBase);
            }
        }
    };
    
    $responseHandler = function ($argsMap) {
        if (isset($argsMap['response'])) {
            $response = $argsMap['response'];
            $responseBase = "> Response HTTP/1.1 " .
                $response->getStatusCode() . "\n";
            $responseHeaders = $response->getHeaders();
            if (count($responseHeaders) > 0) {
                $responseBase = $responseBase . '> Headers:' . "\n";
                foreach ($responseHeaders as $key => $value) {
                    $valueToString = '';
                    if (is_array($value)) {
                        $valueToString = ''.join($value);
                    }
                    $responseBase = $responseBase . '    ' . $key . ' : '
                        . $valueToString . "\n";
                }
                $responseBody = $response->getBody();
                $responseBase = $responseBase . '> Body: ' . (string)
                    $responseBody . "\n\n";
            }
            if (isset($argsMap['logger'])) {
                $logger = $argsMap['logger'];
                $logger->addDebug($responseBase);
            }
        }
    };
    
    $httpHandler = new HttpHandler();
    $httpHandler->addRequestHandlers($requestHandler);
    $httpHandler->addResponseHandlers($responseHandler);
    
    $iamClient = LiveClient::newBuilder()
        ->withHttpConfig($config)
        ->withEndpoint($endpoint)
        ->withCredentials(null)
        ->withStreamLogger($stream = 'php://stdout',$logLevel =Logger::INFO) // 日志打印至控制台
        ->withFileLogger($logPath='./test_log.txt', $logLevel = Logger::INFO) // 日志打印至文件
        ->withHttpHandler($httpHandler)
        ->build();
    

代码示例

调用前请根据实际情况替换如下变量:{your endpoint string} 以及 {your project id}。

认证用的AK、SK直接写入代码,会有很大安全风险,建议密文形式存放在配置文件或者环境变量中,待使用时再解密,以确保安全。

本示例以AK、SK保存在环境变量中为例。运行本示例前,请先在本地环境中设置环境变量HUAWEICLOUD_SDK_AK和HUAWEICLOUD_SDK_SK。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
<?php
namespace HuaweiCloud\SDK\Live\V1\Model;
require_once "vendor/autoload.php";
use HuaweiCloud\SDK\Core\Auth\BasicCredentials;
use HuaweiCloud\SDK\Core\Http\HttpConfig;
use HuaweiCloud\SDK\Core\Exceptions\ConnectionException;
use HuaweiCloud\SDK\Core\Exceptions\RequestTimeoutException;
use HuaweiCloud\SDK\Core\Exceptions\ServiceResponseException;
use HuaweiCloud\SDK\Live\V1\LiveClient;

$ak = getenv('HUAWEICLOUD_SDK_AK');
$sk = getenv('HUAWEICLOUD_SDK_SK');
$endpoint = "https://live.cn-north-4.myhuaweicloud.com";
$projectId = "";
$credentials = new BasicCredentials($ak,$sk,$projectId);
$config = HttpConfig::getDefaultConfig();
$config->setIgnoreSslVerification(true);

$client = LiveClient::newBuilder(new LiveClient)
  ->withHttpConfig($config)
  ->withEndpoint($endpoint)
  ->withCredentials($credentials)
  ->build();
$request = new ShowTranscodingsTemplateRequest();

try {
  $response = $client->ShowTranscodingsTemplate($request);
} catch (ConnectionException $e) {
  $msg = $e->getMessage();
  echo "\n". $msg ."\n";
} catch (RequestTimeoutException $e) {
  $msg = $e->getMessage();
  echo "\n". $msg ."\n";
} catch (ServiceResponseException $e) {
  echo "\n";
  echo $e->getHttpStatusCode(). "\n";
  echo $e->getErrorCode() . "\n";
  echo $e->getErrorMsg() . "\n";
}
echo "\n";
echo $response;