아래 모드는 PHP 설정을 언제, 어디서 설정할 수 있는지 결정하고, 매뉴얼의 각 지시어는 이 모드를 참조합니다. 예를 들어, 몇몇 설정은 PHP 스크립트 안에서 ini_set()으로 설정할 수 있지만, 어떤 설정은 php.ini 나 httpd.conf 에서만 설정이 가능합니다.

예를 들어, output_buffering 설정은 PHP_INI_PERDIR 이므로 ini_set()으로 설정할 수 없지만, display_errors 은 PHP_INI_ALL 이므로 ini_set()을 포함하여 php.ini, .htaccess, httpd.conf 에서 설정할 수 있습니다.

모 드 설 명
PHP_INI_USER Ini_set 이나 윈도우의 레지스트리에서 설정
PHP_INI_PERDIR php.ini, .htaccess, httpd,.conf 에서 설정
PHP_INI_SYSTEM php.ini, httpd.conf 에서 설정
PHP_INI_ALL php,ini, .htaccess, httpd.conf, ini_set 에서 설정

.htaccess 에 설정할 경우 스크립트 내에만 가능한 상수나 $로 시작하는 변수는 사용할 수 없습니다.


php 설정목록을 얻거나 변경하는 함수

php 에서는 설정파일의 일부(또는 전체)의 목록을 얻거나 일시적으로 강제로 설정을 변경하거나 복구할 수 있는 기능을 제공합니다.

다음은 php.ini의 모든 설정목록을 배열로 가져 오게 합니다.

<?php 
 // php.ini 의 모든 설정옵션을 배열로 가져옵니다.

 echo php_ini_loaded_file()
 // 결과: C:\php\php.ini

 $ini_array = parse_ini_file(php_ini_loaded_file(), true);  
 print_r($ini_array);
 /* 
 결과: 
 Array 
 ( 
    [allow_call_time_pass_reference] => Array 
        ( 
            [global_value] => 0 
            [local_value] => 0 
            [access] => 6 
        ) 

    [allow_url_fopen] => Array 
        ( 
            [global_value] => 1 
            [local_value] => 1 
            [access] => 4 
        ) 

    ... 

 ) 
 */
 ?>

<?php 
 $ini_array = ini_get_all(); 
 /* 
 결과: 
 Array 
 ( 
    [allow_call_time_pass_reference] => Array 
        ( 
            [global_value] => 0 
            [local_value] => 0 
            [access] => 6 
        ) 

    [allow_url_fopen] => Array 
        ( 
            [global_value] => 1 
            [local_value] => 1 
            [access] => 4 
        ) 

    ... 

 ) 
 */ 
 ?>

다음은 설정옵션중 단일의 옵션을 가져 옵니다.

<?php 
 // 설정옵션중 session 에 대한 설정 목록만을 전부 가져 옵니다. 
 print_r(ini_get_all("session")); 

 /* 
 결과: 
 Array 
 ( 
    [session.auto_start] => Array 
        ( 
            [global_value] => 0 
            [local_value] => 0 
            [access] => 7 
        ) 

    [session.bug_compat_42] => Array 
        ( 
            [global_value] =>  
            [local_value] =>  
            [access] => 7 
        ) 
   ... 
 } 
 */ 


 // 하나의 설정 옵션을 가져옵니다. 
 echo get_cfg_var("session.save_handler"); 

 echo ini_get("session.save_handler"); 

 // 결과: files 
 ?>

다음은 설정 옵션을 강제 변경하는 함수입니다. 그러나 실제 설정 옵션이 변경되는 것은 아니며, 강제 변경은 일부 요소만 가능한 부분입니다.

<?php
 echo ini_get('display_errors');

 if (!ini_get('display_errors')) {
    ini_set('display_errors', 1);
 }

 echo ini_get('display_errors');
 ?>


ini 구성파일을 읽기 좋게 구문 배열로 반환하는 함수

array parse_ini_file ( string $filename [, bool $process_sections = false [, int $scanner_mode = INI_SCANNER_NORMAL ]] ) (PHP 4, PHP 5)

이 함수는 ini 구성파일을 읽기 좋게 구문 배열로 반환해 줍니다. 쉽게 설명하면 user.ini 구성파일에 다음 내용이 있다고 가정하겠습니다.

 ; user.ini
 ; 이 파일은 샘플 구성파일입니다.
 ; 문자 앞에 ;를 넣으면 주석문자로 처리해 줍니다.

 [first_section]
 one = 1
 five = 5

 ; BIRD php 에서 상수로 정의하겠습니다.
 animal = BIRD

 [second_section]
 path = "/usr/local/bin"
 URL = "http://www.example.com/~username"

 [third_section]
 phpversion[] = "5.0"
 phpversion[] = "5.1"
 phpversion[] = "5.2"
 phpversion[] = "5.3"

parse_ini_file 함수로 읽어 들이면, 다음과 같이 배열로 받아 오게 됩니다.

<?php
 define('BIRD', 'Dodo bird'); 

 // ex. #1
 $ini_array = parse_ini_file("user.ini"); 
 print_r($ini_array); 

 // ex. #2
 $ini_array = parse_ini_file("user.ini", true); 
 print_r($ini_array); 

 /* 
 결과: 
 Array ( 
    [one] => 1 
    [five] => 5 
    [animal] => Dodo bird 
    [path] => /usr/local/bin 
    [URL] => http://www.example.com/~username 
    [phpversion] => Array 
        ( 
            [0] => 5.0 
            [1] => 5.1 
            [2] => 5.2 
            [3] => 5.3 
        )  
 )
 Array ( 
    [first_section] => Array 
        ( 
            [one] => 1 
            [five] => 5 
            [animal] => Dodo bird 
        ) 
    [second_section] => Array 
        ( 
            [path] => /usr/local/bin 
            [URL] => http://www.example.com/~username 
        ) 
    [third_section] => Array 
        ( 
            [phpversion] => Array 
                ( 
                    [0] => 5.0 
                    [1] => 5.1 
                    [2] => 5.2 
                    [3] => 5.3 
                ) 
        ) 
 ) 
 */ 
 ?>

구성파일로 에러 페이지를 만들어 보겠습니다.

 ; user.ini
 ; 이 파일은 샘플 구성파일입니다.
 ; 문자 앞에 ;를 넣으면 주석문자로 처리해 줍니다.

 [error]
 file_uploaded = "업로드중 에러가 발생하였습니다."
 file_moveuploaded = "업로드파일 이동중 에러가 발생하였습니다."
 file_maxuploaded = "업로드파일용량을 초과하였습니다."

 [method]
 get = "GET 으로 전송합니다."
 post = "POST 로 전송합니다."
 var = "var 변수가 정의되지 않았습니다."
 ; ...

<?php
 $ini_array = parse_ini_file("user.ini", true); 
 print_r($ini_array); 

 /* 
 결과: 
 Array( 
    [error] => Array 
        ( 
            [file_uploaded] => 업로드중 에러가 발생하였습니다. 
            [file_moveuploaded] => 업로드파일 이동중 에러가 발생하였습니다. 
            [file_maxuploaded] => 업로드파일용량을 초과하였습니다. 
        ) 
  
    [method] => Array 
        ( 
            [get] => GET 으로 전송합니다. 
            [post] => POST 로 전송합니다. 
            [var] => var 변수가 정의되지 않았습니다.
        ) 
 ) 
 */ 
 ?>

비교 검색후 에러 표시는 다음과 같이 처리하면 됩니다.

<?php 
 $ini_array = parse_ini_file("user.ini", true); 

 if(!@$var){ 
    echo $ini_array['method']['var']; 
 } 
 // 결과: var 변수가 정의되지 않았습니다.
 ?>

이제 클레스로 만들어 보겠습니다.

 ; settings.ini

 [General]
 url = "http://www.example.com"

 [Database]
 host = localhost
 username = user
 password = password
 db = cms
 adapter = mysqli

<?php 
 class Settings {  
    private static $instance;  
    private $settings;  
     
    private function __construct($ini_file) {  
        $this->settings = parse_ini_file($ini_file, true);  
    }  
     
    public static function getInstance($ini_file) {  
        if(! isset(self::$instance)) {  
            self::$instance = new Settings($ini_file);             
        }  
        return self::$instance;  
    }  
     
    public function __get($setting) {  
        if(array_key_exists($setting, $this->settings)) {  
            return $this->settings[$setting];  
        } else {  
            foreach($this->settings as $section) {  
                if(array_key_exists($setting, $section)) {  
                    return $section[$setting];  
                }  
            }  
        }  
    }  
 } // end class 

  
 $settings = Settings::getInstance('settings.ini');  
 echo $settings->url; // 결과: http://www.example.com

 print_r($settings->Database);  
 /* 
 결과 
 Array(  
    [host] => localhost  
    [username] => user  
    [password] => password  
    [db] => cms  
    [adapter] => mysqli  
 )  
 */ 


 echo $settings->db;
 // 결과: cms  
 ?>

현재 운영중인 서버의 환경정보를 배열로 가져 오겠습니다.

<?php 
 // php_ini_loaded_file 함수는 php.ini 설정파일의 경로를 가져옵니다.
 // 가능하면 보안상 php_ini_loaded_file 이 사용되지 않도록 해야 합니다.

 echo php_ini_loaded_file()
 // 결과: C:\php\php.ini

 $ini_array = parse_ini_file(php_ini_loaded_file(), true);  
 print_r($ini_array);  
 ?>

0 댓글