Skip to content

FPM: php_value and php_admin_value entries are applied in reverse order [.phpt test included] #13249

@dzuelke

Description

@dzuelke

Description

The following FPM config:

[global]
error_log = {{FILE:LOG}}
[unconfined]
listen = {{ADDR}}
pm = static
pm.max_children = 5
php_value[memory_limit]=32M
php_value[memory_limit]=24M
php_admin_value[date.timezone]=Europe/London
php_admin_value[date.timezone]=Europe/Paris

Resulted in this php-fpm -tt output:

…
[26-Jan-2024 07:24:03] NOTICE: 	php_value[memory_limit] = 24M
[26-Jan-2024 07:24:03] NOTICE: 	php_value[memory_limit] = 32M
[26-Jan-2024 07:24:03] NOTICE: 	php_admin_value[date.timezone] = Europe/Paris
[26-Jan-2024 07:24:03] NOTICE: 	php_admin_value[date.timezone] = Europe/London

But I expected this output instead:

…
[26-Jan-2024 07:24:03] NOTICE: 	php_value[memory_limit] = 32M
[26-Jan-2024 07:24:03] NOTICE: 	php_value[memory_limit] = 24M
[26-Jan-2024 07:24:03] NOTICE: 	php_admin_value[date.timezone] = Europe/London
[26-Jan-2024 07:24:03] NOTICE: 	php_admin_value[date.timezone] = Europe/Paris

Note

This is not just cosmetic ordering in php-fpm -tt; the values are also applied in this order as INI directives, so ini_get() will return 32M and Europe/London instead of the expected 24M and Europe/Paris.


PHPT:

<?php // this is just for GitHub syntax coloring ?>
--TEST--
FPM: GH-13249 - php_value and php_admin_value entries are applied in reverse order
--SKIPIF--
<?php include "skipif.inc"; ?>
--FILE--
<?php

require_once "tester.inc";

$cfg = <<<EOT
[global]
error_log = {{FILE:LOG}}
[unconfined]
listen = {{ADDR}}
pm = static
pm.max_children = 5
php_value[memory_limit]=32M
php_value[memory_limit]=24M
php_admin_value[date.timezone]=Europe/London
php_admin_value[date.timezone]=Europe/Paris
EOT;

$code = <<<EOT
<?php
echo "Test Start\n";
var_dump(ini_get('memory_limit'), ini_get('date.timezone'));
echo "Test End\n";
EOT;

$tester = new FPM\Tester($cfg, $code);
$tester->start();
$tester->expectLogStartNotices();
$tester->request()->expectBody([
    'Test Start',
    'string(3) "24M"',
    'string(12) "Europe/Paris"',
    'Test End'
]);
$tester->terminate();
$tester->close();

?>
Done
--EXPECT--
Done
--CLEAN--
<?php
require_once "tester.inc";
FPM\Tester::clean();
?>

Test log:

---- EXPECTED OUTPUT
Done
---- ACTUAL OUTPUT
>>> Response
----------------- OUT -----------------
X-Powered-By: PHP/8.3.2
Content-type: text/html; charset=UTF-8

Test Start
string(3) "32M"
string(13) "Europe/London"
Test End

----------------- ERR -----------------

---------------------------------------

ERROR: ==> The expected body:
Test Start
string(3) "24M"
string(12) "Europe/Paris"
Test End
==> does not match the actual body:
Test Start
string(3) "32M"
string(13) "Europe/London"
Test End

LOGS:
--------------------------------------------------------------------
[26-Jan-2024 08:55:34] NOTICE: fpm is running, pid 62872
[26-Jan-2024 08:55:34] NOTICE: ready to handle connections
--------------------------------------------------------------------

Done
---- FAILED

PHP Version

PHP 8.3.2

Operating System

No response

Metadata

Metadata

Assignees

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions