php / php/php-src

php_admin_[flag|value] falsely applies config changes

Đang mở
#10,117 1 bình luận 0 reaction 0 người được giao Xem trên GitHub

Chưa có ai nhận issue này.

Bug SAPI: fpm Status: Needs Triage
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.
  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

Hướng dẫn đóng góp

Mở hướng dẫn đóng góp

Bắt đầu từ đâu

  1. Đọc hết issue, rồi đọc hướng dẫn đóng góp của dự án.
  2. 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.
  3. Fork repository và làm thay đổi trên một nhánh.
  4. 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

Nhận issue mới trong hộp thư của bạn

Bản tóm tắt ngắn những issue GitHub phù hợp với người mới.