The ini loading order is in PLD (as of 7.4.0beta2): - openat(AT_FDCWD, "/etc/php74/php-cli.ini", O_RDONLY) = -1 ENOENT (No such file or directory) - openat(AT_FDCWD, "/etc/php74/php.ini", O_RDONLY) = 4 - openat(AT_FDCWD, "/etc/php74/conf.d", O_RDONLY|O_NONBLOCK|O_LARGEFILE|O_CLOEXEC|O_DIRECTORY) = 4 - openat(AT_FDCWD, "/etc/php74/conf.d/00_curl.ini", O_RDONLY) = 4 - openat(AT_FDCWD, "/etc/php74/conf.d/00_json.ini", O_RDONLY) = 4 - openat(AT_FDCWD, "/etc/php74/conf.d/00_opcache.ini", O_RDONLY) = 4 - openat(AT_FDCWD, "/etc/php74/conf.d/00_xml.ini", O_RDONLY) = 4 - openat(AT_FDCWD, "/etc/php74/conf.d/opcache.ini", O_RDONLY) = 4 - openat(AT_FDCWD, "/etc/php74/conf.d/timezone.ini", O_RDONLY) = 4 - openat(AT_FDCWD, "/etc/php74/cli.d", O_RDONLY|O_NONBLOCK|O_LARGEFILE|O_CLOEXEC|O_DIRECTORY) = 4 - openat(AT_FDCWD, "/etc/php74/cli.d/00_readline.ini", O_RDONLY) = 4 - openat(AT_FDCWD, "/etc/php74/cli.d/php.ini", O_RDONLY) = 4 1. load php-.ini; if exists treat as main php.ini 2. load php.ini if php-.ini was not found 3. load conf.d/DD_*.ini to load extra extension and zend_extension lines 4. load conf.d/*.ini to load extra ini settings not involving loading extension 5. load .d same way as conf.d This allows minimal patch, but still allowing to have main php ini and sapi specific overrides To test which is main php.ini: $ php -r 'var_dump(array(get_cfg_var("cfg_file_path"),php_ini_loaded_file()));' https://github.com/pld-linux/php/commit/762ec2e --- php-8.0.0rc1/main/php_ini.c~ 2020-10-09 18:15:48.000000000 +0300 +++ php-8.0.0rc1/main/php_ini.c 2020-10-09 18:42:20.087488856 +0300 @@ -65,6 +65,11 @@ PHPAPI char *php_ini_scanned_path=NULL; PHPAPI char *php_ini_scanned_files=NULL; +static int php_csort(const struct dirent **a, const struct dirent **b) +{ + return strcmp((*a)->d_name,(*b)->d_name); +} + /* {{{ php_ini_displayer_cb */ static ZEND_COLD void php_ini_displayer_cb(zend_ini_entry *ini_entry, int type) { @@ -661,12 +666,14 @@ int php_init_config(void) zend_llist scanned_ini_list; zend_llist_element *element; int l, total_l = 0; + const char *fmt = "%s:" PHP_CONFIG_FILE_PATH "/%s.d"; char *bufpath, *debpath, *endpath; int lenpath; zend_llist_init(&scanned_ini_list, sizeof(char *), (llist_dtor_func_t) free_estring, 1); - bufpath = estrdup(php_ini_scanned_path); + bufpath = emalloc(strlen(php_ini_scanned_path) + strlen(fmt) + strlen(sapi_module.name)); + sprintf(bufpath, fmt, php_ini_scanned_path, sapi_module.name); for (debpath = bufpath ; debpath ; debpath=endpath) { endpath = strchr(debpath, DEFAULT_DIR_SEPARATOR); if (endpath) { @@ -679,7 +686,7 @@ int php_init_config(void) } lenpath = (int)strlen(debpath); - if (lenpath > 0 && (ndir = php_scandir(debpath, &namelist, 0, php_alphasort)) > 0) { + if (lenpath > 0 && (ndir = php_scandir(debpath, &namelist, 0, php_csort)) > 0) { for (i = 0; i < ndir; i++) {