php / php/php-src

php_admin_[flag|value] falsely applies config changes

未关闭
#10,117 1 条评论 0 个 reaction 已指派 0 人 在 GitHub 查看

还没有人认领这个 Issue。

Bug SAPI: fpm Status: Needs Triage
主要语言
C
星标
40.4k
派生
8.2k
平均合并
2 天 15 小时
30 天内合并 PR
103

描述

Description
Quick explanation of the problem.

When using strace I noticed stat system calls for the files already in opcache, even though opcache.enable_file_override is set to 1. The system calls are triggered by is_file() being invoked from PHP.

php_admin_flag[opcache.enable_file_override] = On is set in the pool config /etc/php/8.1/fpm/pool.d/www.conf

var_dump(opcache_get_configuration()) when being invoked through an fpm process says:

["opcache.enable_file_override"]=>
  | bool(true)

phpinfo() says the same, enable_file_override is On.

I suspect the actual value of the flag is Off.

How to reproduce the issue.
  1. Ensure that opcache is enabled and enable_file_override is disabled (disabled by default). Also, set in the ini file:
opcache.file_update_protection=0
opcache.validate_permission=0
opcache.validate_timestamps=0
  1. Apply the fpm pool settings for simplicity of testing:
pm = static
pm.max_children = 1
  1. Add three test scripts to the document root of apache server:
    test_opcache.php
<?php

echo "test begin\n";

$file1 = 'include_1.php';
$file2 = 'include_2.php';

if (is_file($file1)) {
    include $file1;
}

if (is_file($file2)) {
    include $file2;
}

echo "test end\n";

plus two more scripts in the same directory:
include_1.php

<?php

echo __FILE__ . "\n";

include_2.php

<?php

echo __FILE__ . "\n";
  1. Invoke the test_opcache.php to warm up the opcache via curl request or browser.
  2. Attach to the child fpm process using strace -p <pid> -e newfstatat,fstat,stat.
  3. Invoke the test_opcache.php again. Expected strace output:
newfstatat(AT_FDCWD, "/", {st_mode=S_IFDIR|0755, st_size=4096, ...}, 0) = 0
newfstatat(AT_FDCWD, "include_1.php", {st_mode=S_IFREG|0644, st_size=29, ...}, 0) = 0
newfstatat(AT_FDCWD, "include_2.php", {st_mode=S_IFREG|0644, st_size=29, ...}, 0) = 0
  1. Set php_admin_flag[opcache.enable_file_override] = On in the pool config and restart apache and fpm.
  2. Check if the config value is changed via var_dump(opcache_get_configuration()).
  3. Repeat steps 4, 5, and 6. The strace output won't change.
  4. Set opcache.enable_file_override=1 in the php.ini file and repeat steps 4, 5, and 6. The output will change to
newfstatat(AT_FDCWD, "/", {st_mode=S_IFDIR|0755, st_size=4096, ...}, 0) = 0
Conclusion

The opcache.enable_file_override flag works only when it's set in the ini file.
The worst thing is that setting the flag in the pool config gives a false positive result in opcache_get_configuration() and phpinfo(), which might be very misleading.

PHP Version

PHP 8.1.13

Operating System

Ubuntu 18.04

贡献指南

打开贡献指南

从这里开始

  1. 先读完整个 Issue,再读项目的贡献指南。
  2. 在 Issue 下留言说明你要接手 —— 这能避免两个人做同样的事。
  3. Fork 仓库,在一个分支上完成修改。
  4. 提交 Pull Request,并在描述里引用这个 Issue 编号。

调研方向

首先跟踪 /etc/php/8.1/fpm/pool.d/www.conf 中的 php_admin_flag[opcache.enable_file_override] 是如何应用的,并将其与 php.ini 中的 opcache.enable_file_override 进行比较。使用 opcache_get_configuration()、phpinfo() 和 strace 重现来验证,在启用 pool 设置时,报告的值和 file-stat 行为是否一致。

由索引模型根据 Issue 内容生成。

评估

技术栈
c
领域
backend, performance
Issue 类型
缺陷
难度
4/5
预计耗时
3-5 天
活跃度
停滞
描述清晰度
基本清楚
新手友好度
45/100

把新 issue 发到你的邮箱

精选适合新手参与的 GitHub issue 摘要。