2010-04-17 4 views
1

Я начинаю использовать функцию ini_get_all для получения всех параметров конфигурации на общем хост-сервере. в конце концов я получил этот кусок массива:PHP: Как понять значение битовой маски доступа из функции 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 
    ) 

РНР руководство просто дать descripstion:

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

так, может ли кто-нибудь объяснить о «доступе»? ans как понять его битовые маски?

ответ

6

бы вы читали в разделе «Возвращаемое значение» a little further, вы бы нашли link to the change modes и что они означают:

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

wow, спасибо. Честно говоря, я читаю эту страницу (это больше похоже на то, что мои глаза видят это, но мой ум отрицал это) – justjoe

+0

На сегодняшний день цифры для каждого значения, похоже, исчезли с этой страницы, поэтому этот ответ был весьма полезен. Спасибо. – macl

+0

@macl, я рад, что это вам помогло. Если у вас снова будет эта проблема, вы также можете распечатать константы и посмотреть, что они собой представляют. – zneak

0

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

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

Смежные вопросы