RSS구독하기:SUBSCRIBE TO RSS FEED
즐겨찾기추가:ADD FAVORITE
글쓰기:POST
관리자:ADMINISTRATOR
'PHP5'에 해당되는 글 2
php 5.2.x버전 이상에서는 [--with-oci8=]이라는 configure 옵션에는 있지만 먹히지 않는 기묘한 현상을 보인다.

결국 뒤져본 결과 참으로 허탈한 답변을 구할 수 있었다.

first read what i wrote about:
I'm telling not about oracle8, but about oracle9 and oracle10.

extension name is OCI8 , but it used for oracle from 8 to 10
NOT ONLY TO ORACLE 8 (!)

------------------------------------------------------------------------

[2007-08-28 11:14:58] [EMAIL PROTECTED]

We don't support Oracle 8 anymore. :)

------------------------------------------------------------------------

그래 뭐.. 버전이 업데이트가 많이 된 상황이니 지원을 안 할 수도 있겠지..
라고 생각하고 다음 코멘트를 봤다.

[10 May 8:05pm UTC] tony2001@php.net

Upgrade to newer Oracle version.


OTL ...  새걸로 업그레이드 해라. 말이 업그레이드지...
그게 맘대로 되는 것이더냐!

구글신의 힘을 빌어 뒤져 본 결과.
역시나 방법(편법)이 있었다!

오류내용)
/usr/local/src/php-5.2.3/ext/oci8/oci8_lob.c:304: error:
`OCI_NLS_CHARSET_MAXBYTESZ' undeclared (first use in this function)
/usr/local/src/php-5.2.3/ext/oci8/oci8_lob.c:304: error: (Each
undeclared identifier is reported only once
/usr/local/src/php-5.2.3/ext/oci8/oci8_lob.c:304: error: for each
function it appears in.)
make: *** [ext/oci8/oci8_lob.lo] Error 1

해결법)
일단 php 5.2.x 버전의 압축을 풀고 그 디렉토리로 이동한다. 아래 파일을 수정해 준다.

# vi ext/oci8/oci8_lob.c
그리고 아래와 같이 되어 있는 줄을 찾는다.

▶수정 전(약 303번째줄)

=======================================
        if (is_clob) {
                PHP_OCI_CALL_RETURN(connection->errcode, OCINlsNumericInfoGet, (connection->env, connection->err, &bytes_per_char, OCI_NLS_CHARSET_MAXBYTESZ));
 
                if (connection->errcode != OCI_SUCCESS) {
                        php_oci_error(connection->err,connection->errcode TSRMLS_CC);
                        PHP_OCI_HANDLE_ERROR(connection,connection->errcode);
                        return 1;
                }
        } else {
                /* BLOBs don't have encoding, so bytes_per_char == 1
*/
        }
 =======================================

▶수정 후(색칠 된것을 추가)

=======================================
        if (is_clob) {
#ifdef OCI_NLS_CHARSET_MAXBYTESZ
                PHP_OCI_CALL_RETURN(connection->errcode, OCINlsNumericInfoGet, (connection->env, connection->err, &bytes_per_char, OCI_NLS_CHARSET_MAXBYTESZ));
 
                if (connection->errcode != OCI_SUCCESS) {
                        php_oci_error(connection->err,connection->errcode TSRMLS_CC);
                        PHP_OCI_HANDLE_ERROR(connection,connection->errcode);
                        return 1;
                }
#else
                bytes_per_char = 4;
#endif
        } else {
                /* BLOBs don't have encoding, so bytes_per_char == 1
*/
        }
 =======================================

이후 configure , make, make install 을 하면 된다.
64bit OS에는 이상하게도 PHP5에 oracle client가 oci8로 도무지 붙지를 않았다.

버전의 문제인가 싶어 다른 버전으로 시도해봤지만 역시나 붙지 않는다.
자꾸 libclntsh.so파일을 찾을 수 없다고 나온다. 분명 파일도 정상적으로 링크가 되어있고
LD_LIBRARY_PATH역시 정상적으로 잡아주었는데..

결국 64bit OS의 특성인 듯하여 oracle instant Client로 대처하기로 했다.

[DOWN]
http://www.oracle.com/technology/tech/oci/instantclient/index.html

위의 URL로가서 oracle instant client를 받는다. 최신 버전은 11g이다.
난 당연히 64bit OS이기 때문에 64bit 버전을 받는다. linux의 경우에는 2개의 파일을 받자.
개인적으로 rpm 패키지 보다는 소스를 좋아하기에 소스 버전으로 받았다.

basic.zip (44,800,163 bytes) (cksum - 2302121184)
sdk.zip (607,175 bytes) (cksum - 3112907190)

두 개의 파일을 받아 압축을 풀면 /instantclient_11_1 안에 두개의 파일이 들어간다.
instantclient_11_1안에는 basic.zip의 파일내용이 nstantclient_11_1/sdk에는 sdk.zip 파일이 풀린다. 그리고 링크를 하나 걸어주어야 한다.

# ln -s libclntsh.so.11.1 libclntsh.so

oracle instant client설치는 이것으로 끝이다.
참고로 말하자면 저 디렉토리 이름을 바꾸고 LD_LIBRARY_PATH를 다 잡아주고 했는데도 PHP 컴파일시 버전을 찾지 못하는 요상한 현상이 벌어진다.(이것으로 한 3시간은 잡아 먹은듯..) 왜인지는 조금 더 두고 봐야할듯하다.

이제 php5에 올려보자.
php configure 옵션에 --with-oci8=instantclient,/data/instantclient_11_1 --enable-sigchild
를 추가한다. 주의 할 것은 php 버전에따라 instant client 설치법이 조금씩 다르다.
확인을 하려면 ./configure --help | grep oci 로 확인을 해봐야할 것이다.
PHP5 버전에서는 위와 같은 방법으로 하면 된다. /data/instantclient_11_1는 위에서 압축을 푼 디렉토리를 적어주어야 함을 명심하자.

이제 컴파일하면 별 문제없이 make, make install이 될것이다.

아 물론, network/admin/ 이란 디렉토리를 만들어서 tnsnames.ora 파일을 생성해줘야 하는 것도 잊지말자.

우주곰:지구곰이 아닙니다.
지구곰이 아닙니다.
Categories (190)
Information (5)
About uzoogom (5)
My Advanced Linux (73)
Learning Linux (96)
OperatingSystem (5)
Databases (4)
Tips! (1)
OpenSource (1)
«   2018/12   »
            1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31          
  1. 2012/12 (2)
  2. 2012/04 (3)
  3. 2012/03 (6)
  4. 2012/02 (6)
  5. 2012/01 (2)