我开始使用 ini_get_all 函数来检索共享主机服务器上的所有配置选项。最后我得到了这块数组:
[allow_call_time_pass_reference] => Array
(
[global_value] => 1
[local_value] => 1
[access] => 6
)
[allow_url_fopen] => Array
(
[global_value] => 1
[local_value] => 1
[access] => 4
)
PHP手册只是给出了描述:
指令可能具有多个访问级别,这就是访问显示适当的位掩码值的原因。
那么,有人可以解释一下“访问”吗?如何理解它的位掩码值?
正确的值
接受的答案提供了错误的值。因此,我在 PHP 源代码中查找了它,并找到了可以定义为常量的内容:
define('PHP_INI_USER', 1)
define('PHP_INI_PERDIR', 2)
define('PHP_INI_SYSTEM', 4)
define('PHP_INI_ALL', PHP_INI_USER | PHP_INI_PERDIR | PHP_INI_SYSTEM); // = 7
要从
ini_get_all()
检查访问级别,您可以执行以下操作(以 allow_url_fopen
为例):
$all = ini_get_all();
$config = $all['allow_url_fopen'];
$isUserLevel = $config['access'] & PHP_INI_USER; // PHP_INI_USER = 1
供参考
在 main/php_ini.h 中的 PHP 源代码中,这些常量被定义为 Zend 等效项的别名:
#define PHP_INI_USER ZEND_INI_USER
#define PHP_INI_PERDIR ZEND_INI_PERDIR
#define PHP_INI_SYSTEM ZEND_INI_SYSTEM
#define PHP_INI_ALL ZEND_INI_ALL
https://github.com/php/php-src/blob/c8aa6f3a9a3d2c114d0c5e0c9fdd0a465dbb54a5/main/php_ini.h#L45(第45行到49行)
Zend 等效项在 Zend/zend_ini.h 中定义如下:
#define ZEND_INI_USER (1<<0)
#define ZEND_INI_PERDIR (1<<1)
#define ZEND_INI_SYSTEM (1<<2)
#define ZEND_INI_ALL (ZEND_INI_USER|ZEND_INI_PERDIR|ZEND_INI_SYSTEM)
https://github.com/php/php-src/blob/c8aa6f3a9a3d2c114d0c5e0c9fdd0a465dbb54a5/Zend/zend_ini.h#L24(第24至28行)
<<
是 C++ 中的按位移位运算符,因此 1<<0
= 1、1<<1
= 2、1<<2
= 4。ZEND_INI_ALL
是 1+2+4 = 7 的加法。