PHP: Как понять значение битовой маски доступа из функции ini_get_all - PullRequest
2 голосов
/ 17 апреля 2010

Я начинаю использовать функцию 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 просто дается описание:

Директива может иметь несколько уровней доступа, поэтому доступ показывает соответствующие значения битовой маски.

Итак, кто-нибудь может объяснить, что такое "доступ"? Как понять значения битовой маски?

Ответы [ 2 ]

8 голосов
/ 17 апреля 2010

Если бы вы прочитали чуть дальше в разделе "Возвращаемое значение", вы бы нашли ссылку на режимы изменения и их значение:

  • 1: PHP_INI_USER: запись может быть установлена ​​в пользовательских скриптах (например, с помощью ini_set ()) или в реестре Windows
  • 4: PHP_INI_SYSTEM: запись может быть установлена ​​в php.ini или httpd.conf
  • 6: PHP_INI_PERDIR: запись может быть установлена ​​в php.ini, .htaccess или httpd.conf
  • 7: PHP_INI_ALL: запись может быть установлена ​​где угодно
0 голосов
/ 14 марта 2017

Правильные значения

Принятый ответ дает неправильные значения. Поэтому я посмотрел его в исходном коде 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

Для справки

В исходном коде PHP в main / php_ini.h эти константы определены как псевдонимы эквивалентов 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.

...