[php-src] Issue #10117: php_admin_[flag|value] falsely applies config changes
| From: | pavel-rossinsky | Date: | Fri, 16 Dec 2022 16:28:25 +0000 |
| Subject: | [php-src] Issue #10117: php_admin_[flag|value] falsely applies config changes | ||
| Groups: | php.bugs | ||
| Request: | Send a blank email to php-bugs+get-243167@lists.php.net to get a copy of this message | ||
Issue: https://github.com/php/php-src/issues/10117
Author: pavel-rossinsky
### 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).
2. Apply the fpm pool settings for simplicity of testing:
```
pm = static
pm.max_children = 1
```
3. Add three test scripts to the document root of apache server:
test_opcache.php
```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
<?php
echo __FILE__ . "\n";
```
include_2.php
```php
<?php
echo __FILE__ . "\n";
```
4. Invoke the test_opcache.php to warm up the opcache via curl request or browser.
5. Attach to the child fpm process using strace -p <pid> -e
newfstatat,fstat,stat.
6. 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
```
7. Set php_admin_flag[opcache.enable_file_override] = On in the pool config and restart
apache and fpm.
8. Check if the config value is changed via var_dump(opcache_get_configuration()).
9. Repeat steps 4, 5, and 6. The strace output won't change.
10. 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