2

我开始使用 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手册只是给出描述:

指令可能具有多个访问级别,这就是访问显示适当位掩码值的原因。

那么,任何人都可以解释“访问”吗?ans 如何理解它的位掩码值?

4

2 回答 2

9

您是否会在“返回值”部分进一步阅读,您会发现更改模式的链接及其含义:

  • 1::PHP_INI_USER可以在用户脚本中设置条目(如使用 ini_set())或在 Windows 注册表中
  • 4: PHP_INI_SYSTEM: entry可以在php.ini或者httpd.conf中设置
  • 6: PHP_INI_PERDIR: 可以在 php.ini、.htaccess 或 httpd.conf 中设置入口
  • 7::PHP_INI_ALL可以在任何地方设置条目
于 2010-04-17T17:53:17.683 回答
1

正确的值

接受的答案提供了错误的值。因此,我在 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 的加法。

于 2017-03-14T13:13:29.787 回答