살다

Linux 및 Windows 환경을 위한 PHP, Oracle 10g Instant Client 설치 본문

프로그래밍

Linux 및 Windows 환경을 위한 PHP, Oracle 10g Instant Client 설치

텅스텐필름 2010. 9. 27. 15:46

PHP 5.1.2 업데이트

저자: Christopher Jones, Consulting Technical Staff, Oracle Corporation
업데이트일: 2006년 1월

Oracle 10g Instant Client (무료로 다운로드가 가능합니다)는 PHP를 원격 오라클 데이터베이스에 연결하기 위한 가장 손쉬운 방법으로, 3 개의 라이브러리만 설치하면 사용이 가능합니다.

PHP에서 Oracle API의 액세스에 사용되는 Instant Client 라이브러리는 OCI8이라는 이름으로 불립니다 (이 이름은 Oracle8 버전에서 최초로 개발되면서 붙여진 것입니다). PHP Oracle 8 함수 를 이용하여 Oracle 8.1.7, 9.x, 10.x를 직접 호출할 수 있고, 또는 PEAR MDB2ADOdb 등의 추상화 클래스(abstraction class)를 함께 이용할 수도 있습니다.

구 버전의 PHP “oracle” 익스텐션을 Instant Client에서 이용하는 것도 가능하지만, 이 경우에는 (오라클에 의해 더 이상 지원되지 않는) 구 버전의 Oracle API가 사용됩니다. 이러한 이유로, PHP 커뮤니티와 오라클은 새로운 개발작업에서 이 익스텐션을 사용하는 것을 권장하지 않고 있습니다.

Apache 환경에서 PHP 4 또는 PHP 5와 함께 Instant Client를 사용하기 위한 방법이 아래에 설명되어 있습니다. (5.1.2와 OCI8 익스텐션에 관련한 상세한 정보는 이 섹션을 참고하시기 바랍니다.) Instant Client에는 오라클 데이터베이스가 포함되어 있지 않으므로, 별도의 데이터베이스 환경이 미리 구축되어 있어야 합니다.

일반적으로 데이터베이스는 다른 머신에서 운영됩니다. 데이터베이스가 로컬에 설치된 경우에는, 필요한 오라클 컴포넌트가 이미 사용 가능하므로, Instant Client를 따로 설치할 필요가 없습니다.

소프트웨어 요구사항:

소프트웨어 참고
Oracle Instant Client "Instant Client Package - Basic"을 다운로드합니다. Linux 환경의 경우, "Instant Client Package - SDK"를 함께 다운로드합니다.
Apache HTTPD Server PHP 커뮤니티는 Apache 1.3을 권장하고 있습니다.
PHP - PHP Hypertext Processor Version 4.3 또는 이후 버전

Windows 환경에서 PHP OCI8 Extension 활성화하기

Instant Client 바이너리는 PHP에 포함된 Windows용 바이너리를 보완하는 역할을 담당하게 됩니다.

  1. (installer build가 아닌) PHP 바이너리 zip 파일과 Apache를 다운로드합니다. PHP 매뉴얼의 Windows 시스템 설치 가이드를 참고하여 설치 작업을 수행합니다. OTN의 오픈 소스 개발자 센터에서 "Oracle, PHP, and Apache on Windows 2000/XP 환경의 Oracle, PHP, Apache 설치,"와 같은 유용한 기술정보를 참고하실 수 있습니다. 이 문서에는 Oracle 10g를 전체 설치하는 방법이 설명되어 있습니다 (Instant Client 설치 시에는 이 작업이 필요하지 않습니다).

    다음 단계로 진행하기 전에 PHP가 제대로 동작하는지 확인합니다. 이 단계에서는 오라클 연동 기능은 지원되지 않습니다.

  2. OTN의 Instant Client 페이지에서 Instant Client Basic package for Windows를 다운로드합니다. zip 파일의 사이즈는 대략 30 MB 정도 됩니다.

  3. 서브디렉토리(예: c:\instantclient10_1)를 생성하고 zip 파일로부터 아래 라이브러리를 복사합니다:

    • oraociei10.dll
    • orannzsbb10.dll
    • oci.dll

    3개 파일의 총 용량은 약 80MB 정도 됩니다.

    PHP의 구 버전 oracle extension을 사용하려는 경우, oci.dll 대신 ociw32.dll을 복사합니다 (이 익스텐션을 활성화하려면 php.ini 파일에서 "extension=php_oracle.dll"로 설정합니다.)

  4. PATH 환경변수를 편집하여 “c:\instantclient10_1”가 다른 오라클 디렉토리의 앞에 위치하게 합니다.

    Windows 2000의 경우, 시작 -> 설정 -> 제어판 -> 시스템 -> 고급 -> 환경 변수로 이동하여 시스템 변수 목록의 PATH를 편집합니다.

    tnsnames.ora 파일을 이용하여 Oracle Net 서비스 네임을 정의한 경우, tnsnames.ora를 c:\instantclient10_1로 복사하고 사용자 환경변수 TNS_ADMIN을 c:\instantclient10_1로 복사합니다. 디폴트 서비스 네임은 사용자 환경변수 LOCAL에 추가로 설정할 수 있습니다.

    NLS_LANG과 같은 Oracle globalization language 환경변수를 필요에 따라 설정합니다. 아무것도 설정되지 않은 경우, 디폴트 로컬 환경이 그대로 사용됩니다. 자세한 정보는 An Overview on Globalizing Oracle PHP Applications 문서를 참고하십시오.

    Unset unnecessary Oracle variables such as ORACLE_HOME and ORACLE_SID.

  5. php.ini를 편집하고 OCI8 익스텐션의 커멘트 기호를 삭제합니다:

    extension=php_oci8.dll
    

    extension_dir 항목에 PHP 익스텐션 DLL의 전체 경로를 설정합니다. PHP4의 경우 DLL은 PHP 소프트웨어의 “extensions” 서브디렉토리에 위치합니다. PHP5에서는 “ext” 서브디렉토리에 위치합니다.

  6. Apache를 재시작합니다.

익스텐션이 설정되었음을 확인했다면, 웹 서버에서 접근할 수 있는 위치에 간단한 PHP 스크립트(phpinfo.php)를 생성합니다.

<?php
  phpinfo();
?>

"http://" URL을 사용하여 브라우저에서 스크립트를 로드합니다. 브라우저 페이지의 "oci8" 섹션에서 "OCI8 Support enabled"라는 문구를 확인할 수 있어야 합니다.

Linux에서 PHP OCI8 Extension 활성화하기

Linux 환경에서 오라클 연결을 추가하려면, 먼저 PHP를 다시 컴파일해야 합니다.

OTN의 오픈 소스 개발자 센터에서 " Linux에서 Oracle, PHP, Apache 설치하기",와 같은 유용한 기술정보를 참고하실 수 있습니다. 이 문서에는 Oracle 10g를 전체 설치하는 방법이 설명되어 있습니다 (Instant Client 설치 시에는 이 작업이 필요하지 않습니다.

  1. Apache를 다운로드하여 설치합니다. 사용자의 홈 디렉토리에 Apache를 설치하는 예가 아래와 같습니다:
    cd apache_1.3.31
    ./configure --enable-module=so --prefix=$HOME/apache --with-port=8888
    make
    make install
    

    $HOME/apache/conf/httpd.con을 편집하여 아래 항목을 추가합니다:

    AddType application/x-httpd-php        .php
    AddType application/x-httpd-php-source .phps
    
  2. PHP를 다운로드하여 tar 압축을 풉니다.
  3. OTN의 Instant Client 페이지에서 Basic/SDK Instant Client Package를 다운로드합니다. 두 RPM의 전체 크기는 약 30MB 가량 됩니다.
  4. root 사용자로 RPM을 설치합니다.
    rpm -Uvh oracle-instantclient-basic-10.1.0.3-1.i386.rpm
    rpm -Uvh oracle-instantclient-devel-10.1.0.3-1.i386.rpm
    

    첫 번째 RPM은 오라클 라이브러리를 /usr/lib/oracle/10.1.0.3/client/lib에 설치하고, 두 번째 RPM은 /usr/include/oracle/10.1.0.3/client에 헤더를 생성합니다.

  5. 백업 후 이 패치를 PHP의 ext/oci8/config.m4에 적용합니다. 패치 라인 넘버는 PHP 4.3.9를 기준으로 하고 있습니다. (PHP 4.3.11와 5.0.4의 경우처럼) PHP bug 31084가 해결되었다면 이 패치를 적용할 필요는 없습니다.

    PHP 4.3.9 또는 4.3.10을 사용하는 경우에는 이 패치를 파일(예: php_oci8ic_buildpatch)에 저장한 후 아래와 같이 설치합니다:

    patch -u config.m4 php_oci8ic_buildpatch
    

    위 패치를 실행하면 새로운 PHP 설정 매개변수 --with-oci8-instant-client[=DIR]이 생성됩니다. Linux 운영체제는 기본적으로 RPM을 통해 설치된 Instant Client의 최신 버전을 사용합니다. 오라클 라이브러리의 경로를 지정함으로써 다른 버전을 사용하도록 할 수도 있습니다. 어떤 경우든 버전에 맞는 SDK 헤더가 자동적으로 적용됩니다.

    새로운 매개변수는 기존의 --with-oci8 매개변수를 대체합니다.

    참고: Linux 이외의 운영체제에서는, 사용자가 선택한 디렉토리에 Instant Client 패키지의 압축을 풀게 됩니다. --with-oci8-instant-client 매개변수를 사용하려면 이 디렉토리를 명시적으로 지정해 주어야 합니다 (예: --with-oci8-instant-client=/home/instantclient10_1) Instant Client SDK는 Basic Package와 같은 디렉토리에 압축을 풀어야만, 재구성된 configure 스크립트에서 헤더 파일의 서브디렉토리를 정확하게 찾을 수 있습니다.

  6. “configure” 스크립트를 최상위 PHP 디렉토리에서 rebuild 합니다.
    cd php-4.3.9
    rm -rf autom4te.cache config.cache
    ./buildconf --force
    
  7. 새로운 옵션을 이용하여 configure를 실행합니다. 홈 디렉토리에 Apache를 설치한 환경에서의 실행 예가 아래와 같습니다.
       ./configure \
          --with-oci8-instant-client \
          --prefix=$HOME/php --with-apxs=$HOME/apache/bin/apxs \
          --enable-sigchild --with-config-file-path=$HOME/apache/conf
    
  8. PHP를 rebuild합니다.
    make
    make install
    
  9. php.ini 파일을 --with-config-file-path에서 지정된 위치에 복사합니다.
    cp php.ini-recommended $HOME/apache/conf/php.ini
    
  10. LD_LIBRARY_PATH를 /usr/lib/oracle/10.1.0.3/client/lib으로 설정하고 Apache를 재시작합니다.

    tnsnames.ora 파일을 이용하여 Oracle Net 서비스 네임을 정의한 경우, TNS_ADMIN을 파일이 위치한 디렉토리로 설정해 줍니다.

    Apache를 시작하기 전에 모든 오라클 환경 변수를 설정해 주는 것이 중요합니다. 스크립트의 예가 아래와 같습니다:

    #!/bin/sh
    
    APACHEHOME=/home/apache
    
    LD_LIBRARY_PATH=/usr/lib/oracle/10.1.0.3/client/lib:${LD_LIBRARY_PATH}
    TNS_ADMIN=/home
    export LD_LIBRARY_PATH TNS_ADMIN
    
    echo Starting Apache 
    $APACHEHOME/apachectl start
    
익스텐션의 설정을 확인한 후, 웹 서버가 접근할 수 있는 위치에 간단한 PHP 스크립트(phpinfo.php)를 생성합니다.
<?php
  phpinfo();
?>

URL("http://localhost:8888/<path>/phpinfo.php”)을 사용하여 스크립트를 브라우저에 로드합니다. 브라우저 페이지의 "oci8" 섹션에서 "OCI8 Support enabled"라는 문구를 확인할 수 있어야 합니다.

오라클로의 연결

오라클 연결을 생성하려면 먼저 오라클 연결 정보를 OCILogon()에 전달해 주어야 합니다. Instant Client와 관련된 모든 툴은 데이터베이스 서버의 “원격”에 위치하며, 따라서 사용자 이름, 암호와 함께 Oracle Net connection identifier가 사용되어야 합니다. 기존에 구성된 오라클 데이터베이스에 대한 연결 정보는 외부에서 “well-known” 정보로 확인이 가능합니다. 새로 구성된 시스템에서는 데이터베이스 셋업 과정에서 오라클 설치 프로그램에 의해 설정됩니다. 인스톨러는 Oracle Net 설정 및 서비스 네임 생성 작업을 수행합니다.

새로운 데이터베이스에서 HR와 같은 샘플 스키마를 사용하려면 unlock 작업을 수행하고 암호를 입력해야 할 수 있습니다. 이를 위해 SQL*Plus에서 SYSTEM 사용자로 연결한 뒤 아래와 같이 실행해 줍니다:

ALTER USER username IDENTIFIED BY new_password ACCOUNT UNLOCK;
연결 정보를 PHP에 전달하는 방법에는 여러 가지가 있습니다. 먼저 Oracle 10g의 Easy Connect 신택스를 이용하여 mymachine에서 실행 중인 the MYDB 데이터베이스 서비스의 HR 스키마에 연결하는 방법이 아래와 같습니다. 이 경우 tnsnames.ora 또는 다른 Oracle Network 파일이 필요하지 않습니다:
$c = OCILogon('hr', 'hr_password', '//mymachine.mydomain/MYDB');

Easy Connect 신택스 관련 오라클 문서(Using the Easy Connect Naming Method)를 참고하시기 바랍니다.

또는, /home/tnsnames.ora에 다음과 같은 내용이 포함된 경우:
MYDB =
 (DESCRIPTION =
   (ADDRESS = (PROTOCOL = TCP)(HOST = mymachine.mydomain)(PORT = 1521))
   (CONNECT_DATA =
      (SERVER = DEDICATED)
      (SERVICE_NAME = MYDB)
    )
  )

그리고 TNS_ADMIN 환경변수가 (Apache 시작 이전에) /home으로 설정된 경우, 연결 문자열을 아래와 같이 설정할 수 있습니다:

$c = OCILogon('hr', 'hr_password', 'MYDB');

      
환경변수 LOCAL(Windows) 또는 TWO_TASK(Linux)가 MYDB로 설정된 경우, MYDB로의 연결을 위한 문자열이 다음과 같습니다:
$c = OCILogon('hr', 'hr_password');

Oracle의 사용

기본적인 연결에 성공했다면, 간단한 스크립트(testoci.php)를 테스트해 볼 차례입니다. 사용자의 데이터베이스 환경에 맞게 연결 설정을 수정한 후 브라우저에서 스크립트를 로드합니다. HR 사용자가 소유한 모든 테이블의 목록을 표시하는 스크립트 예가 아래와 같습니다:

<?php

$conn = OCILogon("hr", "hr_password", '//mymachine.mydomain:port/MYDB);

$query = 'select table_name from user_tables';

$stid = OCIParse($conn, $query);
OCIExecute($stid, OCI_DEFAULT);
 while ($succ = OCIFetchInto($stid, $row)) {
    foreach ($row as $item) {
      echo $item." ";
    }
    echo "<br>\n";
 }

 OCILogoff($conn);

 ?>
트러블슈팅

Oracle PHP Troubleshooting FAQ에서 오라클 연결에 관련한 유용한 정보를 확인하실 수 있습니다.

오라클의 SQL*Plus 커맨드라인 툴을 Instant Client 페이지에서 다운로드하여 환경 및 연결 문제를 해결하는데 이용할 수 있습니다. SQL*Plus Instant Client Release Notes를 참고하시기 바랍니다.

SQL*Plus를 이용하여 환경을 점검하는 방법은 phpino.php 스크립트의 예와 동일합니다.

Windows 도움말

phpinfo.php 스크립트를 실행했을 때 “oci8” 섹션에서 "OCI8 Support enabled" 메시지를 확인할 수 없다면, php.ini 파일에서 "extension=php_oci8.dll" 항목의 주석 처리가 해제되었는지 점검합니다.

PATH가 잘못 설정되어 있거나 오라클 라이브러리를 찾을 수 없는 경우, Apache 시작 시 다음과 같은 경고 메시지가 표시됩니다: "The dynamic link library OCI.dll could not be found in the specified path." phpinfo() 페이지의 Environment 섹션에서, PHP에 의해 실제로 사용되는 PATH와 Oracle 변수의 값을 확인할 수 있습니다.

php.ini에 extension_dir 매개변수가 올바르게 설정되지 않은 경우 Apache 시작 시 다음과 같은 경고 메시지가 표시됩니다: "PHP Startup: Unable to load dynamic library php_oci8.dll."

Linux 도움말

config.m4가 올바르게 패치되었는지 확인합니다. “configure”의 실행에 실패한 경우, config.log 파일을 점검합니다. config.m4를 이전 상태로 되돌리고 캐시 파일을 제거한 후 “./buildconf --force and configure”를 실행한 다음, 발생한 문제가 패치 작업과 관련된 것인지 확인합니다.

“configure”의 타임스탬프가 현재 시점으로 설정되어 있는지 확인합니다. 캐시 파일을 모두 제거하고 필요한 경우 rebuild 작업을 수행합니다.

Apache를 시작하는 쉘에서 필요한 모든 Oracle 환경변수를 설정해 줍니다.

PHP 5.1.2 및 이후 버전

“re-factored” OCI8 익스텐션은 Instant Client를 위한 새로운 신택스를 지원합니다. re-factored 익스텐션은 PHP 5.1.2에 처음으로 포함되었으며, 이전 버전의 PHP의 경우pecl.php.net/package/oci8, pecl4win.php.net/ext.php/php_oci8.dll에서 다운로드할 수 있습니다.

Technical Note에 명시된 대로 Instant Client RPM을 설치했다면, PHP를 아래와 같이 설정해 줍니다:

./configure \
    --with-oci8=instantclient,/usr/lib/oracle/10.1.0.3/client/lib \
    --prefix=$HOME/php --with-apxs=$HOME/apache/bin/a
	pxs \
    --enable-sigchild --with-config-file-path=$HOME/apache/conf
Instant Client Basic, SDK zip 파일을 사용하는 경우, 압축을 푼 디렉토리의 --with-oci8 옵션을 변경해 줍니다. 그 예가 아래와 같습니다:
--with-oci8=instantclient,$HOME/instantclient10_1 
re-factored 버전이 올바르게 설치되었는지 점검하려면 phpinfo() 실행 결과를 확인하면 됩니다. “oci8.” 접두어로 시작되는 7가지 매개변수를 확인할 수 있을 것입니다 (이전 버전에서는 이 매개변수가 존재하지 않습니다).

결론

이 문서가 여러분에게 도움이 되었기를 바랍니다. 질문이나 의견은 OTN Instant Client 또는 PHP 포럼에 올려 주시기 바랍니다.

출처 : http://www.oracle.com/technology/global/kr/pub/notes/technote_php_instant.html

반응형

'프로그래밍' 카테고리의 다른 글

jqueryUI tab에 구글맵 삽입시 유의점  (0) 2010.12.30
아이폰에서 메일이 깨져 보인다!!  (0) 2010.08.19
Windows Script Host  (0) 2009.09.18