커피닉스, 시스템 엔지니어의 쉼터
  php에서 JAVA class 사용위한 연동 (FreeBSD) 작성일 : 2005/10/30 01:53
 
  • 글쓴이 : 좋은진호 ( http://coffeenix.net/ )
  • 조회수 : 14391
     
    제  목 : php에서 JAVA class 사용위한 php/java 연동 (FreeBSD)
    글쓴이 : 좋은진호(truefeel, http://coffeenix.net/ )
    작성일 : 2005.7.12(화)~14(목)
    정리일 : 2005.10.28(금)

    php에 JAVA class를 호출하여 사용하기 위한 php 설정에 대해 알아본다.
    JDK나 APM 설치 과정은 미리 알거라 생각하고 연동과 관련된 부분 위주로 설명할 것이다.

    1. JDK 설치

       FreeBSD용으로 패치된 JDK 또는 linux-sun-jdk14 를 설치한다.
       make할 때 출력되는 URL에서 JDK는 직접 받아 /usr/ports/distfiles 에 복사해둬야 하는 것은 알겠죠?

     
    # cd /usr/ports/java/jdk14 (FreeBSD용으로 패치된 JDK) 또는 /usr/ports/java/linux-sun-jdk14
    # make install
    # cd /usr/local
    # ln -s jdk1.4.2 java 또는 ln -s linux-sun-jdk1.4.2 java
     


       이제 환경변수 설정을 한다.

       setenv JAVAHOME /usr/local/java
       setenv LD_LIBRARY_PATH /usr/local/lib:/usr/lib:/usr/local/lib/php: <-- 다음줄까지 한줄로
       /usr/local/lib/php/20020429:$JAVA_HOME/jre/lib/i386:$JAVA_HOME/jre/lib/i386/server

    2. apache 재설치

       apache가 설치되어 있다면 pthread 사용하여 재컴파일한다.
       pthread를 사용하지 않고 컴파일을 하면 php에서 java class 사용시 에러가 발생할 것이다.

       /usr/ports/www/apache13/Makefile 파일에서 130여번째줄 정도에서 다음을 수정한다.

     
    CONFIGURE_ENV+= \
                    INCLUDES=-I${LOCALBASE}/include \
                    LDFLAGS=-L${LOCALBASE}/lib

    대신

    CONFIGURE_ENV+= \
                    INCLUDES=-I${LOCALBASE}/include \
                    LDFLAGS="-L${LOCALBASE}/lib -pthread -lc_r"
     


       또한 대형 사이트일 경우 httpd.conf에서 MaxClients를 512 이상으로 설정할 수 있도록
       HARD_SERVER_LIMIT 값을 1024나 2048로 늘린다.

     
    CFLAGS+=-DHARD_SERVER_LIMIT=2048
     


       이제 컴파일하자.

     
    # cd /usr/ports/www/apache13
    # make
    # make install clean
     


    3. php 설치

       /usr/port/lang/php4/Makefile 의 CONFIGURE_ARGS= 중간에 --with-java= 옵션을 삽입한다.

      
     
       --with-java=/usr/local/java \
      
     


       나머지는 apache에 php 연동하기 위한 형태로 설치를 하면 되며, 설치 후에는 다음 작업이
       반드시 필요하다.

     
    # cd /usr/local/lib/php/20020429
    # ln -s java.so libphp_java.so
    # ls -l *java*
    -rwxr-xr-x  1 root  wheel  13225  7 14 13:52 java.so
    lrwxr-xr-x  1 root  wheel      7  7 11 17:34 libphp_java.so -> java.so
     


       그리고, /usr/local/etc/php/extentions.ini 에 extension=java.so 추가.
       /usr/local/etc/php.ini에는 [java] section 설정이 필요하다.
       java.class.path= 에는 필요한 class 디렉토리나 jar 파일 full경로를 지정하면 된다.

     
    [java]
    java.class.path =/usr/local/lib/php/php_java.jar:/home/truefeel/java/lib/mysql-connector-java-...-bin.jar
    java.home = /usr/local/java
    java.library = /usr/local/java/jre/lib/i386/server/libjvm.so
    java.library.path =/usr/local/lib/php/20020429
     


    4. 테스트

    * javaver.html
     
    <?
    // get instance of Java class java.lang.System in PHP
    $system = new Java('java.lang.System');

    // demonstrate property access
    echo 'Java version=' . $system->getProperty('java.version') . '<br>';
    echo 'Java vendor=' . $system->getProperty('java.vendor') . '<br>';
    echo 'OS=' . $system->getProperty('os.name') . ' ' .
                 $system->getProperty('os.version') . ' on ' .
                 $system->getProperty('os.arch') . ' <br>';

    // java.util.Date example
    $formatter = new Java('java.text.SimpleDateFormat',
                         "EEEE, MMMM dd, yyyy 'at' h:mm:ss a zzzz");

    echo $formatter->format(new Java('java.util.Date'));
    ?>
     


    웹브라우저에 다음과 같이 결과를 얻었다면 성공적으로 설치되었다.

     
    Java version=1.4.2-p7
    Java vendor=Sun Microsystems Inc.
    OS=FreeBSD x.xx-RELEASE-px on i386
    토요일, 10월 29, 2005 at 1:02:35 오전 GMT+09:00
     


    5. 문제 해결

       1) Fatal error: Unable to locate CreateJavaVM function in
          /home/truefeel/public_html/javaver.html on line 3 에러 발생


       -> php.ini 의 [java] 부분에 java.library를 다음과 같이 한다.
         (/usr/local/java 는 JDK의 홈 경로임)

      
     
       java.library = /usr/local/java/jre/lib/i386/server/libjvm.so
      
     


       2) Fatal error: Cannot instantiate non-existent class: java in
          /home/truefeel/public_html/javaver.html on line 3


       -> extensions.ini 에
          extension=java.so 추가

       3) php ~truefeel/public_html/javaver.html 실행시
          /usr/libexec/ld-elf.so.1: /usr/local/java/jre/lib/i386/server/libjvm.so:
          Undefined symbol "pthread_main_np"
          또는 apache의 error.log에 위의 메시지가 남을 때


       -> apache를 pthread 사용해서 재컴파일한다.

       4) php 실행시
          PHP Warning:  Function registration failed - duplicate name -
          java_last_exception_get in Unknown on line 0
          PHP Warning:  Function registration failed - duplicate name -
          java_last_exception_clear in Unknown on line 0
          PHP Warning:  java:  Unable to register functions, unable to load in Unknown on line 0


       -> extensions.ini 에 extension=java.so 이 2줄 이상일 때 발생

       5)  php 실행시 아무 에러메시지도 없고 apache error log에도 아무것도 없으나 결과가 안나올 때

       -> 환경변수 LD_LIBRARY_PATH 를 셋팅했는지 확인해봐라.

    6. 참고 자료

       * PHP / Java Integration (연동테스트용 예제와 설치 방법 등에 대한 설명)
         http://www.php.net/java
       * java & php4 + apache 1.3.x
         http://lists.freebsd.org/pipermail/freebsd-questions/2003-December/029894.html
       * FreeBSD+PHP+Java(jdk1.4.2)
         http://blog.devep.net/adex/2005/03/11/1110477642312.html
       * Re: FreeBSD + ext/java
         http://aspn.activestate.com/ASPN/Mail/Message/php-install/1050662

     
       | However, when accessing a php script containing a java call, I get:
       | ---
       | Fatal error: Unable to locate CreateJavaVM function in java.php on line 6


       I had a similar with (php+java+freebsd), but I gave up on a similar problem.
       Later I found out that the problem could possibly be solved by forcing
       Apache to be built with libc_r (multithreading library) by manually
       adding -pthread switch to Apache Makefile.

       Please, tell me if it works for you.
     



    커피닉스, 시스템 엔지니어의 쉼터 / URL : http://coffeenix.net/board_view.php?bd_code=1231