이수준(dislevel@newhuman.org)
|
서론 지난 호에서는 Oracle SQL 과 sqlplus, PRO*C 에 대해서 살펴보았다. 이번 호에서는 마지막으로 Oracle 과 PHP3 와의 연동, 이를 이용한 방명록 만들기를 끝으로 이 글을 마칠까 한다.
가. Oracle 연동을 위한 PHP3 설치 1) PHP3 와 아파치를 설치하기 전의 준비사항 PHP3 를 웹에서 사용하려면 몇 가지 준비사항이 필요하다. 먼저 PHP3 를 아파치 웹서버와 함께 사용하려면, PHP3를 재 컴파일할 필요성이 있기 때문에 PHP3 의 소스(source)가 필요로 한다. 또한 오라클을 지원하는 PHP3 모듈을 탑재하기 위하여 아파치 웹서버의 소스가 필요로 한다. 준비할 내용들 * PHP3 소스 PHP3 소스는 http://www.php.net에서 구할 수 있다. 현재 버전은 3.0.12 까지 나와있다. (아울러 여러분들은 PHP4 ZEND 에 대한 정보도 구할 수 있을 것이다) * 아파치 소스 아파치 웹서버의 공식 페이지는 http://www.apache.org이며 아파치 웹서버가 유명한 만큼 여러 개의 미러링 사이트에서 아파치 웹서버를 다운로드 받을 수 있도록 링크를 하여놓고 있다. 이제 소스를 구하였으므로 실제로 아파치웹서버와 PHP3를 설치를 하여보자. 2) 아파치 웹서버와 PHP3 의 설치 1. 먼저, 아파치 웹서버의 소스를 다음과 같은 명령으로 /usr/src에서 압축을 푼다. [root@www src]# tar xvfz apache_1.3.6.tar.gz [enter] 2. 이번에는 PHP3의 소스를 다음과 같은 명령으로 /usr/src에서 압축을 푼다. [root@www src]# tar xvfz php-3.0.12.tar.gz 3. 압축이 풀어져 있는 아파치 소스 디렉토리로 이동한 후 아파치 웹서버가 설치된 디렉토리를 설정한다. 4. 다시 PHP3가 풀려져 있는 디렉토리로 이동한후 PHP3의 설정을 한다. [root@www apache_1.3.6]# cd ../php-3.0.12 각각의 옵션은 다음과 같다. 옵션 --with-apache : Apache 모듈로 PHP3 를 설치한다. 옵션 --enable-track-vars HTTP_GET_VARS, HTTP_POST_VARS, HTTP_COOKIE_VARS 배열에 들어있는 GET / POST / cookie 변수들이 어디로부터 왔는지 기억하게 만든다. 이 옵션은 단지 Default 값을 정하는 것뿐이며, 후에 configuration file의 track_vars 지시자에 의해 Enable/Disable 할 수 있다. 옵션 --with-oracle=/home/oracle/app/oracle/product/8.0.5
: --with-oracle=DIR 5. make , make install 명령을 사용하여 PHP3를 설치한다. 6. PHP3 아파치 모듈이 잘 컴파일이 되었으므로 이번에는 아파치 소스디렉토리로 이동한후 아파치를 컴파일한다. 먼저 아파치 서버를 컴파일하기 전에 PHP3 모듈과 함께 컴파일하겠다는 것을 아파치 서버에 알려주기 위하여 configure를 아래와 같이 다시 실행을 한다. [root@www php-3.0.12]# cd .. --activate-module 옵션은 아파치에 추가될 module을 설정할 수 있다. 7. make ; make install 명령으로 컴파일과 설치를 한다. 이로써 아파치와 PHP3 모듈을 설치하였다. 3) PHP를 Apache Dynamic Shared Object (DSO)로 컴파일하기 위의 방식은 기존의 아파치 웹서버의 설정을 무시하고 처음부터 다시 컴파일해야 하는 단점이 있다. 그러나 DSO 방식은 PHP를 이미 컴파일/실행되고 있는 아파치 서버에 추가하는 가장 깨끗한 방법이다. 여러분의 서버는 mod_so 를 포함하도록 만들어져 있어야 한다.(“httpd -l”로 확인할 수 있다.) 또한,’apxs’ Perl 스크립트가 설치되어 있고, 원하는 서버 setup을 할 수 있도록 설정되어 있어야 한다. (대부분 배포판은 그러하다 ;)~ ) apxs 가 설치 되어 있는지 확인이 되었으면 이제 PHP 를 만든다. cd php-3.0.12 물론 여러분이 원하는 모든 옵션을 줄 수 있다. 자세한 옵션의 리스트를 원하면 /configure --help 명령을 내려본다. 아파치와 PHP 설치가 완료되었으면, 이제 PHP 가 아파치에서 동작하기 위해 다음과 같이 httpd.conf 를 수정한다. AddType application/x-httpd-php3 .php3
.html 또한 DirectoryIndex 옵션에 index.php3 를 추가한다. DirectoryIndex index.html index.php3 이제 아파치 웹서버를 다시 기동하고 이것이 제대로 설정 되어 있는지 확인하기 위해 다음과 같은 php code 를 작성하여 브라우징 해 보자. info.php3 <? 여러분들이 설치한 php 에 대한 정보가 한눈에 들여다보일 것이다.
나. PHP 의 개략적 소개 이제 PHP3 와 아파치 웹서버를 설치했으므로 , 본격적으로 PHP3 의 문법에 대하여 알아보자 1) 변수 (Variable) - 변수는 $로 시작한다. - 변수는 C처럼 별도로 선언하는 부분이 없으며, 변수 type은 변수가 사용한 context 에 따라 결정된다. 예를 들어 $i = 10 이라고 하면 $i 는 정수형으로 결정되어지며, $name = “dislevel”라고 하였다면 $name 는 문자열로 된다. 이처럼 PHP3 는 자유도가 상당히 높다는 것을 알 수 가 있다. - 배열(Array) 은 $array[] 형식으로 사용한다. * 외부변수 (External Variables) - PHP3 가 각광을 받는 한가지 이유중의
하나가 바로 외부변수이다. <form method=post action=test.php3> 이라고 하였을 경우 등록버튼을 누르게되면 test.php3 에는 $part = 2 으로 외부변수를 선언한 것과 같은 효과를 발생하게 된다. 다른 cgi 프로그래밍처럼 post, get 을 처리하기 위한 추가 라이브러리가 필요없다는 것이다. - HTTP Cookie : 브라우져로 cookie 를 전달할려면 SetCookie(name, value, timeout) 함수를 이용하면 된다. Client로부터 전달되는 Cookie 는 PHP 변수로 변환이 된다. - 환경변수 (Environment Variable) : 환경 변수 또한 PHP 변수처럼 사용할 수 있다. 환경변수의 값을 얻기 위한 getenv() 함수와 환경변수로 지정하기 위한 putenv() 함수가 지원된다. 2) Class 의 지원 - class keyword를 이용하여 class를 정의하며 instance 생성은 new 연산자를 이용한다. - class 의 상속은 extends keyword를 사용한다 - constructor 정의는 class 와 같은 이름을 갖는 상수를 정의함으로써 이루어진다. constructor 는 default parameter를 가질 수 있다. 예> class setupClass{ class setupExtendsClass extends
setupClass{ } $setup = new setupClass; 3) 표현식 (Expression) - 값의 할당 : $a = $b = 5 - C와 같이 연산자와 할당을 동시에 할수가 있다. : $a+=3; $b= double(--$b); - boolean : 숫자에서 0은 false, 0이 아니면 true 문자열에서 “” 와 “0”은 false, 나머지는 true array 에서 element 가 하나도 없으면 false 그렇지 않으면 true 4) 제어문 - if 문장 : 비교문장으로 2가지 방식이 있다. 형식1. 형식2.
형식1. 형식2.
- do .. while 문 : 기존의 C의 형식과 같다. do { 문장 1; } while( 비교문 ); - for 문 : 기존의 for 의 형식과 같다. for( expr1; expr2 ; expr 3) { 문장 1; } - switch 문 : switch( 변수 ) { case 값1 : 문장 1; break; default : 문장 2’’ } 5) 함수 (Function) - 함수는 function keyword 로 정의 되며 return type 는 지정하지 않는다. - 함수의 기본형 function 펑션이름( 변수1, 변수2, 변수3,
... , $변수n) { - 리턴받은 list 와 object 를 포함하여 어떤 형식이든 가능하다. - C++ 에서처럼 default parameter를 정의할 수 있다. function 펑션이름($defValue = 1){} 6) 연산자 ( Operator ) - 계산을 위한 연산자 : + , - , * , / , % (나머지 연산자) - 문자열(string) 연산자 : . (conscatenation) - 대입 연산자 : = - 비트 연산자 : & (and) , | (or), ~ (not) - 논리 연사자 : and (&&) , or (||), xor, ! - 비교 연산자 : == (같다.) , != (다르다), <, >, <=, >= 7) include 문 include 문장을 만나면 지정한 파일을 포함한다. c 와는 다른 점은 필요한 경우에만 file 을 포함시킬수 있다는 것이다. Webpage 에서 자주 사용되어진다.
다. PHP 가 지원하는 Oracle 함수 현재 PHP3 에서 지원하는 Oracle 관련 함수 군은 두 가지로 나누어져 있다. ‘ora_’ 함수 군과 ‘oci_’ 가 바로 그것인데, 이는 아마도 하위 호환성에 염두를 두고 구현한 듯 하고, 실지적인 개발은 현재 ‘oci_’ 함수 군 쪽으로 넘어갔다. 그러나 본 강좌에서는 ‘ora_’ 함수 군을 이용해 방명록 프로그램을 설명한다. ‘oci_’ 함수 군으로의 이전은 그리 어렵지 않을 것이다. 대부분 ‘ora_’ 를 ‘oci_’ 로 바꾸어주면 될 정도이다. - 기본적인 ora_ 함수들 Ora_Close -- Oracle cursor를 닫는다. Ora_ColumnName -- Oracle result column의 이름을 구한다. Ora_ColumnType -- Oracle result column의 type을 구한다. Ora_Commit -- Oracle transaction을 commit 한다. Ora_Error -- Oracle error message를 구한다. Ora_ErrorCode -- Oracle error code를 구한다. Ora_Exec -- Oracle cursor에 있는 parse된 문장을 실행한다. Ora_Fetch -- cursor에서 data의 row를 가져온다. Ora_GetColumn -- 가져온 row에서 data를 구한다. Ora_Logoff -- Oracle connection을 닫는다. Ora_Logon -- Oracle connection을 연다. Ora_Open -- Oracle cursor를 연다. Ora_Parse -- SQL 문장을 해석(parse)한다. Ora_Do -- Ora_FetchInto -- Ora_columnsize -- Ora_numcols -- Ora_numrows --
라. 아파치 웹서버와 PHP3 를 이용한 방명록의 작성 이제 기다리던 방명록 구현 시간이다. 사실 방명록 구현은 그리 어려운 게 아닌데(공개 소스가 널려있다) 위안이라면, 값비싼 Oracle DBMS 에 한번 돌려본다는 것이고, 이를 초석으로 게시판도 만들 수 있다는 자신감의 배양일 것이다. 디자인 이라던지 프로그래밍 힌트는 여러분들이 잘 아시다시피 PHP3 로 유명한 정진호님( http://sera.ditco.com )의 홈페이지에 공개되어있는 mysql 로 만들어진 방명록을 참고하였다. 모든 이미지와 페이지의 레이아웃은 정진호님의 그것과 같음을 밝힌다. 그런데 더더욱 놀랄 일은, 이 작업을 또 http://sunny.sarang.net 에 계시는 분(마소에 PHP3 를 연재하신 분으로 알고 있다)이 다시 구현했다는 것이다. 정진호님과 더불어 PHP, 특히 Oracle 과의 연동에 관심이 많으신 분이니 도움이 될 것이다. 방명록 구현에 있어 필자는 sequence를 사용해 보았다. 이는 게시물의 순차적인 순번을 파악하기 위해서인데, 여기서는 게시물 삭제를 위한 Primary Key로 사용하였다. Oracle에서 sequence를 사용하려면 다음과 같이 해준다. create sequence <sequence_name>; sequence 의 값을 구하기 위해서는 .nextval, .currval 의 두 인자를 사용하는데, .currval을 사용하기 위해서는 먼저 .nextval로서 값을 생성한 후에라야 가능하다. 데이터베이스에 방명록의 내용을 저장하기 위하여, table을 만들자. create table gbook ( sequence 는 다음과 같이 생성한다. create sequence gbook_no; 다음은 직접 PHP3 code 를 하나씩 살펴보도록 하자. <? // Oracle 환경설정 PutEnv(“ORACLE_HOME=/home/oracle/app/ // 방명록을 위해 생성한 gbook Database 로의 접속 $con = ora_logon(“gbook”,”*****”) or die(
“ SQL server에 연결할 수 없습니다. “); // 1페이지당 자료수 $scale= 5 ; // 새글 올리기 if($mode==’up’) $query = “insert into gbook
values(‘gbook_no. // 내용 보여 주기 if(!$mode || $result) if(!$start){ $start= 0 ;} $query=”select count(*) from
gbook”; // 게시물의 총 개수를 계산한다. $total = ora_getcolumn($curs,0); $query=”select * from gbook order
by no desc”; // 페이지 당 게시물 수만큼 보여줌 if($start) for($k=0;$k<$start;$k++) for($i=$start ; $i< $start+$scale ; $i++) // start 에서 scale 까지만 { if($i< $total ) // 전체 자료 개수까지만 출력 { ora_fetch($curs); echo(“ ----------- 화면 출력 ------------------”); // 하단 버튼 if(!$mode || $result) $p_p=$start- $scale ; if($p_p>=0 && $mode!=’new’) if($n_p<$total && $mode !=
‘new’) ?> 실제적인 글쓰기 폼 등은 생략되었고, 중요 부분만
나열해 보았다.
마치는 글 이제까지 3 회에 걸쳐 Linux 에서의 Oracle 활용방도를 알아보았다. 연재된 내용에 맞추어 책을 찾아가며 공부하신 분이면 이제는 꽤나 자신감을 가졌을 것이다. 언제나 그렇듯이 아주 자세하게 일일이 적지 못함을 죄송하게 생각하고 계속 여러분들의 실력이 나아지기를 바랄 뿐이다. Linux World 초기에 X WINDOWS 강좌를 거쳐 Firewall 그리고 이제 Oracle 까지 글을 썼다. 다음엔 어떤 분야의 글이 내 손에 의해 써질까? 스스로도 기대가 된다. |