phpsource/파일분석2003. 6. 25. 10:22
0.0.1 (2003년 6월 25일)
0.0.1 베타 (2003년 5월 30일)
  •  베타버전으로 공개

'phpsource > 파일분석' 카테고리의 다른 글

{INI 파일}6.parse_ini_file()  (0) 2003.06.25
{INI 파일}5.값의 평가  (0) 2003.06.25
{INI 파일}4.사용 함수  (0) 2003.06.25
{INI 파일}3.파일 구조  (0) 2003.06.25
{INI 파일}2.INI 핸들러  (0) 2003.06.25
Posted by 방글24
phpsource/파일분석2003. 6. 25. 10:20
내장함수 parse_ini_file() 흉내내기
parse_ini_file()함수는 PHP에 내장되어 공식적으로 제공되는 함수로 초기화 파일의 키 정보를 배열 구조로 읽어들일 수 있습니다. 이 함수의 사용법에 대한 것은 php.net에서 제공하는 매뉴얼을 참조하기 바랍니다.
여기서는 이 함수와 동일한 기능을 하는 함수를 INI 핸들러를 이용하여 연습삼아 작성해 보고자 합니다.
[code php;gutter:false] /** * PHP4에서 제공되는 내장함수 parse_ini_file과 동일한 역할을 하는 함수임 * 이 함수는 정식으로 지원되지 않는 함수로 향후 버전과의 호환성이 없습니다. * * @param string $inifile ini filename * @param bool $process_sections * @return array Returns the settings in this function in an associative array. * By settting the last process_sections parameter to true, * you get a multidimemsional array, * with the section names and settings included. * @access global */ function my_parse_ini_file($inifile, $process_sections=false) { /** * INI 핸들러 클래스 파일이 있는 경로를 서버 상황에 맞게 수정할 것 */ include_once("./class/INI/class.hIniHandler.php"); $ini = new hIniHandler( array( "active_eval_number" => false, "active_eval_unit" => false, "active_eval_path" => false "active_process_sections" => $process_sections, ) ); $ini->read($inifile); return $ini->get(); } [/code]
직접 실험해 보시면 알겠지만 PHP 내장함수 parse_ini_file() 함수에서 얻은 결과와 INI 핸들러를 이용한 my_parse_ini_file() 함수에서 얻은 결과가 거의 동일하다는 것을 알 수 있을 것입니다. 이에 대한 자세한 내용은 "값의 평가" 메뉴를 참조바랍니다.

'phpsource > 파일분석' 카테고리의 다른 글

{INI 파일}7.업그레이드 및 패치  (0) 2003.06.25
{INI 파일}5.값의 평가  (0) 2003.06.25
{INI 파일}4.사용 함수  (0) 2003.06.25
{INI 파일}3.파일 구조  (0) 2003.06.25
{INI 파일}2.INI 핸들러  (0) 2003.06.25
Posted by 방글24
phpsource/파일분석2003. 6. 25. 10:02
값의 평가
초기화 파일의 키값으로 지정할 수 있는 것은 아래와 같습니다.
  • 문자열
  • 숫자
  • PHP 상수(예를 들어 E_ALL)
  • 초기화 파일에서 사용되는 상수들((On, Off, True, False, Yes, No 및 None)
  • 문자열 연산이 아닌 수식(예를 들어 E_ALL & ~E_NOTICE)
  • 이중인용부호(")로 둘러싸인 문자열(예를 들어 "foo")
이러한 키값은 각각에 대하여 평가결과가 다르게 나타납니다.
< 키 값의 평가 및 형식 >
키값 평가에 의한 결과 형식
On, True, Yes true boolean
Off, False, No false boolean

None

빈문자열(empty string)

string

숫자로만 구성된 값 해당 숫자 integer, double

16진수

10진수로 변환된 값

integer

8진수

10진수로 변환된 값

integer

지수

10진수로 변환된 값

integer, double

문자열 연산이 아닌 수식

연산 결과값 integer, double, boolean

단위접미어가 붙은 숫자

단위 배수가 곱해진 값

integer, double
이중인용부호(")로 둘러싸여있는 값 이중인용부호(") 안쪽에 있는 문자열 string
On, True, Yes
On, True, Yes으로 지정된 값은 boolean 형식의 true로 평가됩니다. 초기화 파일에서 사용되는 상수인 On, True, Yes는 대소문자를 구별하지 않습니다.
아래는 모두 동일한 값을 지정한 것입니다.
short_open_tag = On
short_open_tag = True
short_open_tag = Yes
그러나 아래와 같이 숫자 1을 지정하게 되면 평가결과는 정수값 1입니다.
short_open_tag = 1
Off, False, No
Off, False, No으로 지정된 값은 boolean 형식의 false로 평가됩니다. 초기화 파일에서 사용되는 상수인 Off, False, No는 대소문자를 구별하지 않습니다.
아래는 모두 동일한 값을 지정한 것입니다.
short_open_tag = Off
short_open_tag = False
short_open_tag = No
그러나 아래와 같이 숫자 0을 지정하게 되면 평가결과는 정수값 0입니다.
short_open_tag = 0
None
값이 빈문자열(empty string)로 평가받기 위해서는 아래와 같이 두가지 방법 중에 한가지로 그 값을 지정하여야 합니다.
foo = ; sets foo to an empty string
foo = none ; sets foo to an empty string
만약 빈문자열이 아니라 "none"라는 문자열을 지정하려면 아래와 같이 이중인용부호(")로 둘러싸야 합니다.
foo = "none" ; sets foo to the string 'none'
초기화 파일에서 사용되는 상수인 None은 대소문자를 구별하지 않습니다.
숫자로만 구성된 값
아래와 같이 지정된 값이 숫자로만 구성되어 있는 경우에는 지정된 값을 정수 20으로 바꾸어줍니다.
max_execution_time = 20 ; Maximum execution time of each script, in seconds
지정된 값에 소수점이 포함되어 있으면 실수형(double)로 평가되고, 소수점이 없으면 정수형(integer)로 평가됩니다.
이와같이 문자열 "20"이 아닌 정수 20으로 평가되기 위해서는 객체 생성할 때 생성자로 넘겨주는 평가를 위한 환경정보 중 "active_eval_number" 항목을 true로 설정하여야 합니다.
[code php;gutter:false] include_once("./class/INI/class.hIniHandler.php"); $ini = &new hIniHandler( "./ini/ErrorHandler.ini", array ( "active_eval_number" => true ) ); [/code]
"active_eval_number" 항목의 기본값은 true입니다. 만약 "active_eval_number" 항목이 false로 설정되어 있으면 정수 20으로 평가되지 않고 문자열 "20"으로 평가됩니다.
16진수
아래와 같이 지정된 값의 첫문자가 "#"이거나 "ox"이고 나머지 문자가 숫자로만 구성되어 있는 경우에는 지정된 값을 16진수로 해석하며 평가결과는 10진수로 바꾸어줍니다.
max_execution_time = ox14 ; hexadecimal number (equivalent to 20 decimal)
이와같이 문자열 "ox14"이 아닌 정수 20으로 평가하기 위해서는 객체 생성할 때 생성자로 넘겨주는 평가를 위한 환경정보 중 "active_eval_number" 항목을 true로 설정하여야 합니다.
만약 "active_eval_number" 항목이 false로 설정되어 있으면 정수 20으로 평가되지 않고 문자열 "ox14"로 평가됩니다.
16진수를 의미하는 접두어 "ox"는 대소문자를 구분하지 않습니다.
8진수
아래와 같이 지정된 값의 첫문자가 영문자 "o"이고 나머지 문자가 숫자로만 구성되어 있는 경우에는 지정된 값을 8진수로 해석하며 평가결과는 10진수로 바꾸어줍니다.
max_execution_time = o24 ; octal number (equivalent to 20 decimal)
이와같이 문자열 "o24"이 아닌 정수 20으로 평가하기 위해서는 객체 생성할 때 생성자로 넘겨주는 평가를 위한 환경정보 중 "active_eval_number" 항목을 true로 설정하여야 합니다.
만약 "active_eval_number" 항목이 false로 설정되어 있으면 정수 20으로 평가되지 않고 문자열 "o24"로 평가됩니다.
8진수를 의미하는 접두어 "o"는 대소문자를 구분하지 않습니다.
지수
아래와 같이 지정된 값이 지수형으로 나타낸 숫자인 경우에는 지정된 값을 지수형으로 해석하며 평가결과는 10진수로 바꾸어줍니다.
max_execution_time = 1.23e3 ;  an exponent (equivalent to 1234 decimal)
max_execution_time = 0.003e2 ;  an exponent (equivalent to 0.3 decimal)
10진수로 변환된 후의 값에 소수점이 포함되어 있으면 실수형(double)로 평가하고, 소수점이 없으면 정수형(integer)로 평가합니다.
이와같이 문자열 "1.23e3", "0.003e2"이 아닌 정수 1234, 실수 0.3으로 평가되기 위해서는 객체 생성할 때 생성자로 넘겨주는 평가를 위한 환경정보 중 "active_eval_number" 항목을 true로 설정하여야 합니다.
만약 "active_eval_number" 항목이 false로 설정되어 있으면 정수 1234, 실수 0.3으로 평가되지 않고 문자열 "1.23e3", "0.003e2"로 평가됩니다.
문자열 연산이 아닌 수식
아래와 같이 PHP의 문법에 맞는 수식일 경우에는 그 결과값을 얻을 수 있습니다. 단 지정된 값이 문자열 연산과 같이 문자열이 포함된 경우는 정확한 수식 결과를 얻을 수 없습니다.
error_reporting = E_ALL & ~E_NOTICE
"active_eval_number"가 true인 경우에는 정수 2039라는 결과를 얻습니다.
만약 "active_eval_number" 항목이 false로 설정되어 있으면 정수 2039으로 평가되지 않고 문자열 "2039"로 평가됩니다. "active_eval_number" 항목이 false라고 하더라도 값이 수식인 경우에는 그 수식 그대로인 문자열 "E_ALL & ~E_NOTICE"로 평가되는 것은 아니며 일단 E_ALL & ~E_NOTICE의 결과값인 2039값에 대하여 문자열로 평가됩니다.
PHP 내장함수 parse_ini_file() 함수에서는 "active_eval_number"가 false인 경우와 마찬가지로 문자열 "2039"라는 결과를 얻습니다.
지정된 PHP에서 제공하는 여러 가지 연산자가 포함된 수식인 경우에는 PHP 내장함수 parse_ini_file() 함수와 다르게 평가될 수 있으니 이러한 경우는 그 결과를 먼저 확인한 후 사용하시기 바랍니다.
이중인용부호(")로 둘러싸여있는 값
On, Off, True, False, Yes, No, None, E_ALL, E_ALL & ~E_NOTICE와 같이 상수나 수식이 아닌 문자열로 해석되도록 하려면 앞뒤로 이중인용부호를 붙여야 합니다.
str = "On"
str = "none"
str = "30"
str = "E_ALL & ~E_NOTICE"
단위 접미어가 붙여진 숫자인 경우
숫자 뒤에 K, M, G, T와 같은 컴퓨터에서 사용되는 단위 접미어가 붙게되면 단위 배수가 곱해진 값으로 평가됩니다. 예를 들어 아래와 같이 숫자 뒤에 K(킬로) 단위 접미어가 붙게되면 지정된 숫자값에 1024를 곱한 값으로 평가됩니다.
maxsize = 10K
따라서 위의 값 10K는 아래와 같이 10 * 1024인 10240으로 지정한 것과 같은 결과를 얻을 수 있습니다.
maxsize = 10240
이러한 평가결과를 얻으려면 객체 생성할 때 생성자로 넘겨주는 평가를 위한 환경정보 중 "active_eval_unit" 항목을 true로 설정하여야 합니다.
[code php;gutter:false] include_once("./class/INI/class.hIniHandler.php"); $ini = &new hIniHandler( "./ini/ErrorHandler.ini", array ( "active_eval_unit" => true ) ); [/code]
"active_eval_unit" 항목의 기본값은 true입니다. 만약 "active_eval_unit" 항목이 false로 설정되어 있으면 정수 10240으로 평가되지 않고 문자열 "10K"로 평가됩니다.
지원되는 단위 접미어는 아래 표와 같으며 단위 접미어는 반드시 대문자로 지정하여야 정확히 평가될 수 있습니다.
< 단위 접미어 >
단위 접미어 단위 접미어의 명칭 단위에 곱해지는 배수
K 킬로 1,024
M 메가

1,048,576

G

기가

1,073,741,824

T 테라

1,099,511,627,776

경로 정보
경로를 지정하는 방법은 크게 세가지가 있습니다. [CACHE] 섹션에 "path1", "path2", "path3"라는 키에 경로가 아래와 같이 저장되어 있다고 가정하겠습니다.
[CACHE]
path1 = cache
path2 = /web/cache/board
path3 = ./cache
그리고 수행중인 웹문서와 초기화 파일의 위치가 아래와 같다고 가정하겠습니다.
초기화 파일의 위치 : /web/test/ini/error.ini
웹문서의 위치 : /web/test/index.php
"path2"과 같이 슬래시(/)로 시작하는 경우는 절대경로로 해석합니다. 평가결과는 이러한 절대경로를 현재 웹문서의 경로(/web/test/index.php)를 기준으로 상대경로로 바꾸어 줍니다. 따라서 평가결과는 "./../cache/board"가 됩니다.
"path3"와 같이 마침표(.)로 시작하는 경우는 현재 웹문서의 경로를 기준으로 지정하였다고 해석합니다. 따라서 이러한 경우에는 지정된 경로를 수정하지 않습니다. 결국 현제 웹문서의 경로를 기준으로 한 경로가 되겠지요.
마지막으로 "path1"과 같이 슬래시(/)로 시작하지도 않고 마침표(.)로 시작하지도 않는 경우는 초기화 파일이 있는 경로를 기준으로 지정하였다고 해석합니다. 평가결과는 이러한 초기화 파일을 기준으로 하는 경로 대신에 웹문서의 경로를 기준으로 하는 경로로 바꾸어줍니다. 따라서 평가결과는 "./ini/cache"가 됩니다.
이와같이 경로를 나타내는 값을 웹문서의 경로를 기준으로하는 상대경로로 바꾸어주기 위해서는 객체 생성할 때 생성자로 넘겨주는 평가를 위한 환경정보 중 "active_eval_path" 항목을 true로 설정하는 동시에 "eval_path_key"에 해당되는 키명을 지정하여야 합니다.
[code php;gutter:false] include_once("./class/INI/class.hIniHandler.php"); $ini = &new hIniHandler( "./ini/ErrorHandler.ini", array ( "active_eval_path" => true, "eval_path_key" => array("path1", "path2", "path3") ) ); [/code]
"active_eval_path" 항목의 기본값은 false입니다. 만약 "active_eval_unit" 항목이 false로 설정되어 있으면 path1, path2, path3가 "./ini/cache", "./../cache/board", "./cache"로 평가되지 않고 초기화 파일에 지정된 대로 "cache", "/web/cache/board", "./cache"로 평가됩니다.

'phpsource > 파일분석' 카테고리의 다른 글

{INI 파일}7.업그레이드 및 패치  (0) 2003.06.25
{INI 파일}6.parse_ini_file()  (0) 2003.06.25
{INI 파일}4.사용 함수  (0) 2003.06.25
{INI 파일}3.파일 구조  (0) 2003.06.25
{INI 파일}2.INI 핸들러  (0) 2003.06.25
Posted by 방글24
phpsource/파일분석2003. 6. 25. 09:49
제공함수 목록
< 제공 함수 목록 >
분류 함수명 기능
초기화 생성자 객체 생성 및 평가를 위한 환경 설정
초기화 파일 읽기 read 지정된 초기화 파일 읽기 및 파일 구조 분석

초기화 파일 갱신

write

수정된 키정보를 초기화 파일에 쓰기
키값 읽기 get 섹션정보, 키정보 읽어 오기
키값 수정하기 set 키값을 수정하기, 섹션 및 키 정보를 초기화 파일에서 삭제하기
간단한 사용예제
초기화 파일 test.ini
아래와 같은 초기화 파일 test.ini가 있다고 가정하겠습니다.
; test configuration settings
; written by : hwooky hwooky@phpclass.com
; last modified : 2003.05.30
;
LOCKED = Off ; On/Off

[ErrorHandler]
;
; - Show only errors
;
level = E_ALL & ~E_NOTICE
MAIL_LOG = hwooky@phpclass.com
php 예제 소스
초기화 파일은 아래와 같이 read(), write(), get(), set() 메소드를 통해서 파일 내용을 읽고, 파일에 쓰고, 키정보를 읽고, 수정할 수 있습니다.
[code php;gutter:false] include_once("./class/INI/class.hIniHandler.php"); $ini = new hIniHandler(); $ini->read("./ini/test.ini"); $ini->set("LOCKED", true); $ini->set("ErrorHandler::path", "./error"); $ini->set("ErrorHandler::MAIL_LOG", ""); print "<PRE>"; print_r($ini->get()); print "</PRE>"; $ini->write(); [/code]
$ini->read("./ini/test.ini") 문장에 의해 초기화 파일 "test.ini"가 읽혀지고 그 내용이 분석되어 키 정보가 추출됩니다.
$ini->set("LOCKED", true) 문장에 의해 글로벌 섹션의 키 "LOCKED"의 값이 Off에서 true로 변경됩니다.
$ini->set("ErrorHandler::path", "./error") 문장에 의해 "ErrorHandler" 섹션에 새로운 키 "path"가 생기고 그 값으로 "./error"이 지정됩니다.
$ini->set("ErrorHandler::MAIL_LOG", "") 문장에 의해서는 "ErrorHandler" 섹션에 있던 키 "MAIL_LOG"의 값인 "hwooky@phpclass.com"이 지워집니다.
이와 같이 set() 메소드를 이용하면 기존의 키에 지정된 값을 수정하거나 지울 수 있으며, 아니면 새로운 키를 만들 수도 있습니다.
브라우저에 출력된 키정보
위의 "php 예제 소스"에서 $ini->get()으로 반환된 키정보를 print_r() 함수를 이용하여 브라우저에 나타내면 아래와 같을 것입니다.
Array
(
[*GLOBAL*] => Array
(
[LOCKED] => 1
)

[ErrorHandler] => Array
(
[level] => 2039
[MAIL_LOG] =>
[path] => ./error
)

)
$ini->set("LOCKED", true) 문장에 의해 글로벌 섹션의 키 "LOCKED"의 값을 true로 변경하였으나 기록된 값을 보면 "1"로 되었음을 볼 수 있습니다. 이는 true값이 1로 평가되었기 때문이며 만약 평가 결과인 1이 아닌 true로 기록되기를 원한다면 부울린값 true 대신에 아래와 같이 문자열 "true"를 지정하여야 합니다.
[code php;gutter:false] $ini->set("LOCKED", "true"); [/code]
수정된 초기화 파일 test.ini
위의 "php 예제 소스"에서 $ini->write()을 실행하게 되면 test.ini 파일은 아래와 같이 수정됩니다.
; test configuration settings
; written by : hwooky hwooky@phpclass.com
; last modified : 2003.05.30
;
LOCKED = 1 ; On/Off

[ErrorHandler]
;
; - Show only errors
;
level = E_ALL & ~E_NOTICE
MAIL_LOG =
path= ./error
이제는 INI 핸들러가 어떻게 움직이는가를 대략 이해하였을 것이라 생각합니다. 각 메소드에 대한 자세한 내용은 아래에서 항목별로 살펴보겠습니다.
생성자(constructor)
객체 생성할 때 클래스의 생성자로 전달하게 되는 정보로는 아래와 같이 값의 평가 및 값 반환 형식을 지정하기 위한 각종 환경 정보가 있습니다.
hIniHandler(환경 정보);
환경 정보
생성자로 전달되는 환경 정보는 아래와 같은 배열구조로 전달됩니다.
[code php;gutter:false] $ini = new hIniHandler( array( "active_eval_number" => false or not, // default is true "active_eval_unit" => false or not, // default is true "active_eval_path" => true or not, // default is false "eval_path_key" => list of path_key // default is array() "active_process_sections" => true or false or not, // default is false ) ); [/code]
값의 평가 방법을 지정하기 위한 환경 정보
초기화 파일에 지정된 키값을 어떻게 평가할 것인가를 알려주는 정보들입니다.
< 값의 평가 방법을 지정하기 위한 환경 정보 >
항목 용도 기본값 설정예

active_eval_number

숫자 평가를 활성화 true false or not

active_eval_unit

단위 접미어 평가를 활성화 true false or not

active_eval_path

경로 평가를 활성화 false true or not

eval_path_key

경로 평가하려는 키명을 지정 array() array(path_key list)
각 정보에 따라 값이 어떻게 평가되는가는 "값의 평가" 메뉴를 참조바랍니다. 각 환경 정보를 지정하는 예를 들어보면 아래와 같습니다.
[code php;gutter:false] include_once("./class/INI/class.hIniHandler.php"); $ini = new hIniHandler( array( "active_eval_number" => true, // 기본값이 true이므로 생략가능 "active_eval_unit" => true, // 기본값이 true이므로 생략가능 "active_eval_path" => true, "eval_path_key" => array("path1", "path2", "path3") ) ); [/code]
값 반환 형식을 지정하기 위한 환경 정보
parse_ini_file() 함수에 지정하는 두 번째 파라미터를 보면 process_sections라는 항목으로 이 항목을 true로 설정하면 각 키를 섹션별로 구분하여 다차원 배열로 되돌려 줍니다. 반면 false로 설정하면 섹션 구분없이 1차원배열로 되돌려 줍니다.
INI 핸들러에서도 get() 메소드로 반환되는 값을 섹션별로 구분할 수도 있고 섹션 구분없이 1차원 배열로 되돌려 받을 수도 있습니다. 이를 위해 준비된 것이 "active_process_sections" 항목입니다.
< 값 반환 형식을 지정하기 위한 환경 정보 >
항목 용도 기본값 설정예
active_process_sections

get() 결과를 섹션별로 구분할 것인지 지정

false

true or false or not

이 정보는 아래와 같이 생성자를 통해 "값의 평가 방법을 지정하기 위한 환경 정보"들과 함께 지정할 수 있습니다.
[code php;gutter:false] include_once("./class/INI/class.hIniHandler.php"); $ini = new hIniHandler( array( "active_eval_path" => true, "eval_path_key" => array("path1", "path2", "path3"), "active_process_sections" => true ) ); [/code]
초기화 파일 읽기 함수 read
string read("초기화 파일명")
read() 메소드는 parse_ini_file() 함수와 같이 지정된 초기화 파일을 읽고 분석하는 일을 합니다. 단, 반환값의 특성은 서로 다릅니다. parse_ini_file() 함수가 각 키에 대한 정보를 배열에 담아 반환하는 반면 read() 메소드가 반환하는 값은 지정된 초기화 파일에 해당하는 고유번호(id)입니다. 이 고유번호를 이용하는 방법에 대하여는 아직 내부적으로 정리가 안된 상태이므로 사용할 수 없습니다.
[code php;gutter:false] include_once("./class/INI/class.hIniHandler.php"); $ini = new hIniHandler(); $ini->read("./ini/ErrorHandler.ini"); [/code]
초기화 파일 갱신 함수 write
이 함수는 수정된 각 키에 대한 값을 초기화 파일에 갱신하는 것입니다.
boolean write(["초기화 파일명"])
 초기화 파일명을 지정하지 않으면 read() 메소드로 읽어들인 파일에 수정된 내용을 기록합니다. 만약 다른 파일에 수정된 내용을 기록하고 싶다면 다른 이름의 초기화 파일명을 지정하면 됩니다.
[code php;gutter:false] include_once("./class/INI/class.hIniHandler.php"); $ini = new hIniHandler(); $ini->read("./ini/test.ini"); $ini->set("LOCKED", true); $ini->set("ErrorHandler::path", "./error"); $ini->set("ErrorHandler::MAIL_LOG", ""); $ini->write("./ini/test2.ini"); [/code]
위의 예제에서 read() 메소드에 의해 읽어들인 초기화 파일 "./ini/test.ini"을 수정한 후 write() 메소드를 이용하여 다른 이름의 초기화 파일 "./ini/test2.ini"에 수정된 내용을 기록합니다.
키 정보 읽기 함수 get
초기화 파일에서 읽어들인 키 정보 또는 set() 메소드로 새로이 추가된 키 정보를 얻기 위해서는 get() 메소드를 이용합니다.
글로벌 섹션에 있는 키 정보 읽기
모든 키 정보는 섹션별로 분류되어 기록됩니다. 그러나 특정 섹션에 소속되지 않는 경우, 즉 섹션없이 기록된 키정보는 모두 글로벌 섹션에 기록됩니다. 현재 INI 핸들러 내부에서 글로벌 섹션의 이름을 "*GLOBAL*"라고 지정하여 사용하고 있습니다. 그러나 이 이름은 공개된 것이 아니기 때문에 향후 버전에서 언제든지 다른 이름으로 변경될 수 있으니 이 이름으로 직접 키정보에 접근하지 말기를 바랍니다.
글로벌 섹션에 있는 키정보를 읽기 위해서는 아래와 같이 키명만을 가지고 get() 메소드를 호출하면 됩니다.
mixed get("키명")
위에 있는 "간단한 사용예제" 항목에서 예로 들은 초기화 파일 test.ini 파일을 가지고 아래와 같은 PHP 소스를 실행시켜 보지요.
[code php;gutter:false] include_once("./class/INI/class.hIniHandler.php"); $ini = new hIniHandler(); $ini->read("./ini/test.ini"); $ini->set("LOCKED", "true"); print "LOCKED=" . $ini->get("LOCKED") . "<BR>\n"; [/code]
$ini->get("LOCKED") 문장을 통해 글로벌 섹션에 있는 키 "LOCKED"의 값인 1(true)을 얻을 수 있습니다. 브라우저에는 아래와 같이 나타나겠지요.
LOCKED=1
$ini->set("LOCKED", "true"); 문장 때문에 초기화 파일 test.ini는 아래와 같이 수정되겠지요.
; test configuration settings
; written by : hwooky hwooky@
; last modified : 2003.05.30
;
LOCKED = true ; On/Off

[ErrorHandler]
;
; - Show only errors
;
level = E_ALL & ~E_NOTICE
MAIL_LOG = hwooky@phpclass.com
이와같이 섹션을 지정하지 않은 키는 모두 글로벌 섹션에 있는 키를 의미합니다.
특정 섹션에 있는 키 정보 읽기
mixed get("섹션명::키명")
"ErrorHandler" 섹션과 같이 특정 섹션에 있는 키 정보를 얻기 위해서는 키명 앞에 섹션명을 지정한 후 섹션명과 키명을 클래스에서 사용하는 범위연산자(::)로 구분하여 줍니다.
위에 있는 "간단한 사용예제" 항목에서 예로 들은 초기화 파일 test.ini 파일을 가지고 아래와 같은 PHP 소스를 실행시켜 보지요.
[code php;gutter:false] include_once("./class/INI/class.hIniHandler.php"); $ini = new hIniHandler(); $ini->read("./ini/test.ini"); print "[ErrorHander]level=" . $ini->get("ErrorHander::level") . "<BR>\n"; [/code]
$ini->get("ErrorHander::level") 문장을 통해 "ErrorHandler" 섹션에 있는 키 "level"의 값인 정수 2039(E_ALL & ~E_NOTICE의 평가 결과값)을 얻을 수 있습니다. 브라우저에는 아래와 같이 나타나겠지요.
[ErrorHander]level=2039
섹션에 있는 모든 키 정보 읽기
array get("섹션명::")
섹션명과 범위연산자만 지정하고 키명을 생략하면 해당 색션에 있는 모든 키 정보가 배열로 반환됩니다.
"ErrorHandler" 섹션에 있는 모든 키 정보를 얻기 위해서는 아래와 같이 get() 메소드를 호출할 때 "ErrorHandler::"라고 지정합니다.
[code php;gutter:false] $global_section = $ini->get("ErrorHander::"); [/code]
글로벌 섹션에 있는 모든 키정보를 얻기 위해서는 아래와 같이 범위연산자만 지정합니다.
[code php;gutter:false] $global_section = $ini->get("::"); print "<PRE>"; print_r($global_section); print "</PRE>"; [/code]
이 소스를 실행하면 브라우저에는 아래와 같이 글로벌 섹션에 있는 모든 키 정보를 얻을 수 있습니다.
Array
(
[LOCKED] =>

)
모든 섹션의 키 정보를 읽기
; test configuration settings
; written by : hwooky hwooky@phpclass.com
; last modified : 2003.05.30
;
LOCKED = On ; On/Off

[ErrorHandler]
;
; - Show only errors
;
level = E_ALL & ~E_NOTICE
MAIL_LOG = hwooky@phpclass.com
위와 같은 초기화 파일 test.ini에 대하여 아래와 같이 인수없이 get() 메소드를 호출하면 모든 섹션에 있는 키 정보를 읽을 수 있습니다.
[code php;gutter:false] include_once("./class/INI/class.hIniHandler.php"); $ini = new hIniHandler( array( "active_process_sections" => true ) ); $ini->read("./ini/test.ini"); print "<PRE>"; print_r($ini->get()); print "</PRE>"; [/code]
위의 코드를 실행하게 되면 브라우저에는 아래와 같이 나타날 것입니다.
Array
(
[LOCKED] => 1

[ErrorHandler] => Array
(
[level] => 2039
[MAIL_LOG] => hwooky@phpclass.com
[path] => ./error
)

)
parse_ini_file() 함수와 마찬가지로 글로벌 섹션의 키들은 섹션 구분없이 브라우저에 표시됩니다.
키 값 수정하기, 키 값 지우기, 새로운 키를 만들기
초기화 파일에서 읽어들인 키 값을 수정하기 위해서는 set() 메소드를 이용합니다. set() 메소드가 성공적으로 수행되면 true가 반환되며, 그렇지 않으면 에러메시지를 보거나 false가 반환됩니다.
값을 지정할 때 한가지 유의할 것이 있습니다. get() 메소드에 의해 키정보를 읽을 때는 "값의 평가" 결과를 얻게 됩니다. 그러나 set() 메소드로 지정되는 값은 "값의 평가"에 관계없이 파일에 기록되는 모양대로 지정하여야 합니다.
글로벌 섹션에 있는 키 값 수정하기
boolean set("키명", 새로운값)
아래는 글로벌 섹션에 있는 키 "LOCKED"의 값을 "true"로 수정하는 소스입니다.
[code php;gutter:false] $ini->set("LOCKED", "true"); [/code]
특정 섹션에 있는 키 값 수정하기
boolean set("섹션명::키명", 새로운값)
아래는 "ErrorHandler" 섹션에 있는 키 "level"의 값을 "E_ALL"로 수정하는 소스입니다.
[code php;gutter:false] $ini->set("ErrorHandler::level", "E_ALL"); [/code]
새로운 키 정보를 만들기
boolean set("섹션명::새로운키명", 값)
아래는 "ErrorHandler" 섹션에 새로운 키 "path"를 만들고 그 값을 "./error"로 지정하는 코드입니다.
[code php;gutter:false] $ini->set("ErrorHander::path", "./error"); [/code]
키 값 지우기
boolean set("섹션명::키명", "")
위와 같이 키 값을 지우려면 빈문자열을 지정하면 됩니다.
[code php;gutter:false] $ini->set("ErrorHandler::MAIL_LOG", ""); $ini->write(); [/code]
위와 같이 섹션 "ErrorHandler"에 지정된 키 "MAIL_LOG"의 값을 빈문자열로 지정하면 아래와 같이 초기화 파일이 갱신되어 있을 것입니다.
; test configuration settings
; written by : hwooky hwooky@phpclass.com
; last modified : 2003.05.30
;
LOCKED = Off ; On/Off

[ErrorHandler]
;
; - Show only errors
;
level = E_ALL & ~E_NOTICE
MAIL_LOG =
 키명 "MAIL_LOG"은 남아있고 키 값만 지워집니다.
섹션 정보, 키 정보 삭제하기
키 정보 삭제하기
키 값만 지우는 것이 아니라 키명까지 초기화 파일에서 삭제하려면 아래와 같이 set() 메소드의 두 번째 인자인 키 값을 지정하지 않으면 됩니다.
boolean set("키명")
아래는 글로벌 섹션에 있는 키 "LOCKED"의 정보를 초기화 파일에서 영구히 삭제하기 위한 소스입니다.
[code php;gutter:false] $ini->set("LOCKED"); [/code]
위에 있는 "간단한 사용예제" 항목에서 예로 들은 초기화 파일 test.ini 파일을 가지고 이 문장을 수행한 후에 초기화 파일 test.ini을 열어보면 아래와 같이 "LOCKED" 키 정보가 완전히 삭제되었음을 볼 수 있습니다.
; test configuration settings
; written by : hwooky hwooky@
; last modified : 2003.05.30
;

[ErrorHandler]
;
; - Show only errors
;
level = E_ALL & ~E_NOTICE
MAIL_LOG = hwooky@phpclass.com
"ErrorHandler" 섹션에 있는 키 "level" 정보를 초기화 파일에서 삭제하기 위해서는 아래와 같은 문장을 수행하면 되겠지요.
[code php;gutter:false] $ini->set("ErrorHandler::level"); [/code]
섹션 정보 삭제하기
섹션에 있는 모든 정보를 삭제하기 위해서는 키명을 지정하지 않고 섹션명과 범위연산자만 지정합니다.
boolean set("섹션명::")
예를 들어 "ErrorHandler" 섹션 전체를 초기화 파일에서 삭제하기 위해서는 아래와 같은 문장이 필요합니다.
[code php;gutter:false] $ini->set("ErrorHander::"); [/code]
글로벌 섹션에 있는 모든 정보를 삭제하려면 범위연산자(::)만 지정합니다.
[code php;gutter:false] $ini->set("::"); [/code]

'phpsource > 파일분석' 카테고리의 다른 글

{INI 파일}6.parse_ini_file()  (0) 2003.06.25
{INI 파일}5.값의 평가  (0) 2003.06.25
{INI 파일}3.파일 구조  (0) 2003.06.25
{INI 파일}2.INI 핸들러  (0) 2003.06.25
{INI 파일}1.개요  (0) 2003.06.25
Posted by 방글24
phpsource/파일분석2003. 6. 25. 09:35
초기화 파일의 구조
초기화 파일의 구조를 알아보기 위해 php.ini 파일의 예를 들어 보겠습니다. 아래는 php.ini 파일에 있는 내용 중의 세션 관련 부분만 나타낸 것입니다.
[Session]
; Handler used to store/retrieve data.
session.save_handler = files

; Argument passed to save_handler. In the case of files, this is the path
; where data files are stored. Note: Windows users have to change this
; variable in order to use PHP's session functions.
session.save_path = /tmp

; Whether to use cookies.
session.use_cookies = 1


; Name of the session (used as cookie name).
session.name = PHPSESSID

; Initialize session on request startup.
session.auto_start = 0

; Lifetime in seconds of cookie or, if 0, until browser is restarted.
session.cookie_lifetime = 0

; The path for which the cookie is valid.
session.cookie_path = /

; The domain for which the cookie is valid.
session.cookie_domain =

; Handler used to serialize data. php is the standard serializer of PHP.
session.serialize_handler = php

; Percentual probability that the 'garbage collection' process is started
; on every session initialization.
session.gc_probability = 1

; After this number of seconds, stored data will be seen as 'garbage' and
; cleaned up by the garbage collection process.
session.gc_maxlifetime = 1440

; Check HTTP Referer to invalidate externally stored URLs containing ids.
session.referer_check =

; How many bytes to read from the file.
session.entropy_length = 0

; Specified here to create the session id.
session.entropy_file =

;session.entropy_length = 16

;session.entropy_file = /dev/urandom

; Set to {nocache,private,public} to determine HTTP caching aspects.
session.cache_limiter = nocache

; Document expires after n minutes.
session.cache_expire = 180

; use transient sid support if enabled by compiling with --enable-trans-sid.
session.use_trans_sid = 1

url_rewriter.tags = "a=href,area=href,frame=src,input=src,form=fakeentry"
초기화 파일 내용을 보면 아래와 같이 크게 4부분으로 구성되어 있습니다.
  • 섹션(section)
  • 주석(comment)
  • 빈줄(empty line)
  • 키정보(KEY=VALUE pair)
섹션(section)
초기화 파일의 각 섹션은 "[Session]"와 같이 대괄호([,])로 둘러싸인 키워드로 시작되며 이어서 여러 줄의 설정(주석, 빈줄, 키정보)이 뒤따릅니다. 섹션명은 대소문자를 구분합니다.
대부분의 키정보들은 먼저 섹션을 지정한 후 해당 섹션 내에 지정하게 됩니다. 그러나 때에 따라서는 섹션없이 바로 키를 지정할 수도 있습니다. 이 문서에서는 이와같이 섹션없이 지정된 키정보들을 담고 있는 공간을 글로벌 섹션(global section)이라고 부르겠습니다.
; test configuration settings
; written by : hwooky hwooky@phpclass.com
; last modified : 2003.05.30
;
LOCKED = Off ; On/Off - run-time changes rejected/allowed, resp.

[ErrorHandler]
;
; - Show only errors
;
level = E_ALL & ~E_NOTICE
MAIL_LOG = hwooky@phpclass.com
위와 같은 초기화 파일의 경우를 보면 키 "LOCKED"는 글로벌 섹션에 포함되며, 키 "level" 및 "MAIL_LOG"는 "ErrorHandler"라는 섹션에 포합됩니다.
주석(comment)
초기화 파일에서 주석은 세미콜론(;)으로 시작합니다. 따라서 각 행의 문장에서 세미콜론 뒤쪽에 있는 문자는 모두 주석으로 처리됩니다.
빈줄(empty line)
Whitespace로만 구성된 행은 모두 빈 행으로 처리됩니다.
키정보(KEY=VALUE pair)
각 키에 값을 할당하기 위해서 아래와 같이 지정합니다.
key = value
위에 있는 php.ini의 예제에서 볼 수 있듯이 value값은 그 값이 문자열이라 하더라도 인용부호없이 지정할 수 있습니다. 그러나 만약 value 값에 등호부호(=) 또는 세미콜론(;)과 같은 특수문자가 포함되어야 한다면 아래와 같이 이중인용부호(")로 둘러싸여 있어야 합니다.
url_rewriter.tags = "a=href,area=href,frame=src,input=src,form=fakeentry"
이중인용부호(") 대신에 단일인용부호(')를 사용할 수 없으며, 키명은 대소문자를 구별합니다. 따라서 "foo=bar"은 "FOO=bar"과 다릅니다.
키 값에 지정할 수 있는 것은 문자열, 숫자, PHP 상수(예를 들어 E_ALL), 초기화 파일에서 사용되는 상수들(On, Off, True, False, Yes, No 및 None) 또는 수식(예를 들어 E_ALL & ~E_NOTICE) 또는 이중인용부호(")로 둘러싸인 문자열(예를 들어 "foo") 등 입니다.
초기화 파일에서 사용되는 상수들(On, Off, True, False, Yes, No 및 None)은 대소문자를 구별하지 않습니다.
초기화 파일의 보안
초기화 파일은 텍스트 파일이므로 누구나 쉽게 읽거나 바꿀 수가 있습니다. 따라서 데이터베이스에 대한 정보(호스트명,사용자명,패스워드,데이터베이스명,테이블명 등)와 같은 공개되어서는 안되는 중요한 정보가 초기화 파일에 포함되어 있다면 URL 접근을 통해 다운로드되거나 그 내용이 브라우저에 나타나지 않도록 주의해야 할 것입니다.
중요한 정보가 기록된 초기화 파일에 대한 보안을 소홀히 하게되면 심각한 결과를 초래할 수 있으니 주의하기 바랍니다.

'phpsource > 파일분석' 카테고리의 다른 글

{INI 파일}5.값의 평가  (0) 2003.06.25
{INI 파일}4.사용 함수  (0) 2003.06.25
{INI 파일}2.INI 핸들러  (0) 2003.06.25
{INI 파일}1.개요  (0) 2003.06.25
{TAR 파일}8.클래스 다운로드  (0) 2002.09.16
Posted by 방글24
phpsource/파일분석2003. 6. 25. 09:31
PHP에서의 초기화 파일 지원
PHP에서 보면 초기화 파일 php.ini를 다루어주는 함수가 아래와 같이 제공되고 있습니다.
  • ini_alter
  • ini_get_all
  • ini_get
  • ini_restore
  • ini_set
그러나 이 함수들은 단지 php.ini 파일만을 다룰 수 있습니다. php.ini 파일이 아닌 다른 일반적인 초기화 파일들을 다루기 위해서는 별도의 함수가 필요하지요. parse_ini_file() 함수가 바로 php.ini가 아닌 일반적인 초기화 파일을 다루기 위해 PHP에 내장되어 제공되는 함수입니다. 이 함수를 이용하면 초기화 파일에 기록된 모든 정보에 대한 값을 배열로 읽어 올 수 있습니다.
문제는 초기화 파일에 기록된 내용을 변경해주는 함수가 기본으로 제공되지 않는다는 것입니다. 이러한 문제 때문에 많은 PHP 개발자들은 초기화 파일의 내용을 변경시켜주는 라이브러리를 개발하여 공개하고 있습니다. 여러분이 관심만 있다면 이러한 라이브러리를 쉽게 찾아볼 수 있을 것입니다.
INI 핸들러(초기화 파일 핸들러)
여기서 제공하는 INI 핸들러는 초기화 파일을 읽거나, 키 값을 수정하거나, 수정된 내용을 파일에 기록할 수 있도록 하기 위해 작성된 라이브러리입니다.
INI 핸들러에는 아래와 같이 2개의 클래스가 포함되어 있습니다.
< INI 핸들러의 구성 >
클래스 클래스가 정의된 파일 용도
hIniParser class.hIniParser.php 초기화 파일을 읽고, 파일 내용을 분석하고, 키정보를 수정하고, 수정된 내용을 파일에 기록하기 위해 작성된 클래스
hIniHandler class.hIniHandler.php 키값을 평가하기 위해 작성된 클래스
hIniParser 클래스에서는 초기화 파일을 읽어들인 후 각 키에 대한 키값을 분리해 냅니다. 분리한 키 값을 평가하지는 않으며 단지 문자열 형태로 보관만 합니다. 키에 대한 정보 외에도 섹션 정보, 주석 정보 등을 적절히 분리해 주며, 키 정보를 읽거나 수정하거나 파일에 기록할 수 있습니다.
hIniHandler 클래스는 hIniParser 클래스에서 파생된 클래스입니다. hIniHandler 클래스에서는 hIniParser 클래스에서 분리해낸 문자열 형태의 키값을 적절히 평가하여 원하는 형태(정수형, 부울린형, 문자열형 등)의 결과를 얻어냅니다. 각 값이 어떻게 평가되는 가는 "값의 평가" 메뉴를 참조바랍니다.

'phpsource > 파일분석' 카테고리의 다른 글

{INI 파일}4.사용 함수  (0) 2003.06.25
{INI 파일}3.파일 구조  (0) 2003.06.25
{INI 파일}1.개요  (0) 2003.06.25
{TAR 파일}8.클래스 다운로드  (0) 2002.09.16
{TAR 파일}7.클래스  (0) 2002.09.09
Posted by 방글24
phpsource/파일분석2003. 6. 25. 09:23
보통 파일 확장자가 "ini"인 초기화 파일은 프로그램 환경과 초기 실행에 필요한 정보를 담고 있는 파일로 프로그램의 기본값에 대하여 지정할 수 있습니다. windows에서 사용하는 대표적인 초기화 파일에는 win.ini 와 system.ini가 있으며, PHP에서도 php.ini라는 초기화 파일이 있습니다. 이외에도 대부분의 OS 또는 응용프로그램에서 win.ini에서 사용하는 파일 형식을 이용하여 초기화 파일을 작성하고 있습니다.
개발자가 게시판과 같은 응용프로그램을 작성할 때 이러한 초기화 파일을 통해 아래와 같은 정보를 미리 지정할 수 있을 것입니다.
  • 데이터베이스에 대한 정보 - 호스트명,사용자명,패스워드,데이터베이스명,테이블명 등
  • 게시판 관리자의 ID 및 패스워드
  • 업로드 게시판일 경우에는 업로드 파일의 최대 바이트수, 업로드할 디렉토리 등
  • 게시판 목록보기에서 한 화면에 나타나고자 하는 게시물수, 페이지 링크수 등
위와 같은 정보를 생성자 또는 초기화 메소드를 통해 지정할 수도 있으나 초기화 파일을 이용하면 훨씬 융통성있는 프로그램을 작성할 수 있을 것입니다. 예를 들어 관리자 게시판을 통해 지정하게 되는 기본값을 바로 이 초기화 파일에 기록하였을 때 방문자의 게시판에서 이 초기화 파일을 이용하여 게시판을 적절히 구성할 수 있겠지요.
< 초기화 파일의 응용 >
물론 이러한 정보를 개발자가 임의의 형식으로 작성할 수도 있으나 이미 규격화된 INI 파일 형식을 이용하게 되면 다른 서버 사이드 스크립트(ASP, JSP, 파이썬, PHP 등)에서도 동일한 초기화 파일을 그대로 이용할 수 있게 됩니다. 서버 사이드 스크립트 뿐만아니라 서버 플랫폼이 윈도우가 되었든지 유닉스가 되었든지 관계없이 각 플랫폼에서 제공되는 대부분의 개발언어에서 다룰 수 있게 됩니다.
이 문서에서의 초기화 파일의 의미는 윈도우의 win.ini에서 사용하는 파일 형식(Windows INI 파일 형식)에 따라 작성된 파일을 의미합니다.

'phpsource > 파일분석' 카테고리의 다른 글

{INI 파일}3.파일 구조  (0) 2003.06.25
{INI 파일}2.INI 핸들러  (0) 2003.06.25
{TAR 파일}8.클래스 다운로드  (0) 2002.09.16
{TAR 파일}7.클래스  (0) 2002.09.09
{TAR 파일}6.zlib를 이용한 압축  (0) 2002.09.09
Posted by 방글24
phpsource/파일분석2002. 9. 16. 16:51
2002.9.16 - 0.0.1 패치1
  • get_head() 함수 수정
2002.9.9 - 0.0.1
  • 첫 배포판

'phpsource > 파일분석' 카테고리의 다른 글

{INI 파일}2.INI 핸들러  (0) 2003.06.25
{INI 파일}1.개요  (0) 2003.06.25
{TAR 파일}7.클래스  (0) 2002.09.09
{TAR 파일}6.zlib를 이용한 압축  (0) 2002.09.09
{TAR 파일}5.후미에 붙여지는 블록  (0) 2002.09.09
Posted by 방글24
phpsource/파일분석2002. 9. 9. 16:48
여기서 공개하는 hTarFile 클래스는 바로 TAR 아카이브를 생성하거나 또는 풀 수 있도록 작성된 소스이며 PHP에 내장되어 제공되고 있는 zlib 라이브러리(gz로 시작하는 함수들)를 이용하여 압축할 수 있도록 하였습니다.
hTarFile 클래스 0.0.1 버전 설계의 기본 컨셉은 기존의 유닉스 tar 유틸리티의 사용법만 알면 별문제없이 사용하도록 하겠다는 것입니다. 따라서 이미 tar 유틸리티를 사용할 줄 아는 유닉스 사용자라면 별 어려움없이 hTarFile 클래스를 이용할 수 있으리라 생각합니다.
객체 생성 및 생성자
[code php;gutter:false] require_once("class.hTarFile.php");
$my = & new hTarFile; [/code]
public 메소드
void root(string path-to-files);
root 메소드로 지정하는 path-to-files 인자는 묶고자 하는 파일들의 기본 디렉토리를 의미합니다. 클래스 내의 모든 메소드는 이 기본 디렉토리를 베이스로 처리하기 때문에 매우 중요합니다. 지정하지 않으면 null로 처리되므로 TAR 아카이브를 다루어주는 tar 메소드에서 디렉토리를 완벽하게 지정하여야 합니다.
또 한가지 중요한 것은 여기서 지정되는 path-to-files는 hTarFile 클래스를 이용하기 전에 먼저 해당 서버의 쉘 명령을 이용하여 생성시켜야 하며 TAR 아카이브 또는 tar.gz 파일이 기록되는 디렉토리는 반드시 디렉토리 내에 파일을 기록할 수 있도록 퍼미션을 조정하셔야 합니다. 가장 쉬운 방법은 퍼미션을 777로 설정하는 것이지요. 물론 윈도우 서버에서는 퍼미션 대신에 "읽기전용"으로만 해놓지 않으면 됩니다.
이와 같이 생성 또는 추출하고자 하는 TAR 아카이브 및 TAR 아카이브에 속할/속한 멤버파일들의 기본 디렉토리를 root 메소드로 지정합니다. 일단 root 메소드로 디렉토리가 지정된 후에는 tar 메소드에서는 이 기본 디렉토리를 기준으로하여 상대디렉토리가 지정됩니다.
[code php;gutter:false] $my->root("/tmp/hFiles");
$my->tar("cfz sample.tar.gz s1.txt"); [/code]
묶고자 하는 파일 s1.txt는 /tmp/hFiles 에 있으며, 또한 생성하고자 하는 sample.tar.gz 파일도 /tmp/hFiles 에 생성됩니다. 만약 root 메소드에 지정된 디렉토리가 절대디렉토리가 아니라 상대디렉토리로 지정하였다면 기준이 되는 디렉토리는 현재 실행중인 문서가 있는 디렉토리가 됩니다.
int tar (string options, string tar_filename, string files or dirs)
[code php;gutter:false] $my->tar("cfz sample.tar.gz s1.txt s2.txt s3.txt subdir1 subdir2"); [/code]
사용법은 리눅스에서 제공되는 tar 유틸리티와 거의 유사합니다. tar 유틸리티와 다른 점은 옵션 앞에 붙게 되는 -(minus) 부호가 생략되었다는 것입니다. 다른 것은 동일합니다. 물론 기능적인 것으로 보면 tar 유틸리티가 제공하는 모든 기능을 제공하지는 않으며 그 중에 꼭 필요한 옵션만 제공합니다. 또한 tar 유틸리티에서는 x 옵션을 주었을 때 TAR 아카이브 파일명 뒤에 파일명이나 디렉토리명을 지정하면 해당 파일 또는 디렉토리의 내용만 추출하게 됩니다. 그러나 hTarFile 클래스에서는 파일이나 디렉토리명을 지정하더라도 이를 무시하고 전체를 추출하도록 되어 있습니다. 이 부분은 향후 업그레이드하면서 업하도록 노력하겠습니다.
TAR 아카이브 생성이나 추출에 성공하면 멤버파일 리스트를 되돌려 주며 실패하면 false 값이 되돌려 줍니다.
[code php;gutter:false] require_once("class.hTarFile.php");
$my = & new hTarFile;

$my->root("/tmp/ext");

if (!$files=$my->tar("xfz sample.tar.gz")) {
die("unable to extract TAR archive");
} else {
printf("<P>TAR archive was successfully extracted!</P>\n");

foreach ($files as $file) {
printf("%s<BR>\n", $file);
}
} [/code]
1) TAR 아카이브로 묶기
리눅스의 tar 유틸리티에서 여러 개의 파일을 TAR 아카이브로 묶기 위해서는 아래와 같이 하게 되지요.
tar -cf  tar-file file | dir ......
예를 들면
tar -cf sample.tar s1.txt s2.txt sub1 sub2
이 명령을 수행하면 s1.txt, s2.txt 파일과 sub1, sub2 디렉토리에 있는 모든 파일을 하나의 파일 sample.tar에 묶어 버리지요. 이를 hTarFile 클래스의 메소드 tar를 이용한다면 아래와 같습니다.
[code php;gutter:false] $my->root("/hwooky");
$my->tar("cf sample.tar s1.txt s2.txt sub1 sub2"); [/code]
이 문장들을 수행하게 되면 "/hwooky" 디렉토리에 있는 s1.txt, s2.txt와 /hwooky/sub1, /hwooky/sub2 디렉토리에 있는 모든 파일을 sample.tar 아카이브 파일로 묶게 됩니다.
2) TAR 아카이브을 풀기
리눅스의 tar 유틸리티에서 TAR 아카이브를 여러 개의 파일로 풀기 위해서는 아래와 같이 하게 되지요.
tar -xf  tar-file
예를 들면
tar -xf sample.tar
이를 hTarFile 클래스의 메소드 tar를 이용한다면 아래와 같습니다.
[code php;gutter:false] $my->root("/tmp/hFiles/extract");
$my->tar("xf sample.tar"); [/code]
앞에서 설명하였듯이 이 메소드를 수행하기 전에 root 메소드에서 지정한 "/tmp/hFiles/extract" 디렉토리를 먼저 만들어주고 퍼미션을 쓰기가능하도록 (예를 들면 chmod 777) 설정하여야 제대로 파일을 풀어줄 수 있습니다.
3) tar.gz 파일로 압축하기
리눅스의 tar 유틸리티에서 여러개의 파일을 TAR 아카이브로 묶음과 동시에 자동적으로 gzip 명령으로 압축하기 위해서는 z 옵션을 추기하여야 합니다.
tar -cfz  tar-file file | dir ......
예를 들면
tar -cfz sample.tar.gz s1.txt s2.txt sub1 sub2
이 명령을 수행하면 s1.txt, s2.txt 파일과 sub1, sub2 디렉토리에 있는 모든 파일을 하나의 파일로 묶음과 동시에 gzip 형식으로 압축하여 sample.tar.gz 파일로 저장합니다. 이를 hTarFile 클래스의 메소드 tar를 이용한다면 아래와 같습니다.
[code php;gutter:false] $my->tar("cfz sample.tar.gz s1.txt s2.txt sub1 sub2"); [/code]
4) tar.gz 파일을 압축해제하기
리눅스의 tar 유틸리티에서 여러개의 파일을 TAR 아카이브로 묶음과 동시에 자동적으로 gzip 명령으로 압축하기 위해서는 z 옵션을 추기하여야 합니다.
tar -xfz  tar-file
예를 들면
tar -xfz sample.tar
이를 hTarFile 클래스의 메소드 tar를 이용한다면 아래와 같습니다.
[code php;gutter:false] $my->tar("xfz sample.tar"); [/code]
메소드 tar에서 지원하는 옵션
hTarFile 클래스의 메소드 tar에서 지원하는 옵션을 정리하면 아래와 같습니다.
< 지원하는 옵션 >
지원하는 옵션 기  능

c

TAR 아카이브 생성

f

TAR 아카이브 파일명 지정

x

TAR 아카이브 추출

z

TAR 아카이브를 압축 및 해제

이 옵션 중에서 f 옵션은 반드시 지정하여야 하고 z 옵션은 압축할 필요가 있을 때만 지정하면 됩니다. 나머지 c와 x 옵션은 둘 중에 하나만 선택하십시요. 묶으려면 c 옵션을 선택하고 풀려면 x 옵션을 선택하십시요.

'phpsource > 파일분석' 카테고리의 다른 글

{INI 파일}1.개요  (0) 2003.06.25
{TAR 파일}8.클래스 다운로드  (0) 2002.09.16
{TAR 파일}6.zlib를 이용한 압축  (0) 2002.09.09
{TAR 파일}5.후미에 붙여지는 블록  (0) 2002.09.09
{TAR 파일}4.본문 구조  (0) 2002.09.09
Posted by 방글24
phpsource/파일분석2002. 9. 9. 16:47
PHP에서 제공하는 함수에는 파일을 압축할 수 있는 zlib 라이브러리를 기본적으로 제공하고 있습니다.
압축하기
리눅스의 gzip 프로그램의 출력과 호환성을 유지하기 위해서는 zlib 라이브러리에서 제공하는 함수 중에서 gzencode 함수를 이용하여야 합니다. 이 함수에 의해 얻은 값은 gzip 프로그램의 출력값과 호환성을 가지므로 리눅스의 gzip 프로그램 또는 윈도우의 윈도우커맨더를 가지고 압축을 풀 수가 있습니다. 예를 들어 gzencode 함수를 이용하여 gz 파일을 생성해 주는 사용자 정의 함수를 작성하면 아래와 같습니다.
[code php;gutter:false] function gzcreate($gzfile, $contents) {
if (!$contents=gzencode($contents)) { // PHP4 >= 4.0.4
return false;
}

if (!$fp=fopen($gzfile, "wb")) {
return false;
}

fwrite($fp, $contents);
fclose($fp);

return true;
} [/code]
위 소스 중에 fopen 함수에서 mode 인수를 "wb"로 설정하였습니다. 유닉스에서는 이진(binary)을 의미하는 "b"를 사용하지 않더라도 정상적으로 파일을 처리해 줍니다. 그러나 윈도우에서는 이진 파일과 텍스트파일을 구분하여 저장하거나 읽지 않으면 저장된 파일을 정상적으로 다룰 수 없습니다. 가끔가다 자료실에 있는 이미지 파일이나 압축파일을 다운로드할 때 파일의 헤더부분만 읽어오므로 아무런 내용도 담기지 않은 파일이 다운로드될 때가 있습니다. 이럴 때는 해당 파일이 정확히 이진 모드로 다루어졌는지 확인하여야 합니다. 따라서 리눅스나 유닉스 계통에서는 별 문제가 없는데, 윈도우 서버에서 그런 문제가 발생할 수 있습니다. 따라서 윈도우에서 이미지 파일 또는 압축파일과 같이 바이너리 형태의 파일을 읽거나 쓸 때는 fopen 모드 인자에 반드시 "b" 옵션을 추가해야 정상적으로 다룰 수 있습니다. 유닉스에서는 "b" 옵션을 사용하지 않으며, 설사 "b" 옵션을 지정하더라도 그냥 무시해 버립니다.
압축해제하기
예를 들어 gzib 함수를 이용하여 압축된 파일을 풀기위해서는 대략 아래와 같이 사용자 정의 함수 gzextract 함수를 작성하면 될 것입니다.
[code php;gutter:false] function tarextract($gzfile) {
if (!$fp=fopen($gzfile, "rb")) {
return false;
}

$contents = fread($fp, filesize($gzfile));
fclose($fp);

if (!$contents=gzdecode($contents)) { // PHP4 >= 4.0.4
return false;
}

return $contents;
} [/code]
위의 코드가 제대로 실행될 것 같습니까? 아닙니다. 2002년 8월 31일 현재 PHP에서는 gzencode 함수만 제공할 뿐 gzdecode 함수를 제공하고 있지 않습니다. 그러나 http://www.php.net/manual/en/function.gzencode.php를 보시면 gzdecode 함수를 구현해 주는 팁이 공개되어 있습니다. 그 내용은 아래와 같습니다.
henryk@ploetzli.ch
14-Feb-2002 07:28

Well, I was looking for a gzdecode too and didn't consider the temporary file example above
to be very elegant.
However, as is noted in the very first comment: gzencode() only adds a 10 byte header.

I don't quite know what this header is supposed to be used for, but gzinflate() certainly
doesn't like it, so I stripped it off:

function my_gzdecode($string) {
$string = substr($string, 10);
return gzinflate($string);
}

That's useful to read HTTP-Connections that were compressed by mod_gzip.
--
Henryk Plotz
Gruße aus Berlin


tychay@alumni.caltech.edu
03-Apr-2002 03:53

The 10 byte string in gzencode is the standard gzip header. The first two bytes (1f 8b)
define the return as a gzip file, the third byte (08) means that the body is compressed using
the "deflate" algorithm. The rest is padding (00)'s.

Technically, I believe one should check if the third byte is hex 08 and if so strip off the
first ten bytes and last four bytes and run inflate on it. The last four bytes are file size
and checksum bits.

In practice, you can get away with just stripping the first 10 bytes and running inflate on
it.

Hope this helps,

terry
이 팁에 의해 gzdecode 함수를 작성하면 대략 아래와 같이 될 것입니다.
[code php;gutter:false] function gzdecode($data) {
if("\x1f\x8b\x08" == substr($data, 0, 3)) {
return gzinflate(substr($data, 10, -4)); // PHP4 >= 4.0.4
}
return false;
} [/code]
그런데 이렇게 작성된 gzdecode 함수도 그리 완벽하지는 않습니다. 위에서 설명한 gzencode 함수로 생성된 압축파일을 푸는데는 전혀 문제없이 동작합니다만 리눅스의 gzip 또는 윈도우의 윈도우커맨더, 알집 등으로 압축한 파일은 정상적으로 풀지를 못하네요. 즉, 팁에 의해 작성된 사용자 정의 함수 gzdecode는 리눅스의 gzip 프로그램의 출력과 완전한 호환성을 유지하지는 못하고 있습니다. 이러한 부분은 PHP에서 향후 공식적으로 gzdecode 함수를 제공하여야 가능할 것으로 보입니다. 아니면 좀더 개선된 팁이 공개되든가......

'phpsource > 파일분석' 카테고리의 다른 글

{TAR 파일}8.클래스 다운로드  (0) 2002.09.16
{TAR 파일}7.클래스  (0) 2002.09.09
{TAR 파일}5.후미에 붙여지는 블록  (0) 2002.09.09
{TAR 파일}4.본문 구조  (0) 2002.09.09
{TAR 파일}3.헤더 구조  (1) 2002.09.09
Posted by 방글24