# PHP 扩展与设置

Source: https://support.kapsulehost.com/zh-cn/php-extensions-and-ini

KapsuleHost网站托管为WordPress、WooCommerce和PHP网站提供哪些PHP版本和扩展，您可以自行更改哪些设置，以及为什么更改最多需要五分钟才能生效。

静态、Node.js和Python网站不运行PHP。与网站相关的所有PHP事务都集中在一个位置：**网站**，点击该网站，**设置**，然后**PHP**。该页面包含版本选择器、您可以更改的设置、Composer运行器，以及PHP错误日志。

![KPanel中某网站的PHP页面，包含版本选择器和您可以更改的设置](https://support.kapsulehost.com/help/screenshots/php-extensions-and-ini.2214ab47.webp)

## 选择PHP版本

可选四个版本：**8.4、8.3、8.2和8.1**。新建网站默认使用8.3。

请选择您的软件实际支持的最新版本。较新的PHP速度明显更快，且安全修复的支持周期也更长。之所以不建议直接跳到最新版本，是出于兼容性考虑：一个旧插件或多年前编写的自定义代码，在从未测试过的版本上可能会直接失败。

要更改版本，选择相应版本后点击**应用版本**。更改会立即生效，您无需进行任何重启操作，也不会造成任何停机。

> **Tip:** 请先在预发布环境中更改PHP版本，逐页点击检查网站，确认无误后再在生产环境中更改。如果您必须在生产环境中直接操作，请选择您能够实时监控的时段进行，并且要知道切换回旧版本只需一次点击。另请参阅[预发布环境](https://support.kapsulehost.com/zh-cn/staging-environments)。

如果版本更改导致网站出现问题，请切换回之前的版本并查看日志。错误信息会指出无法运行的文件。另请参阅[更改PHP版本](https://support.kapsulehost.com/zh-cn/changing-php-version)和[错误日志](https://support.kapsulehost.com/zh-cn/error-logs)。

## 您可以更改的设置

PHP页面以下拉菜单的形式提供五项设置。这些设置之所以被展示出来，正是因为它们在实践中最容易引发问题。

| 设置 | 默认值 | 可选值 | 控制内容 |
|---|---|---|---|
| `memory_limit` | 256M | 128M、256M、512M、1024M、2048M | 单次请求可使用的内存量 |
| `max_execution_time` | 30 | 30、60、120、300、600 | 单次请求可运行的秒数 |
| `upload_max_filesize` | 64M | 16M、32M、64M、128M、256M | 可上传的最大单个文件大小 |
| `post_max_size` | 65M | 17M、33M、65M、129M、257M | 最大的表单提交总大小 |
| `max_input_vars` | 3000 | 1000、3000、5000、10000 | 单次提交可包含的最大字段数 |

您需要调整的设置取决于具体情况：

- **超过一定大小的上传失败**：请提高`upload_max_filesize`，并同步提高`post_max_size`。
- **大型表单或页面构建器在保存时丢失字段**：请提高`max_input_vars`。这个问题很隐蔽也很令人困扰，因为不会出现任何错误提示，多余的字段只是被默默丢弃了。
- **页面在加载到一半时无故中断，且没有任何错误提示**：请提高`memory_limit`。另请参阅[WordPress内存限制](https://support.kapsulehost.com/zh-cn/wordpress-memory-limit)。
- **长时间的导入或导出操作超时**：请提高`max_execution_time`，并考虑改用命令行来执行该任务。另请参阅[WP-CLI](https://support.kapsulehost.com/zh-cn/wordpress-wp-cli)。

> **Note:** `post_max_size`必须大于`upload_max_filesize`，因为上传内容是随表单一起提交的。如果您选择的组合不满足这一条件，平台会自动将`post_max_size`上调以符合要求。这就是为什么您有时会看到一个并非自己选择的数值。

## 为什么更改最多需要五分钟才能生效

这是本页面最常见的困惑之处，因此有必要说清楚。

您的设置会被写入您网站文档根目录下的一个`.user.ini`文件。PHP会读取该文件，然后**将其缓存300秒**，也就是五分钟。在该缓存过期之前，PHP会继续使用之前的数值。

因此，在保存更改之后：

- 页面在最多五分钟内仍会显示旧的限制值。
- `phpinfo()`在最多五分钟内仍会显示旧的限制值。
- 强制刷新无济于事，清除浏览器缓存同样无济于事。
- 您无需重启任何内容，实际上也无法重启。只需耐心等待即可。

如果已经超过五分钟，数值仍未发生变化，那就说明确实出现了问题，值得提交工单。

## 自行编辑`.user.ini`

如果您愿意，也可以通过SFTP或SSH直接编辑`.user.ini`，或者在需要设置面板未提供的指令时这样做。该文件位于您网站的文档根目录下。另请参阅[SFTP访问](https://support.kapsulehost.com/zh-cn/sftp-access)。

格式为每行一条指令：

```ini
memory_limit = 512M
max_execution_time = 120
```

关于`.user.ini`能做什么，有两个重要限制：

**它只对PHP允许按目录或按用户设置的指令生效。**上述五项设置均符合条件。只能在系统级别设置的指令，例如`disable_functions`或通过`extension=`加载扩展，在`.user.ini`文件中会被忽略。它们不会报错，只是悄无声息地不起作用，这正是许多人为此耗费一整个下午的原因。

**面板只能读取简单的键名。**包含点号的指令，例如`opcache.enable`或`date.timezone`，PHP会正常遵循，但不会显示在面板的表单中。如果您手动设置了此类指令，之后又通过面板更改了其他设置，请事后检查该文件。

> **Warning:** KapsuleHost网站托管运行的是nginx，而非Apache。`.htaccess`文件不会被任何程序读取。放置在`.htaccess`文件中的PHP指令，例如`php_value memory_limit`，在这里完全不起作用。请改用`.user.ini`或面板设置。另请参阅[WordPress与.htaccess](https://support.kapsulehost.com/zh-cn/wordpress-htaccess)。

## 有哪些扩展可用

标准构建的扩展范围很广，涵盖了WordPress、WooCommerce和大多数PHP应用程序所需要的一切。

**数据库**：`mysqli`、`pdo_mysql`、`sqlite3`、`pdo_sqlite`
**图像**：`gd`、`imagick`、`exif`
**缓存**：`Zend OPcache`、`redis`、`memcached`
**文本与区域设置**：`mbstring`、`iconv`、`intl`、`gettext`、`ctype`
**XML与数据**：`dom`、`simplexml`、`xml`、`xmlreader`、`xmlwriter`、`xsl`、`json`
**网络**：`curl`、`soap`、`sockets`、`ftp`、`openssl`
**数学与加密**：`bcmath`、`sodium`、`hash`、`random`
**文件与系统**：`fileinfo`、`zip`、`zlib`、`phar`、`posix`、`pcntl`、`shmop`、`calendar`、`tokenizer`

有一点版本差异值得了解：`imap`扩展在8.3及更早版本中存在，但在8.4中不存在，因为该扩展在该版本中已从PHP本身移除。如果您的应用程序仍然需要它，请保留在8.3版本，或将该应用程序迁移到现代的邮件处理库。

**未安装的组件**：PostgreSQL驱动程序、MongoDB、Xdebug、`mcrypt`，以及ionCube和SourceGuardian等商业代码加载器。

您无法自行从面板中启用或禁用扩展。如果您的应用程序需要列表之外的某个扩展，请提交工单并说明您所运行的内容。能否添加该扩展取决于扩展本身的情况。另请参阅[提交支持工单](https://support.kapsulehost.com/zh-cn/opening-a-support-ticket)。

## 检查实际加载的内容

与其猜测，不如直接确认：

- **在WordPress中**：依次打开工具、站点健康、信息、服务器。其中会列出PHP版本及相关限制。
- **通过SSH**：使用`php -v`查看版本，使用`php -m`查看已加载的扩展。另请参阅[添加SSH密钥](https://support.kapsulehost.com/zh-cn/adding-ssh-keys)。

> **Warning:** 请勿在您的网站根目录中保留`phpinfo()`文件。它会向任何发现它的人公开您的路径、扩展和配置信息，而自动化扫描工具正是专门寻找这个文件名的。如果您创建该文件用于检查某些内容，请在检查完毕后立即删除。

## 相关指南

- [更改PHP版本](https://support.kapsulehost.com/zh-cn/changing-php-version)
- [WordPress内存限制](https://support.kapsulehost.com/zh-cn/wordpress-memory-limit)
- [错误日志](https://support.kapsulehost.com/zh-cn/error-logs)
- [HTTP错误代码](https://support.kapsulehost.com/zh-cn/http-error-codes)
- [网站运行缓慢与资源限制](https://support.kapsulehost.com/zh-cn/site-slow-resource-limits)
- [WordPress与.htaccess](https://support.kapsulehost.com/zh-cn/wordpress-htaccess)
- [托管词汇表](https://support.kapsulehost.com/zh-cn/glossary)
