Oracle OCI8 설치

OCI8로 PHP 구성하기

OCI8을 구성하기 전에 이전 요구 사항 섹션을 검토하십시오.

웹 서버를 시작하기 전에 OCI8은 일반적으로 라이브러리를 찾고 구성 파일을 가리키며 Oracle 라이브러리에서 사용하는 문자 집합과 같은 몇 가지 기본 속성을 설정하기 위해 여러 Oracle 환경 변수(아래 참조)가 필요합니다. PHP 프로세스가 시작되기 전에 변수를 설정해야 합니다.

PHP 바이너리는 구성된 것과 동일하거나 더 최신의 Oracle 라이브러리 주요 버전과 연결되어야 합니다. 예를 들어 Oracle 19 라이브러리를 사용하여 OCI8을 빌드하는 경우 PHP도 배포하고 Oracle 19 라이브러리와 함께 실행해야 합니다. Oracle은 클라이언트-서버 버전 간 호환성이 있으므로 PHP 애플리케이션은 다른 버전의 Oracle Database에 연결할 수 있습니다.


pecl 명령을 사용하여 PECL에서 OCI8 설치

» PECL 저장소를 사용하여 기존 PHP 설치에 OCI8 확장을 추가할 수 있습니다.

  • 방화벽 뒤에 있는 경우 PEAR의 프록시를 설정합니다. 예를 들면 다음과 같습니다.
    pear config-set http_proxy http://my-proxy.example.com:80/
                      
  • Run
    pecl install oci8
                      

    PHP 7의 경우 pecl install oci8-2.2.0 사용

  • 메시지가 표시되면 $ORACLE_HOME 값이나 instantclient,/path/to/instant/client/lib를 입력합니다.

    참고: $ORACLE_HOME 또는 $HOME과 같은 변수 이름은 pecl이 확장하지 않으므로 입력하지 마십시오. 대신 확장된 경로를 입력하십시오(예: /opt/oracle/product/19c/dbhome_1 또는 instantclient,/Users/myname/Downloads/instantclient_19_8).

  • oci8_dtrace_gen.h: No such file or directory 오류가 발생하면 PHP가 DTrace Dynamic Tracing이 활성화된 상태로 빌드되었음을 의미합니다. 다음을 사용하여 설치:
    $ export PHP_DTRACE=yes
    $ pecl install oci8
                     
  • php.ini 파일을 편집하고 다음 행을 추가하십시오.
    extension=oci8.so
                       

    php.ini 지시문 extension_diroci8.so가 설치된 디렉토리로 설정되어 있는지 확인하십시오.


phpize를 사용하여 PECL에서 OCI8 설치

pecl 명령어를 사용할 수 없을 때 기존 PHP 설치에 OCI8을 설치하려면 » PECL OCI8 패키지를 수동으로 다운로드하세요. 예: oci8-3.0.0.tgz.

  • 패키지를 추출합니다.
    tar -zxf oci8-3.0.0.tgz
    cd oci8-3.0.0
                       
  • 패키지 준비:
    phpize
                       
  • $ORACLE_HOME 또는 Instant Client를 사용하여 패키지 구성
    ./configure -with-oci8=shared,$ORACLE_HOME
                       

    또는

    ./configure -with-oci8=shared,instantclient,/path/to/instant/client/lib
                       
  • 패키지 설치:
    make install
                       
  • oci8_dtrace_gen.h: No such file or directory 오류가 발생하면 PHP가 DTrace Dynamic Tracing이 활성화된 상태로 빌드되었음을 의미합니다. 이 환경 변수를 설정한 후 configuremake 명령을 다시 실행하십시오.
    $ export PHP_DTRACE=yes
                     
  • php.ini 파일을 편집하고 다음 행을 추가하십시오.
    extension=oci8.so
                       

    php.ini 지시문 extension_diroci8.so가 설치된 디렉토리로 설정되어 있는지 확인하십시오.


PHP 빌드 시 공유 확장으로 OCI8 설치

소스 코드에서 PHP를 빌드하는 경우 구성 공유 옵션을 사용하여 OCI8을 PHP에 동적으로 로드할 수 있는 공유 라이브러리로 빌드할 수 있습니다. 공유 확장을 구축하면 PHP의 나머지 부분에 영향을 주지 않고 OCI8을 쉽게 업그레이드할 수 있습니다.

다음 구성 옵션 중 하나를 사용하여 OCI8을 구성합니다.

  • 무료 » Oracle Instant Client 라이브러리를 사용하는 경우 다음을 수행하세요.
    ./configure --with-oci8=shared,instantclient,/path/to/instant/client/lib
                       

    Instant Client 12.2(또는 이전 버전)가 ZIP 파일에서 설치된 경우 라이브러리 심볼릭 링크를 먼저 생성해야 합니다(예: ln -s libclntsh.so.12.1 libclntsh.so).

    Oracle Instant Client의 RPM 기반 설치를 사용하는 경우 구성 행은 다음과 같습니다.

    ./configure --with-oci8=shared,instantclient,/usr/lib/oracle//client/lib
                       

    예: --with-oci8=shared,instantclient,/usr/lib/oracle/19.9/client/lib

    Oracle Instant Client 지원은 PHP 4.3.11 및 5.0.4에서 처음 등장했으며 원래는 ----with-oci8-instant-client 옵션을 사용하여 PHP를 구성했습니다.

  • Oracle 데이터베이스 또는 전체 Oracle 클라이언트 설치를 사용하는 경우 다음을 수행하십시오.
    ./configure --with-oci8=shared,$ORACLE_HOME
                       

    웹 서버 사용자(nobody, www)가 $ORACLE_HOME 디렉토리 아래에 있는 라이브러리, 초기화 파일 및 tnsnames.ora(사용되는 경우)에 액세스할 수 있는지 확인하십시오. Oracle 10gR2에서는 $ORACLE_HOME/install/changePerm.sh 유틸리티를 실행하여 디렉토리 액세스 권한을 부여해야 할 수 있습니다.

구성 후 일반적인 PHP 구축 절차를 따르십시오. e.g. make install. OCI8 공유 확장 oci8.so 라이브러리가 생성됩니다. php.ini 파일의 extension_dir 옵션으로 지정된 PHP 확장 디렉토리로 수동으로 이동해야 할 수도 있습니다.

OCI8 설치를 완료하려면 php.ini를 편집하고 다음 행을 추가하십시오.

extension=oci8.so
                

PHP 빌드 시 정적으로 컴파일된 확장으로 OCI8 설치하기

소스 코드에서 PHP를 빌드하는 경우 다음 구성 옵션 중 하나를 사용하여 OCI8을 정적 확장으로 포함하도록 PHP를 구성할 수 있습니다.

  • Oracle Instant Client를 사용하는 경우 다음을 수행합니다.
    ./configure --with-oci8=instantclient,/path/to/instant/client/lib
                       
  • Oracle 데이터베이스 또는 전체 Oracle 클라이언트 설치를 사용하는 경우 다음을 수행하십시오.
    ./configure --with-oci8=$ORACLE_HOME
                       

구성 후 일반적인 PHP 구축 절차를 따르십시오. e.g. make install. 컴파일이 성공하면 php.inioci8.so를 추가할 필요가 없습니다. 추가 빌드 단계가 필요하지 않습니다.


Windows에 OCI8 설치

OCI8 확장은 » PECL 저장소의 DLL 또는 PHP 설치의 ext 디렉토리에 있는 라이브러리를 사용하여 기존 PHP 설치에 추가할 수 있습니다.

Oracle 12c(또는 그 이상) 라이브러리의 경우 php.ini 라인 extension=php_oci8_12c.dll 또는 extension=php_oci8_11g.dll 또는 extension=php_oci8.dll 중 하나의 주석 처리를 제거합니다. 이러한 DLL 중 하나만 한 번에 활성화할 수 있습니다. 더 높은 버전의 DLL에는 더 많은 기능이 포함될 수 있습니다. 모든 PHP 버전에서 모든 DLL을 사용할 수 있는 것은 아닙니다. extension_dir이 PHP 확장 DLL을 포함하는 디렉토리로 설정되어 있는지 확인하십시오.

Instant Client를 사용하는 경우 시스템 PATH 환경 변수를 Oracle 라이브러리 디렉토리로 설정합니다.


Oracle 환경 설정

이 확장을 사용하기 전에 웹 데몬 사용자에 대해 Oracle 환경 변수가 올바르게 설정되어 있는지 확인하십시오. 웹 서버가 부팅 시 자동으로 시작되는 경우 부팅 시 환경도 올바르게 구성되어 있는지 확인하십시오.

메모: 스크립트가 실행되기 전에 Oracle 라이브러리가 로드 및 초기화될 수 있으므로 PHP 스크립트에서 putenv()를 사용하여 Oracle 환경 변수를 설정하지 마십시오. 그러면 putenv()로 설정된 변수가 충돌, 충돌 또는 예측할 수 없는 동작을 유발할 수 있습니다. 일부 함수는 작동할 수 있지만 다른 함수에서는 미묘한 오류가 발생할 수 있습니다. 웹 서버가 시작되기 전에 변수를 설정해야 합니다.

Red Hat Linux 및 변형에서는 /etc/sysconfig/httpd의 끝에 변수를 내보냅니다. Apache 2가 있는 다른 시스템은 Apache bin 디렉토리에 있는 envvars 스크립트를 사용할 수 있습니다. 세 번째 옵션인 httpd.conf의 Apache SetEnv 지시문은 일부 시스템에서는 작동할 수 있지만 다른 시스템에서는 충분하지 않은 것으로 알려져 있습니다.

환경 변수가 올바르게 설정되었는지 확인하려면 phpinfo()를 사용하고 환경(Apache 환경이 아님) 섹션에 예상 변수가 포함되어 있는지 확인하십시오.

필요할 수 있는 변수는 다음 표에 나와 있습니다. 사용 가능한 모든 변수에 대한 자세한 내용은 Oracle 설명서를 참조하십시오.

일반적인 Oracle 환경 변수

Name Purpose
ORACLE_HOME 전체 Oracle Database 소프트웨어의 디렉토리를 포함합니다. Oracle Instant Client를 사용하는 경우에는 필요하지 않으며 설치 문제를 일으킬 수 있으므로 설정하지 마십시오.
ORACLE_SID 연결할 로컬 시스템의 데이터베이스 이름을 포함합니다. Oracle Instant Client를 사용하거나 항상 연결 매개변수를 oci_connect()에 전달하는 경우 이를 설정할 필요가 없습니다.
LD_LIBRARY_PATH 이것을 Oracle 라이브러리의 위치(예: $ORACLE_HOME/lib 또는 /usr/lib/oracle/18.5/client/lib)로 설정합니다(또는 LIBPATH 또는 SHLIB_PATH와 같은 해당 플랫폼). Linux의 Instant Client ZIP 파일의 경우 ldconfig를 대신 사용하는 것이 더 안정적입니다. Instant Client 설치 지침을 참조하십시오. Instant Client 19(또는 그 이상) RPM 파일을 사용하면 ldconfig가 자동으로 실행됩니다. 일부 사용자는 LD_LIBRARY_PATH 대신 LD_PRELOAD를 사용합니다.
NLS_LANG 이것은 Oracle 라이브러리에서 사용하는 문자 집합 및 전역화 정보를 설정하기 위한 기본 변수입니다.
ORA_SDTZ Oracle 세션 시간대를 설정합니다.
TNS_ADMIN tnsnames.orasqlnet.ora와 같은 Oracle Net Services 구성 파일이 보관되는 디렉토리를 포함합니다. oci_connect() 연결 문자열이 localhost/XE와 같은 Easy Connect 명명 구문을 사용하는 경우 필요하지 않습니다. 네트워크 구성 파일이 /usr/lib/oracle/VERSION/client/lib/network/admin, $ORACLE_HOME/network/admin 또는 /etc와 같은 기본 위치 중 하나에 있는 경우 필요하지 않습니다.

덜 자주 사용되는 Oracle 환경 변수에는 TWO_TASK, ORA_TZFILENLS*ORA_NLS_* 변수와 같은 다양한 Oracle 전역화 설정이 있습니다.


문제 해결

OCI8을 설치할 때 가장 일반적인 문제는 Oracle 환경이 올바르게 설정되지 않은 것입니다. 이것은 일반적으로 oci_connect() 또는 oci_pconnect()를 사용하는 문제로 나타납니다. 이 오류는 정의되지 않은 함수 oci_connect() 호출과 같은 PHP 오류, ORA-12705와 같은 Oracle 오류 또는 Apache 충돌일 수 있습니다. Apache 로그 파일에서 시작 오류를 확인하고 위의 섹션을 참조하여 이 문제를 해결하십시오.

ORA-12154 또는 ORA-12514와 같은 네트워크 오류는 Oracle 네트워크 이름 지정 또는 구성 문제를 나타내지만 근본 원인은 PHP 환경이 잘못 설정되고 Oracle 라이브러리가 tnsnames.ora 구성 파일을 찾을 수 없기 때문일 수 있습니다.

Windows에서 PHP가 올바른 버전의 Oracle만 사용하도록 주의를 기울이지 않는 한 한 시스템에 여러 버전의 Oracle이 있으면 쉽게 라이브러리 충돌이 발생할 수 있습니다.

찾고 로드되는 라이브러리를 검사하는 유틸리티는 특히 Windows에서 누락되거나 충돌하는 라이브러리 문제를 해결하는 데 도움이 될 수 있습니다.

참고: 웹 서버가 시작되지 않거나 시작 시 충돌하는 경우

Apache가 pthread 라이브러리와 연결되어 있는지 확인합니다.

# ldd /www/apache/bin/httpd
  libpthread.so.0 => /lib/libpthread.so.0 (0x4001c000)
  libm.so.6 => /lib/libm.so.6 (0x4002f000)
  libcrypt.so.1 => /lib/libcrypt.so.1 (0x4004c000)
  libdl.so.2 => /lib/libdl.so.2 (0x4007a000)
  libc.so.6 => /lib/libc.so.6 (0x4007e000)
  /lib/ld-linux.so.2 => /lib/ld-linux.so.2 (0x40000000)
                  

libpthread가 목록에 없으면 Apache를 다시 설치합니다.

# cd /usr/src/apache_1.3.xx
# make clean
# LIBS=-lpthread ./config.status
# make
# make install
                  

UnixWare와 같은 일부 시스템에서는 libpthread 대신 libthread입니다. PHP와 Apache는 EXTRA_LIBS=-lthread로 구성해야 합니다.