
# PHP SDK使用指导
本章节介绍了PHP SDK的使用说明，您可以参考本章节进行快速集成开发。
 #### 开发前准备
- 已[注册](https://reg.huaweicloud.com/registerui/public/custom/register.html?locale=zh-cn#/register)华为账号并开通华为云，完成[实名认证](https://support.huaweicloud.com/usermanual-account/account_auth_00001.html)。
- 具备已备案的域名用于直播推流和播放，并在视频直播控制台[添加推流和播放域名](https://support.huaweicloud.com/iLive-live/live010002.html)，且已完成[域名关联](https://support.huaweicloud.com/iLive-live/live_01_0026.html)。
- 已具备开发环境 ，支持 PHP 5.6及以上版本。
- 已获取华为云账号对应的Access Key（AK）和Secret Access Key（SK）。请在华为云控制台"我的凭证 \> 访问密钥"页面上创建和查看您的AK/SK。具体请参见[访问密钥](https://support.huaweicloud.com/usermanual-ca/ca_01_0003.html)。
- 已获取直播服务对应区域的项目ID，请在华为云控制台"我的凭证 \> API凭证"页面上查看项目ID。具体请参见[API凭证](https://support.huaweicloud.com/usermanual-ca/ca_01_0002.html)。
 
#### 安装SDK
视频直播服务端SDK支持PHP 5.6及以上版本。执行" php --version"，检查当前PHP的版本信息。
推荐使用Composer安装SDK。
Composer是PHP的依赖管理工具，允许您在项目中声明依赖关系并安装这些依赖。
```
# 安装 Composer
curl -sS https://getcomposer.org/installer | php 
# 安装 PHP SDK
composer require huaweicloud/huaweicloud-sdk-php
```
安装完毕后，您需要引入Composer的自动加载文件。
```
require 'path/to/vendor/autoload.php';
```
#### 开始使用
1. 导入依赖模块。 
   ```
   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. 默认配置。
      ```
      // 使用默认配置
      $config = HttpConfig::getDefaultConfig();
      ```
      
   
   2. （可选操作）配置代理。
      ```
      // 使用代理服务器（可选）
      // 代理服务器的password直接写入代码，会有很大安全风险。建议密文形式存储在配置文件或者环境变量中，待使用时再解密，以确保安全。
      // 代理配置设置前，请先在本地环境中设置环境变量PROXY_PASSWORD
      $config->setProxyProtocol('http');
      $config->setProxyHost('proxy.huawei.com');
      $config->setProxyPort(8080);
      $config->setProxyUser('username');
      $config->setProxyPassword(getenv('PROXY_PASSWORD'));
      ```
      
   
   3. （可选操作）配置连接。
      ```
      // 配置连接超时（可选），支持统一指定超时时长timeout=timeout，或分别指定超时时长timeout=(connect timeout, read timeout)
      $config->setConnectionTimeout(3);
      ```
      
   
   4. （可选操作）配置SSL。
      ```
      # （可选）配置跳过服务端证书校验
      $config->setIgnoreSslVerification(true);
      # 配置服务器端CA证书，用于SDK验证服务端证书合法性
      $config->setCertFile("{yourCertFile}");
      ```
      
   
   
   
   
3. 初始化认证信息。 
   支持两种方式认证，您可以根据实际情况进行选择。
   - 使用永久AK/SK 首先需要获取永久AK和SK，以及projectId，您可以参考[开发前准备]获取。
     ```
     $basicCredentials = new BasicCredentials($ak,$sk,$projectId);
     ```
     
   
   - 使用临时AK/SK 首先需要获得临时AK、SK和SecurityToken，您可以[通过token获取](https://support.huaweicloud.com/api-iam/iam_04_0002.html)或者[通过委托授权获取](https://support.huaweicloud.com/api-iam/iam_04_0101.html)。
     ```
     $basicCredentials = BasicCredentials(ak, sk, projectId).withSecurityToken(securityToken);
     ```
     
   
   
   相关参数说明如下所示：
   - **ak**：华为云账号Access Key，建议以密文形式存储在配置文件或者环境变量中，待使用时再解密，以确保安全。
   
   - **sk**：华为云账号Secret Access Key，建议以密文形式存储在配置文件或者环境变量中，待使用时再解密，以确保安全。
   
   - **project_id**：云服务所在项目ID ，根据您需要操作的项目所属区域选择对应的项目ID 。
   
   - **securitytoken**：采用临时AK/SK认证场景下的安全票据。
    
   
   
4. 初始化客户端。 
   ```
   // 初始化直播服务的客户端
   $client = LiveClient::newBuilder(new LiveClient)
     ->withHttpConfig($config)
     ->withEndpoint($endpoint)
     ->withCredentials($credentials)
     ->build();
   $request = new CreateDomainRequest();
   ```
   **endpoint：** 直播服务应用区域和各服务的终端节点，具体请参见[地区和终端节点](https://developer.huaweicloud.com/endpoint?Live)。
   
   
5. 发送请求并查看响应。 
   ```
   // 初始化请求，以调用查询转码模板接口为例
   $request = new ShowTranscodingsTemplateRequest("play.example.huaweicloud.com");
   $response = $client->ShowTranscodingsTemplate($request);
   echo $response;
   ```
   
   
6. 异常处理。 
   表1异常处理 
   | 一级分类                     | 一级分类说明  | 二级分类                     | 二级分类说明                      |
   |:---|:---|:---|:---|
   | ConnectionException      | 连接类异常   | HostUnreachableException | 网络不可达、被拒绝                   |
   | ConnectionException      | 连接类异常   | SslHandShakeException    | SSL认证异常                     |
   | RequestTimeoutException  | 响应超时异常  | CallTimeoutException     | 单次请求，服务器处理超时未返回             |
   | RequestTimeoutException  | 响应超时异常  | RetryOutageException     | 在重试策略消耗完成以后，仍无有效的响应         |
   | ServiceResponseException | 服务器响应异常 | ServerResponseException  | 服务端内部错误，Http响应码：\[500,\]    |
   | ServiceResponseException | 服务器响应异常 | ClientRequestException   | 请求参数不合法，Http响应码：\[400， 500) |
      
   ```
   // 异常处理
   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请求和返回信息。
   ![](https://support.huaweicloud.com/ssdk-live/public_sys-resources/caution_3.0-zh-cn.png)
   原始信息打印仅在debug阶段使用，请不要在生产系统中将原始的Http头和Body信息打印到日志，这些信息并未加密且其中包含敏感数据；当Body体为二进制内容，即Content-Type标识为二进制时body为"\*\*\*"，详细内容不输出。
   ```
   $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。
```
<?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;
```
