Ubuntu 16.04 服务器:增加 PHP 内存限制

要增加在 Ubuntu 16.04 上作为 Apache 模块运行的 PHP 的内存限制,请在相应的 PHP php.ini 文件中更改 memory_limit 值,然后重启 Apache 并在 web 请求中检查应用的值。因为 PHP-FPM 或 CLI PHP 可能使用不同的配置文件,所以需要先检查执行方式。

适用范围及修改前的验证

本文是基于 Ubuntu 16.04 上 PHP 7.0 和 Apache 模块检查现有服务器的示例。Ubuntu 16.04 的常规安全支持已经结束,在延长安全维护之后,可能适用单独的遗留支持。请在 Ubuntu 安全维护计划 中检查适用范围,并计划迁移到受支持的环境。

memory_limit 是一个限制 PHP 脚本可以分配内存的设置。它不是服务器上已安装物理内存的最大值,也不是多个请求共享的总内存。根据同时请求的数量,增加限制可能会增加服务器的内存负担,因此请检查可用内存和实际错误。默认值可能因 PHP 设置和应用程序而异。

在网页上查找PHP使用的设置

在Ubuntu 16.04上PHP 7.0 Apache模块的基本安装中,/etc/php/7.0/apache2/php.ini 被使用。然而,路径可能会根据PHP版本、安装方法和单独的配置而有所不同。PHP-FPM通常使用单独的fpm/php.ini,而且不应假设命令行的php --ini结果与网页请求的设置相匹配。

在受限的测试环境中,在网页文档目录中创建一个临时PHP文件,并插入以下代码。通过浏览器打开该文件以检查执行方式、配置文件路径和当前限制。不要将其放在公共环境中,因为服务器信息如文件路径将被暴露,并在检查后立即删除。

<?php
header('Content-Type: text/plain; charset=UTF-8');
echo 'SAPI: ' . PHP_SAPI . "\n";
echo 'Loaded ini: ' . php_ini_loaded_file() . "\n";
echo 'memory_limit: ' . ini_get('memory_limit') . "\n";

如果是 apache2handler,则使用 Apache 模块方法;如果是 fpm-fcgi,则使用 PHP-FPM 方法。如果配置文件未出现或与预期不同,请检查安装情况及与 Web 服务器的连接。除默认文件外,PHP 可能会读取额外的 .ini 文件或者其值可能被应用程序或服务器设置覆盖。更多详细信息,请参阅 PHP 配置文件文档。

修改 memory_limit

以下是当在 Web 上检查的路径为 /etc/php/7.0/apache2/php.ini 时的示例。如果路径不同,请应用到实际检查的文件中。编辑前,请确保尚无备份文件,如果存在,请将以下命令中的备份名称更改为新名称。

sudo cp -a -n /etc/php/7.0/apache2/php.ini /etc/php/7.0/apache2/php.ini.before-memory-limit
sudo nano /etc/php/7.0/apache2/php.ini

在编辑器中找到现有的 memory_limit 设置,将其更改为所需的值,然后保存。例如,如果现有值是 128M,而你发现任务需要更多,可以尝试 256M。以下值仅为示例,并非适用于所有服务器的推荐值。

memory_limit = 256M

值 -1 删除了限制;不要随意使用它来解决问题。内存不足的原因可能是输入过大、代码效率低或并发请求。各值的含义可以在 PHP memory_limit 描述 中找到。

应用于 Apache 并检查

在 Apache 模块方式下,首先运行配置检查。Syntax OK 应出现以继续下一步。如果检查失败,请解决错误后再次检查。此检查验证 Apache 配置,但不保证 PHP 限制在网页请求中正确生效。

sudo apache2ctl configtest

如果检查成功,请在适当的时间重启 Apache。重启可能会影响连接和正在进行的请求,因此请在生产环境中评估影响。

sudo systemctl restart apache2
sudo systemctl status apache2

确认服务正常运行,并请求先前创建的受限访问 PHP 检查文件,以查看 memory_limit 是否显示预期值。检查完成后,删除临时文件。同时,确保在实际应用中错误不会再次出现。

在 PHP-FPM 的情况下,仅更新上述 Apache 模块文件并重启可能无法应用 FPM 设置。请检查实际加载的 FPM 配置文件及正在使用的服务名称,并按照该服务的配置检查和重启流程操作。

当设置未生效或出现问题时

如果网页上检查的值不同,请检查编辑的路径、PHP 版本和执行方式是否正确。该值也可能在其他 .ini 文件、Apache 设置、FPM 池设置以及应用程序的 ini_set() 中有所不同。如果即使更改后仍出现内存错误,则需要同时查看错误日志、工作详情和服务器内存使用情况。

如果您需要还原更改,请检查备份的配置文件内容并将其恢复到原始文件,然后再次执行 Apache 配置检查和服务重启。如果备份路径与示例不同,请使用实际的备份路径。您也可以在恢复之前单独保留当前配置以比较更改。