

本文属于机器翻译版本。若本译文内容与英语原文存在差异，则一律以英文原文为准。

# 使用 Elastic Beanstalk PHP 平台
<a name="create_deploy_PHP.container"></a>

AWS Elastic Beanstalk 为不同版本的 PHP 提供并支持各种**平台分支**。这些平台支持可以单独运行或在 Composer 下运行的 PHP Web 应用程序。有关支持的平台分支的完整列表，请参阅 *AWS Elastic Beanstalk 平台*文档中的 [PHP](https://docs.aws.amazon.com/elasticbeanstalk/latest/platforms/platforms-supported.html#platforms-supported.PHP)。

Elastic Beanstalk 提供了[配置选项](command-options.md)，可供您用于自定义在 Elastic Beanstalk 环境中的 Amazon EC2 实例上运行的软件。您可[配置应用程序所需的环境变量](environments-cfg-softwaresettings.md#environments-cfg-softwaresettings-console)，启用到 Amazon S3 的日志轮换，将应用程序源中包含静态文件的文件夹映射至代理服务器所提供的路径，并设置常见 PHP 初始化设置。

Elastic Beanstalk 控制台中提供了配置选项，可用于[修改运行环境的配置](environment-configuration-methods-after.md)。要避免在终止环境时丢失环境配置，可以使用[保存的配置](environment-configuration-savedconfig.md)来保存您的设置，并在以后将这些设置应用到其他环境。

要保存源代码中的设置，您可以包含[配置文件](ebextensions.md)。在您每次创建环境或部署应用程序时，会应用配置文件中的设置。您还可在部署期间使用配置文件来安装程序包、运行脚本以及执行其他实例自定义操作。

如果使用了 Composer，您可以将 [`composer.json` 文件包含](#php-configuration-composer)在源包中以在部署期间安装程序包。

对于未提供为配置选项的高级 PHP 配置和 PHP 设置，您可以[使用配置文件来提供 `INI` 文件](#php-configuration-phpini)，该文件可扩展并覆盖由 Elastic Beanstalk 应用的默认设置或者安装其他扩展。

在 Elastic Beanstalk 控制台中应用的设置会覆盖配置文件中的相同设置（如果存在）。这让您可以在配置文件中包含默认设置，并使用控制台中的特定环境设置加以覆盖。有关优先顺序和其他设置更改方法的更多信息，请参阅[配置选项](command-options.md)。

有关扩展 Elastic Beanstalk 基于 Linux 的平台的各种方法的详细信息，请参阅 [扩展 Elastic Beanstalk Linux 平台](platforms-linux-extend.md)。

**Topics**
+ [安装适用于 PHP 的 S AWS DK](#php-development-environment-sdk)
+ [Amazon Linux 2 上的 PHP 8.1 注意事项](#php-8-1-considerations)
+ [配置 PHP 环境](#php-console)
+ [配置的命名空间](#php-namespaces)
+ [安装依赖项](#php-configuration-composer)
+ [更新 Composer](#php-configuration-composerupdate)
+ [扩展 php.ini](#php-configuration-phpini)

## 安装适用于 PHP 的 S AWS DK
<a name="php-development-environment-sdk"></a>

如果您需要从应用程序内部管理 AWS 资源，请安装 适用于 PHP 的 AWS SDK。例如，借助 SDK for PHP，您可以使用 Amazon DynamoDB（DynamoDB）来存储用户和会话信息，而无需创建关系数据库。

使用 Composer 安装适用于 PHP 的 SDK

```
$ composer require aws/aws-sdk-php
```

有关更多信息，请参阅 [AWS SDK for PHP](https://aws.amazon.com/sdk-for-php/) 主页。有关说明，请参阅 [Install the AWS SDK for PHP](https://docs.aws.amazon.com/sdk-for-php/v3/developer-guide/getting-started_installation.html)。

## Amazon Linux 2 上的 PHP 8.1 注意事项
<a name="php-8-1-considerations"></a>

如果使用的是 *Amazon Linux 2 上的 PHP 8.1* 平台分支，请阅读本节。

### Amazon Linux 2 上的 PHP 8.1 注意事项
<a name="php-8-1-considerations-detail"></a>

**注意**  
本主题中的信息仅适用于 *Amazon Linux 2 上的 PHP 8.1* 平台分支。它不适用于基于的 PHP 平台分支 AL2023。它也不适用于 *Amazon Linux 2 上的 PHP 8.0* 平台分支。

Elastic Beanstalk 将 EC2 实例上与 *Amazon Linux 2 上的 PHP 8.1* 平台分支相关的 RPM 程序包存储在本地目录中，而不是在 Amazon Linux 存储库中。您可以使用 **rpm -i ** 来安装程序包。从 [PHP 8.1 平台版本 3.5.0](https://docs.aws.amazon.com/elasticbeanstalk/latest/relnotes/release-2022-10-03-linux.html) 开始，Elastic Beanstalk 会将与 PHP 8.1 相关的 RPM 程序包存储在以下本地 EC2 目录中。

 `/opt/elasticbeanstalk/RPMS` 

下面的示例将安装 *php-debuginfo* 程序包。

```
$rpm -i /opt/elasticbeanstalk/RPMS/php-debuginfo-8.1.8-1.amzn2.x86_64.rpm
```

程序包名称中的版本将根据 EC2 本地目录 `/opt/elasticbeanstalk/RPMS` 中列出的实际版本而有所不同。使用相同的语法安装其他 PHP 8.1 RPM 程序包。

展开以下部分以显示我们提供的 RPM 程序包列表。

#### RPM 程序包
<a name="php-8-1-considerations-detail-rpm-packages"></a>

以下列表提供了 Elastic Beanstalk PHP 8.1 平台在 Amazon Linux 2 上提供的 RMP 程序包。它们位于本地目录 `/opt/elasticbeanstalk/RPMS` 下。

列出的程序包名称中的版本号 *8.1.8-1* *和 3.7.0-1* 只是举例说明。
+ `php-8.1.8-1.amzn2.x86_64.rpm`
+ `php-bcmath-8.1.8-1.amzn2.x86_64.rpm`
+ `php-cli-8.1.8-1.amzn2.x86_64.rpm`
+ `php-common-8.1.8-1.amzn2.x86_64.rpm`
+ `php-dba-8.1.8-1.amzn2.x86_64.rpm`
+ `php-dbg-8.1.8-1.amzn2.x86_64.rpm`
+ `php-debuginfo-8.1.8-1.amzn2.x86_64.rpm`
+ `php-devel-8.1.8-1.amzn2.x86_64.rpm`
+ `php-embedded-8.1.8-1.amzn2.x86_64.rpm`
+ `php-enchant-8.1.8-1.amzn2.x86_64.rpm`
+ `php-fpm-8.1.8-1.amzn2.x86_64.rpm`
+ `php-gd-8.1.8-1.amzn2.x86_64.rpm`
+ `php-gmp-8.1.8-1.amzn2.x86_64.rpm`
+ `php-intl-8.1.8-1.amzn2.x86_64.rpm`
+ `php-ldap-8.1.8-1.amzn2.x86_64.rpm`
+ `php-mbstring-8.1.8-1.amzn2.x86_64.rpm`
+ `php-mysqlnd-8.1.8-1.amzn2.x86_64.rpm`
+ `php-odbc-8.1.8-1.amzn2.x86_64.rpm`
+ `php-opcache-8.1.8-1.amzn2.x86_64.rpm`
+ `php-pdo-8.1.8-1.amzn2.x86_64.rpm`
+ `php-pear-1.10.13-1.amzn2.noarch.rpm`
+ `php-pgsql-8.1.8-1.amzn2.x86_64.rpm`
+ `php-process-8.1.8-1.amzn2.x86_64.rpm`
+ `php-pspell-8.1.8-1.amzn2.x86_64.rpm`
+ `php-snmp-8.1.8-1.amzn2.x86_64.rpm`
+ `php-soap-8.1.8-1.amzn2.x86_64.rpm`
+ `php-sodium-8.1.8-1.amzn2.x86_64.rpm`
+ `php-xml-8.1.8-1.amzn2.x86_64.rpm`
+ `php-pecl-imagick-3.7.0-1.amzn2.x86_64.rpm`
+ `php-pecl-imagick-debuginfo-3.7.0-1.amzn2.x86_64.rpm`
+ `php-pecl-imagick-devel-3.7.0-1.amzn2.noarch.rpm`

您可以使用 PEAR 和 PECL 程序包来安装常用扩展。有关 PEAR 的更多信息，请参阅 [PEAR PHP Extension and Application Repository](https://pear.php.net) 网站。有关 PECL 的更多信息，请参阅 [PECL 扩展](https://pecl.php.net)网站。

以下示例命令将安装 Memcached 扩展。

```
$pecl install memcache
```

或者您也可以使用以下方法：

```
$pear install pecl/memcache
```

以下示例命令将安装 Redis 扩展。

```
$pecl install redis
```

或者您也可以使用以下方法：

```
$pear install pecl/redis
```

## 配置 PHP 环境
<a name="php-console"></a>

您可以使用 Elastic Beanstalk 控制台启用到 Amazon S3 的日志轮换，配置应用程序可以从环境中读取的变量以及更改 PHP 设置。

**在 Elastic Beanstalk 控制台中配置 PHP 环境**

1. 打开 [Elastic Beanstalk](https://console.aws.amazon.com/elasticbeanstalk) 控制台，然后**在 “区域” 列表中，选择您**的。 AWS 区域

1. 在导航窗格中，选择 **Environments**（环境），然后从列表中选择环境的名称。

1. 在导航窗格中，选择 **Configuration**（配置）。

1. 在 **Updates, monitoring, and logging**（更新、监控和日志记录）配置类别中，选择 **Edit**（编辑）。

### PHP 设置
<a name="php-console-settings"></a>
+ **Proxy server**（代理服务器）– 要在环境实例上使用的代理服务器。默认情况下，使用 nginx。
+ **Document root**（文档根目录）– 包含您站点的默认页面的文件夹。如果您的欢迎页面不位于源包的根目录，请指定包含该页面且与根路径相关的文件夹。例如，如果欢迎页面位于名为 `/public` 的文件夹中，则为 `public`。
+ **Memory limit**（内存限制）– 允许脚本分配的最大内存量。例如 `512M`。
+ **Zlib output compression**（Zlib 输出压缩）– 设置为 `On` 可压缩响应。
+ **Allow URL fopen**（允许 URL fopen）– 设置为 `Off` 可防止脚本从远程位置下载文件。
+ **Display errors**（显示错误）– 设置为 `On` 可显示要调试的内部错误消息。
+ **Max execution time**（最长执行时间）– 脚本在被环境终止前允许运行的最长时间，单位为秒。

### 日志选项
<a name="php-console-logs"></a>

“日志选项”部分有两个设置：
+ **Instance profile**（实例配置文件）– 指定有权访问与应用程序关联的 Amazon S3 存储桶的实例配置文件。
+ **Enable log file rotation to Amazon S3**（启用到 Amazon S3 的日志轮换）– 指定是否将应用程序的 Amazon EC2 实例的日志文件复制到与应用程序关联的 Amazon S3 存储桶。

### 静态文件
<a name="php-console-staticfiles"></a>

为了提高性能，您可以使用 **Static files**（静态文件）部分配置代理服务器，以便从 Web 应用程序内的一组目录提供静态文件（例如 HTML 或图像）。对于每个目录，您都将虚拟路径设置为目录映射。当代理服务器收到对指定路径下的某个文件的请求时，它将直接提供此文件，而不是将请求路由至您的应用程序。

有关使用配置文件或 Elastic Beanstalk 控制台配置静态文件的详细信息，请参阅 [提供静态文件](environment-cfg-staticfiles.md)。

### 环境属性
<a name="php-console-properties"></a>

在**环境属性**部分，您可以在运行应用程序的 Amazon EC2 实例上指定环境配置设置。这些设置会以密钥值对的方式传递到应用程序。

您的应用程序代码可使用 `$_SERVER` 或 `get_cfg_var` 函数来访问环境属性。

```
$endpoint = $_SERVER['API_ENDPOINT'];
```

请参阅[环境变量和其他软件设置](environments-cfg-softwaresettings.md)了解更多信息。

## 配置的命名空间
<a name="php-namespaces"></a>

您可以使用[配置文件](ebextensions.md)设置配置选项并在部署期间执行其他实例配置。配置选项可以[特定于平台](command-options-specific.md)，也可以应用于整个 Elastic Beanstalk 服务中的[所有平台](command-options-general.md)。配置选项被组织到*命名空间*中。

以下命名空间配置您的代理服务和 PHP 特定选项：
+ [`aws:elasticbeanstalk:environment:proxy:staticfiles`](command-options-general.md#command-options-general-environmentproxystaticfiles) – 配置环境代理以提供静态文件。您可以定义虚拟路径到应用程序目录的映射。
+ [`aws:elasticbeanstalk:environment:proxy`](command-options-specific.md#command-options-php) – 指定环境的代理服务器。
+ [`aws:elasticbeanstalk:container:php:phpini`](command-options-specific.md#command-options-php) – 配置 PHP 特定选项。此命名空间包括 `composer_options`，它在 Elastic Beanstalk 控制台上不可用。此选项设置通过 `composer.phar install` 命令使用 Composer 安装依赖项时要使用的自定义选项。有关此命令的更多信息（包括可用选项），请参阅 *getcomposer.org* 网站上的 [install](https://getcomposer.org/doc/03-cli.md#install-i)。

以下示例[配置文件](ebextensions.md)指定一个静态文件选项，该选项将名为 `staticimages` 的目录映射到路径 `/images`，并显示 `aws:elasticbeanstalk:container:php:phpini` 命名空间中提供的每个选项的设置：

**Example .ebextensions/php-settings.config**  

```
option_settings:
  aws:elasticbeanstalk:environment:proxy:
    ProxyServer: apache
  aws:elasticbeanstalk:environment:proxy:staticfiles:
    /images: staticimages
  aws:elasticbeanstalk:container:php:phpini:
    document_root: /public
    memory_limit: 128M
    zlib.output_compression: "Off"
    allow_url_fopen: "On"
    display_errors: "Off"
    max_execution_time: 60
    composer_options: vendor/package
```

**注意**  
`aws:elasticbeanstalk:environment:proxy:staticfiles` 命名空间未在 Amazon Linux AMI PHP 平台分支（在 Amazon Linux 2 之前）上定义。

Elastic Beanstalk 提供了许多用于自定义环境的配置选项。除了配置文件之外，您还可使用控制台、保存的配置、EB CLI 或 AWS CLI来配置选项。请参阅[配置选项](command-options.md)了解更多信息。

## 安装 Elastic Beanstalk PHP 应用程序的依赖项
<a name="php-configuration-composer"></a>

本主题介绍如何配置您的应用程序以安装其所需的其他 PHP 包。您的应用程序可能具有对其他 PHP 包的依赖项。您可以配置应用程序以在环境的 Amazon Elastic Compute Cloud（Amazon EC2）实例上安装这些依赖项。或者，您也可以将应用程序的依赖项包含在源包中并将它们与应用程序一起部署。以下部分讨论这两种方法。

### 使用 Composer 文件在实例上安装依赖项
<a name="php-configuration-composer.oninstances"></a>

借助位于项目源的根目录中的 `composer.json` 文件，可以使用 Composer 在环境的 Amazon EC2 实例上安装应用程序所需的包。

**Example composer.json**  

```
{
    "require": {
        "monolog/monolog": "1.0.*"
    }
}
```

如果 `composer.json` 文件存在，Elastic Beanstalk 将运行 `composer.phar install` 以安装依赖项。您可以通过在 `aws:elasticbeanstalk:container:php:phpini` 命名空间中设置 [`composer_options` 选项](#php-namespaces)来添加要追加到命令的选项。

### 使依赖项包含在源包中
<a name="php-configuration-composer.inbundle"></a>

如果您的应用程序具有大量依赖项，则安装它们可能需要很长时间。这可能会增加部署和扩展操作，因为需要在每个新实例上安装依赖项。

要避免对部署时间带来负面影响，请在您的开发环境中使用 Composer 解析依赖项并将其安装到 `vendor` 文件夹中。

**使依赖项包含在您的应用程序源包中**

1. 运行如下命令：

   ```
   % composer install
   ```

1. 使生成的 `vendor` 文件夹包含在您的应用程序源包的根目录中。

当 Elastic Beanstalk 在实例上找到 `vendor` 文件夹时，它会忽略 `composer.json` 文件（如果存在）。然后，您的应用程序将使用 `vendor` 文件夹中的依赖项。

## 在 Elastic Beanstalk 上更新 Composer
<a name="php-configuration-composerupdate"></a>

本主题介绍如何配置 Elastic Beanstalk 以使 Composer 保持最新状态。如果您在尝试安装带有 Composer 文件的程序包时看到错误，或者无法使用最新的平台版本，则可能必须更新 Composer。在平台更新之间，您可以通过使用 [`.ebextensions`](ebextensions.md) 文件夹中的配置文件来更新环境实例中的 Composer。

您可以使用以下配置自行更新 Composer。

```
commands:
  01updateComposer:
    command: /usr/bin/composer.phar self-update 2.7.0
```

以下[选项设置](command-options-general.md#command-options-general-elasticbeanstalkapplicationenvironment)设置 `COMPOSER_HOME` 环境变量，其配置 Composer 缓存的位置。

```
option_settings:
  - namespace: aws:elasticbeanstalk:application:environment
    option_name: COMPOSER_HOME
    value: /home/webapp/composer-home
```

您可以将这两者合并到 `.ebextensions` 文件夹中的同一个配置文件中。

**Example .ebextensions/composer.config**  

```
commands:
  01updateComposer:
    command: /usr/bin/composer.phar self-update 2.7.0
    
option_settings:
  - namespace: aws:elasticbeanstalk:application:environment
    option_name: COMPOSER_HOME
    value: /home/webapp/composer-home
```

**注意**  
由于 2024 年 [2 月 22 日 AL2023 平台版本和 2024 年 2 月](https://docs.aws.amazon.com/elasticbeanstalk/latest/relnotes/release-2024-02-22-al2023.html) [28 日平台版本对 Composer 安装进行了更新，](https://docs.aws.amazon.com/elasticbeanstalk/latest/relnotes/release-2024-02-28-al2.html)因此， AL2 如果`COMPOSER_HOME`在自更新执行时设置，Composer 自我更新可能会失败。  
以下组合命令将无法执行：`export COMPOSER_HOME=/home/webapp/composer-home && /usr/bin/composer.phar self-update 2.7.0`  
但是，前面的示例仍然有效。在前面的示例中，`COMPOSER_HOME` 的选项设置不会传递给 `01updateComposer` 执行，也不会在执行自行更新命令时进行设置。

**重要**  
如果您在 `composer.phar self-update` 命令中省略了版本号，则在您每次部署到源代码时，以及 Auto Scaling 预配置新实例时，Composer 将更新到可用的最新版本。如果发行了与您应用程序不兼容的 Composer 版本，这可能导致扩展操作和部署失败。

有关 Elastic Beanstalk PHP 平台，包括 Composer 的版本的更多信息，请参阅文档 *AWS Elastic Beanstalk 平台*中的 [PHP 平台版本](https://docs.aws.amazon.com/elasticbeanstalk/latest/platforms/platforms-supported.html#platforms-supported.PHP)。

## 在 Elastic Beanstalk 配置中扩展 php.ini
<a name="php-configuration-phpini"></a>

使用带有 `files` 块的配置文件可将 `.ini` 文件添加到您的环境中的实例上的 `/etc/php.d/` 中。主配置文件 `php.ini` 按字母顺序从此文件夹中的文件拉入设置。默认情况下，此文件夹中的文件将启用大量扩展。

**Example .ebextensions/mongo.config**  

```
files:
  "/etc/php.d/99mongo.ini":
    mode: "000755"
    owner: root
    group: root
    content: |
      extension=mongo.so
```