
# PHP客户端接入集群
在大数据搜索和分析场景中，开发者需要通过编程语言进行数据访问和管理操作。然而，直接使用Elasticsearch的HTTP API进行编程不仅代码复杂度高，而且容易出错，影响开发效率。为了简化开发流程，CSS服务的Elasticsearch集群支持通过官方Elasticsearch PHP客户端进行数据访问和管理操作。该客户端库（elasticsearch-php）提供了完整的Elasticsearch API封装，开发者可通过PHP原生接口实现索引管理、文档CRUD、搜索查询等操作。
#### 前提条件
- Elasticsearch集群处于可用状态。
- 运行PHP代码的服务器与Elasticsearch集群之间网络互通。
- 根据集群的网络配置方式，获取集群的访问地址，操作指导请参见[获取集群访问地址](https://support.huaweicloud.com/usermanual-css/css_01_0190.html#ZH-CN_TOPIC_0000001975823337__section855085010198)。
- 确认服务器已安装Elasticsearch PHP客户端，操作指导请参见[Elasticsearch PHP Client](https://www.elastic.co/docs/reference/elasticsearch/clients/php)。
  本文服务器安装的PHP版本是8.0.30，Composer版本是2.9.2，Elasticsearch PHP客户端版本是7.17.2，连接的Elasticsearch集群版本是7.10.2。
  
 
#### 安装PHP客户端库
在运行PHP代码的服务器中安装PHP客户端库。
```
yum install -y php
```
#### 接入集群
当使用PHP客户端访问不同安全类型的Elasticsearch集群时，示例代码会有差异，请根据实际业务场景选择参考文档。
表1接入集群的场景介绍 
| Elasticsearch集群安全类型 | 参考文档                                                                                         |
|:---|:---|
| 非安全模式               | [Elasticsearch PHP连接非安全集群]             |
| 安全模式+HTTP协议         | [Elasticsearch PHP连接HTTP协议的安全集群]       |
| 安全模式+HTTPS协议        | [Elasticsearch PHP连接HTTPS协议的安全集群（无证书）]   |
| 安全模式+HTTPS协议        | [Elasticsearch PHP连接HTTPS协议的安全集群（加载证书）] |
   
 #### Elasticsearch PHP连接非安全集群
使用Elasticsearch PHP客户端连接非安全模式的Elasticsearch集群，并获取集群健康状态。
使用集群连接信息创建客户端实例的代码示例如下：
```
<?php
require 'vendor/autoload.php';
use Elasticsearch\ClientBuilder;
class ElasticsearchClient
{
    private $client;
    public function __construct($config)
    {
        $this->client = ClientBuilder::create()
            ->setHosts($config['hosts'])
            ->setConnectionPool('\Elasticsearch\ConnectionPool\SimpleConnectionPool', [])
            ->setRetries($config['retries'] ?? 3)
            ->setConnectionParams([
                'client' => [
                    'timeout' => 10,
                    'connect_timeout' => 5
                ]
            ])
            ->build();
    }
    public function getClusterHealth()
    {
        return $this->client->cluster()->health();
    }
}
$config = [
    'hosts' => [
        'http://IP:9200',
        'http://IP:9200'
    ],
    'retries' => 2
];
$es = new ElasticsearchClient($config);
print_r($es->getClusterHealth());
?>
```
表2函数中的config配置说明 
| 参数      | 描述                                                                                        |
|:---|:---|
| hosts   | 集群的访问地址，包含协议类型http、集群访问地址IP和集群连接端口9200，例如"http://xx.xx.xx.xx:9200"。当存在多个集群访问地址时，中间用","隔开。 |
| retries | 失败重试次数。使用SimpleConnectionPool作为连接池，增加访问连接失败重连的机制，避免出现访问连接异常的问题。                           |
   
该程序为获取集群健康状态信息，如下所示，当正常返回查询结果时，表示集群连接成功。
```
Array
(
    [cluster_name] => css-xxxx-php
    [status] => green
    ...
)
```
 #### Elasticsearch PHP连接HTTP协议的安全集群
使用Elasticsearch PHP客户端连接安全模式+HTTP协议的Elasticsearch集群，并获取集群健康状态。
使用集群连接信息创建客户端实例的代码示例如下：
```
<?php
require 'vendor/autoload.php';
use Elasticsearch\ClientBuilder;
class ElasticsearchClient
{
    private $client;
    public function __construct($config)
    {
        $this->client = ClientBuilder::create()
            ->setHosts($config['hosts'])
            ->setBasicAuthentication($config['username'], $config['password'])
            ->setConnectionPool('\Elasticsearch\ConnectionPool\SimpleConnectionPool', [])
            ->setRetries($config['retries'] ?? 3)
            ->setConnectionParams([
                'client' => [
                    'timeout' => 10,
                    'connect_timeout' => 5
                ]
            ])
            ->build();
    }
    public function getClusterHealth()
    {
        return $this->client->cluster()->health();
    }
}
$config = [
    'hosts' => [
        'http://IP:9200',
        'http://IP:9200'
    ],
    'username' => 'USERNAME',
    'password' => 'PASSWORD',
    'retries' => 2
];
$es = new ElasticsearchClient($config);
print_r($es->getClusterHealth());
?>
```
表3函数中的config配置说明 
| 参数       | 描述                                                                                        |
|:---|:---|
| hosts    | 集群的访问地址，包含协议类型http、集群访问地址IP和集群连接端口9200，例如"http://xx.xx.xx.xx:9200"。当存在多个集群访问地址时，中间用","隔开。 |
| username | 访问集群的用户名。                                                                                 |
| password | 用户名对应的密码。                                                                                 |
| retries  | 失败重试次数。使用SimpleConnectionPool作为连接池，增加访问连接失败重连的机制，避免出现访问连接异常的问题。                           |
   
该程序为获取集群健康状态信息，如下所示，当正常返回查询结果时，表示集群连接成功。
```
Array
(
    [cluster_name] => css-xxxx-php
    [status] => green
    ...
)
```
 #### Elasticsearch PHP连接HTTPS协议的安全集群（无证书）
在不加载安全证书的情况下，使用Elasticsearch PHP客户端连接安全模式+HTTPS协议的Elasticsearch集群，并获取集群健康状态。
使用集群连接信息创建客户端实例的代码示例如下：
```
<?php
require 'vendor/autoload.php';
use Elasticsearch\ClientBuilder;
class ElasticsearchClient
{
    private $client;
    public function __construct($config)
    {
        $this->client = ClientBuilder::create()
            ->setHosts($config['hosts'])
            ->setBasicAuthentication($config['username'], $config['password'])
            ->setSSLVerification($config['ssl_verify'] ?? false)
            ->setConnectionPool('\Elasticsearch\ConnectionPool\SimpleConnectionPool', [])
            ->setRetries($config['retries'] ?? 3)
            ->setConnectionParams([
                'client' => [
                    'timeout' => 10,
                    'connect_timeout' => 5
                ]
            ])
            ->build();
    }
    public function getClusterHealth()
    {
        return $this->client->cluster()->health();
    }
}
$config = [
    'hosts' => [
        'https://IP:9200',
        'https://IP:9200'
    ],
    'username' => 'USERNAME',
    'password' => 'PASSWORD',
    'ssl_verify' => false,
    'retries' => 2
];
$es = new ElasticsearchClient($config);
print_r($es->getClusterHealth());
?>
```
表4函数中的config配置说明 
| 参数         | 描述                                                                                          |
|:---|:---|
| hosts      | 集群的访问地址，包含协议类型https、集群访问地址IP和集群连接端口9200，例如"https://xx.xx.xx.xx:9200"。当存在多个集群访问地址时，中间用","隔开。 |
| username   | 访问集群的用户名。                                                                                   |
| password   | 用户名对应的密码。                                                                                   |
| ssl_verify | 是否加载安全证书。                                                                                   |
| retries    | 失败重试次数。使用SimpleConnectionPool作为连接池，增加访问连接失败重连的机制，避免出现访问连接异常的问题。                             |
   
该程序为获取集群健康状态信息，如下所示，当正常返回查询结果时，表示集群连接成功。
```
Array
(
    [cluster_name] => css-xxxx-php
    [status] => green
    ...
)
```
 #### Elasticsearch PHP连接HTTPS协议的安全集群（加载证书）
在加载安全证书的情况下，使用Elasticsearch PHP客户端连接安全模式+HTTPS协议的Elasticsearch集群，并获取集群健康状态。
![](https://support.huaweicloud.com/usermanual-css/public_sys-resources/caution_3.0-zh-cn.png)
连接安全模式+HTTPS协议的Elasticsearch集群需要先提前准备好安全证书，操作指导请参见[获取并上传安全证书]。
使用集群连接信息创建客户端实例的代码示例如下：
```
<?php
require 'vendor/autoload.php';
use Elasticsearch\ClientBuilder;
class ElasticsearchClient
{
    private $client;
    public function __construct($config)
    {
        $this->client = ClientBuilder::create()
            ->setHosts($config['hosts'])
            ->setBasicAuthentication($config['username'], $config['password'])
            ->setSSLVerification($config['ssl_verify'] ?? true)
            ->setConnectionPool('\Elasticsearch\ConnectionPool\SimpleConnectionPool', [])
            ->setRetries($config['retries'] ?? 3)
            ->setConnectionParams([
                'client' => [
                    'timeout' => 10,
                    'connect_timeout' => 5
                ]
            ])
            ->build();
    }
    public function getClusterHealth()
    {
        return $this->client->cluster()->health();
    }
}
$config = [
    'hosts' => [
        'https://IP:9200',
        'https://IP:9200'
    ],
    'username' => 'USERNAME',
    'password' => 'PASSWORD',
    'ssl_verify' => true,
    'retries' => 2
];
$es = new ElasticsearchClient($config);
print_r($es->getClusterHealth());
?>
```
表5函数中的config配置说明 
| 参数         | 描述                                                                                          |
|:---|:---|
| hosts      | 集群的访问地址，包含协议类型https、集群访问地址IP和集群连接端口9200，例如"https://xx.xx.xx.xx:9200"。当存在多个集群访问地址时，中间用","隔开。 |
| username   | 访问集群的用户名。                                                                                   |
| password   | 用户名对应的密码。                                                                                   |
| ssl_verify | 是否加载安全证书。                                                                                   |
| retries    | 失败重试次数。使用SimpleConnectionPool作为连接池，增加访问连接失败重连的机制，避免出现访问连接异常的问题。                             |
   
该程序为获取集群健康状态信息，如下所示，当正常返回查询结果时，表示集群连接成功。
```
Array
(
    [cluster_name] => css-xxxx-php
    [status] => green
    ...
)
```
 #### 获取并上传安全证书
当接入安全模式+HTTPS协议的Elasticsearch集群时，如需加载安全证书，则可以参考如下步骤获取安全证书，并上传至客户端。
1. 获取安全证书（CloudSearchService.cer）。
   1. 登录[云搜索服务管理控制台](https://console.huaweicloud.com/elasticsearch/)。
   
   2. 在左侧导航栏，选择"集群管理 \> Elasticsearch"。
   
   3. 在集群列表，单击目标集群名称，进入集群详情页。
   
   4. 选择"概览"页签，在"网络信息"下方，单击"HTTPS访问"的"下载证书"获取安全证书。
      图1下载安全证书   
      ![](https://support.huaweicloud.com/usermanual-css/images/zh-cn_image_0000002412660693.png) 
    
2. 将下载的安全证书上传到服务器上。
3. 在服务器找到PHP环境目录，修改"php.ini"文件。
   ```
   curl.cainfo="/tmp/CloudSearchService"  // 替换为安全证书的绝对路径
   ```
   
 
