.user.ini 文件在 Magento 2 中的工作原理

PHP 自动加载机制

当 PHP 处理请求时,它会自动在当前目录和所有父目录中查找 .user.ini 文件,并应用其中的配置。这意味着:

  • 如果您将 .user.ini 放在 Magento 2 根目录,它会影响所有请求
  • 如果您放在特定子目录,它只影响该目录及其子目录的请求

Magento 2 目录结构中的位置

对于典型的 Magento 2 安装,您应该将 .user.ini 放在根目录:

/var/www/html/magento2/
├── .user.ini          ← 放在这里
├── app/
├── pub/
├── var/
└── ...

创建和配置 .user.ini

在 Magento 2 根目录创建 .user.ini 文件:

cd /path/to/magento2
nano .user.ini

添加所需配置,例如增加内存限制:

; Magento 2 推荐的内存设置
memory_limit = 2G
max_execution_time = 1800
max_input_time = 180
realpath_cache_size = 10M
realpath_cache_ttl = 7200
opcache.enable = 1
opcache.memory_consumption = 512

如何理解「通过 .user.ini 修改内存」

1. 配置层级理解

PHP 配置按优先级从高到低:

2. 内存修改的实际过程

当您在 .user.ini 中设置 memory_limit = 2G

  1. PHP 初始化:PHP 启动时读取主 php.ini 文件
  2. 目录遍历:处理请求时,PHP 从当前脚本目录向上查找 .user.ini
  3. 配置应用:找到 .user.ini 后,应用其中的配置设置
  4. Magento 执行:Magento 2 在已调整的内存限制下运行

3. 验证配置是否生效

在 Magento 2 中创建测试文件验证配置:

php

<?php
// 在 pub/test-memory.php 创建文件
require_once '../app/bootstrap.php';

use Magento\Framework\App\Bootstrap;
use Magento\Framework\App\Http;

$bootstrap = Bootstrap::create(BP, $_SERVER);
$app = $bootstrap->createApplication(Http::class);

echo "Current memory limit: " . ini_get('memory_limit') . "\n";
echo "Max execution time: " . ini_get('max_execution_time') . "\n";

// 测试内存使用
$memory_usage = memory_get_usage(true);
$peak_memory = memory_get_peak_usage(true);
echo "Memory usage: " . round($memory_usage / 1024 / 1024, 2) . " MB\n";
echo "Peak memory usage: " . round($peak_memory / 1024 / 1024, 2) . " MB\n";

访问 http://your-magento-site.com/test-memory.php 查看输出。

完成后务必删除测试文件

bash

rm /path/to/magento2/pub/test-memory.php

Magento 2 中更好的替代方案

虽然可以使用 .user.ini,但对于 Magento 2,以下方法更为常见和可靠:

1. 通过 Magento 引导文件设置

编辑 pub/index.php 和 pub/static.php 等入口文件,在开头添加:

php

<?php
// 在现有代码之前添加内存设置
ini_set('memory_limit', '2G');
ini_set('max_execution_time', 1800);
// ... 其他现有代码

2. 通过 PHP-FPM 池配置(推荐)

如果您使用 PHP-FPM,在池配置中设置更为合适:

ini

; /etc/php/8.1/fpm/pool.d/www.conf
php_admin_value[memory_limit] = 2G
php_admin_value[max_execution_time] = 1800
php_admin_value[realpath_cache_size] = 10M

3. 通过 .htaccess(仅适用于 Apache + mod_php)

在 Magento 2 的 .htaccess 文件中添加:

<IfModule mod_php7.c>
    php_value memory_limit 2G
    php_value max_execution_time 1800
</IfModule>

重要注意事项

  1. 性能影响:PHP 会在每个请求中检查 .user.ini 文件是否被修改
  2. 安全性:确保 .user.ini 不能被公开访问
  3. 配置限制:不是所有 PHP 指令都能在 .user.ini 中使用
  4. 优先级:脚本中的 ini_set() 调用会覆盖 .user.ini 的设置

总结

  • Magento 2 不直接读取 .user.ini,但受益于 PHP 的自动加载机制
  • .user.ini 修改内存意味着通过目录级别的 PHP 配置调整内存限制
  • 对于 Magento 2,更推荐使用 PHP-FPM 池配置或修改入口文件的方式
  • 始终验证配置是否生效,特别是内存相关的设置

对于生产环境的 Magento 2 商店,建议使用 PHP-FPM 池配置来管理 PHP 设置,这样更稳定且性能更好。.user.ini 更适合开发环境或无法访问服务器主配置的情况。

发表评论