php_admin_[flag|value] falsely applies config changes
Chưa có ai nhận issue này.
- Ngôn ngữ chính
- C
- Star
- 40.4k
- Fork
- 8.2k
- Merge trung bình
- 2 ngày 13 giờ
- Pull request đã merge (30 ngày)
- 96
Mô tả
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.
- 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
- Apply the fpm pool settings for simplicity of testing:
pm = static
pm.max_children = 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";
- Invoke the test_opcache.php to warm up the opcache via curl request or browser.
- Attach to the child fpm process using
strace -p <pid> -e newfstatat,fstat,stat. - 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
- Set
php_admin_flag[opcache.enable_file_override] = Onin the pool config and restart apache and fpm. - Check if the config value is changed via var_dump(opcache_get_configuration()).
- Repeat steps 4, 5, and 6. The strace output won't change.
- 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
Hướng dẫn đóng góp
Bắt đầu từ đâu
- Đọc hết issue, rồi đọc hướng dẫn đóng góp của dự án.
- Bình luận trên issue rằng bạn sẽ nhận — tránh hai người làm cùng một việc.
- Fork repository và làm thay đổi trên một nhánh.
- Mở pull request có tham chiếu số hiệu của issue.
Hướng nghiên cứu
Bắt đầu bằng cách theo dõi cách php_admin_flag[opcache.enable_file_override] trong /etc/php/8.1/fpm/pool.d/www.conf được áp dụng, đồng thời so sánh với opcache.enable_file_override trong php.ini. Sử dụng opcache_get_configuration(), phpinfo() và bản tái hiện bằng strace để xác minh rằng giá trị được báo cáo và hành vi file-stat khớp nhau khi thiết lập pool được bật.
Do mô hình lập chỉ mục viết ra từ nội dung của issue.
Đánh giá
- Công nghệ
- c
- Lĩnh vực
- backend, performance
- Loại issue
- Lỗi
- Độ khó
- 4/5
- Thời gian dự kiến
- 3-5 ngày
- Mức độ hoạt động
- Đình trệ
- Độ rõ ràng
- Khá rõ ràng
- Mức phù hợp với người mới
- 45/100