Red Hat 기반 리눅스에 PHP 와 DB2 연동 테스트를 해 본 것이 2007년인데, 몇 일전 새롭게 테스트를 해 봤다가 마무리를 하지는 못했다.

차후 재 테스트를 하여 완료가 되는 경우 다시 정리하도록 한다.

 

1. 설치 환경 정보

   - 리눅스: CentOS 4.x  x86

   - 웹서버: Apache 2.2.6

   - 웹 Language: PHP 5.2.5

 

2. 설치 순서

   (1) DB2 V8.x 32bit Client 설치 및 구성

   (2) Apache 서버 설치 및 구성

   (3) PHP 설치

 

3. 다운로드

   - PHP : http://www.php.net/

   - 아파치: http://httpd.apache.org/

   - DB2 : http://www-01.ibm.com/support/docview.wss?rs=71&uid=swg27007053

 

4. DB2 Client 설치 정보 (설치 작업은 Skip)

   - 엔진 설치 위치: /opt/IBM/db2/V8.1/

   - 인스턴스 홈 : /home/db2inst1

 

5. Apach 서버 설치

    - 압축 풀기:  tar –xzvf httpd-2.2.6.tar.gz –C /usr/local/src

    -  설정

#> cd /usr/local/src/httpd-2.2.6
#> ./configure --prefix=/usr/local/apache2 \
    --enable-mods-shared=all \
    --enable-rewrite \
    --enable-so

............

config.status: creating build/pkg/pkginfo

config.status: creating build/config_vars.sh

config.status: creating include/ap_config_auto.h

config.status: executing default commands

 

    - 컴파일 및 설치

#> make && make install

…..

mkdir /usr/local/apache/man/man1

mkdir /usr/local/apache/man/man8

mkdir /usr/local/apache/manual

make[1]: Leaving directory `/usr/local/httpd-2.2.6

 

     - 검증

#> cd /usr/local/apache2/bin
#> ./apachectl start
#> ps -ef | grep httpd

root 12184 1 0 11:18 ? 00:00:00 /usr/local/apache2/bin/httpd -k start

daemon 12185 12184 0 11:18 ? 00:00:00 /usr/local/apache2/bin/httpd -k start

daemon 12186 12184 0 11:18 ? 00:00:00 /usr/local/apache2/bin/httpd -k start

daemon 12187 12184 0 11:18 ? 00:00:00 /usr/local/apache2/bin/httpd –k

 

    - 브라우저(firefox) 접속 확인 (http://localhost/)

      “It works” 문구가 담긴 웹 페이지 확인

 

    - 설정 (httpd.conf)

      위치: /usr/local/apache2/conf/httpd.conf

# Dynamic Share Object (DSO) Support

LoadModule php4_module modules/libphp4.so

 

#ServerName www.example.com:80

ServerName localhost:80

 

AddType application/x-httpd-php .php .php3 .php4 .php5 .html .htm

 

      위치: /usr/ld.so.conf

/usr/local/apache2/lib , /usr/local/apache2/modules 경로 추가

      확인: ldconfig 실행

 

 

6. PHP 설치 및 설정

   - 압축 풀기: tar –xzvf php-5.2.5.tar.gz –C /usr/local/src

   - DB2 환경변수 적용 (인스턴스_홈/sqllib/db2profile)

#> . /home/db2inst1/sqllib/db2profile

 

   - 설정

#> cd /usr/local/src/php5.2.5
#> ./configure --enable-cli \
     --disable-cgi \
     --with-apxs2=/usr/local/apache2/bin/apxs \
     --with-ibm-db2=/home/db2inst1/sqllib \
     --with-pdo-odbc=ibm-db2,/opt/ibm/db2/v8.1/ \
     --with-config-file-path=/usr/local/apache2/conf \
     --with-exec-dir=/usr/local/apache2/bin \
     --with-zlib --enable-sockets



+--------------------------------------------------------------------+

| License: |

| This software is subject to the PHP License, available in this |

| distribution in the file LICENSE. By continuing this installation |

| process, you are bound by the terms of this license agreement. |

| If you do not agree with the terms of this license, you must abort |

| the installation process at this point. |

+--------------------------------------------------------------------+

Thank you for using PHP.

 

     - 컴파일 및 설치

#> make && make install

pear/PEAR can optionally use package "pear/XML_RPC" (version >= 1.4.0)

[PEAR] PEAR - installed: 1.6.1

Wrote PEAR system config file at: /usr/local/etc/pear.conf

You may want to add: /usr/local/lib/php to your php.ini include_path

Installing PDO headers: /usr/local/include/php/ext/pdo/

     pecl 설치 프롬프트에 대해 ALL 선택 후, DB2의 인스턴스 경로 입력

 

     - php.ini 설정

#> cp php.ini-recommended /usr/local/apache2/conf/php.ini
#> vi /usr/local/apache2/conf/php.ini

include_path/usr/local/lib/php , /usr/local/include/php/ext/pdo/ 추가

pdo_odbc.db2_instance_name=db2inst1  추가

 

     - 검증

       (1) libphp5.so 라이브러리 존재 확인 ( ls –al /usr/local/apache2/modules )

       (2) php 파일 작성

#> cd /usr/local/apache2/htdocs
#> vi phpinfo.php3

<? phpinfo(); ?>

 

      (3) 아파치 서버 재기동

#> cd /usr/local/apache2/bin/apachectl stop
#> cd /usr/local/apache2/bin/apachectl start

 

      (4) 브라우저(firefox) 확인

           http://localhost/phpinfo.php3

 

 

7. DB2 연동

   (1) DB2 서버 카탈로그 작업

#> su – db2inst1
$> db2 catalog tcpip node db2node1 remote 127.0.0.1 server 50000 remote_instance DB2INST

$> db2 attach to db2node1 user db2inst using db2inst

$> db2 detach
$> db2 catalog db sample at node db2node1
$> db2 connect to sample user db2inst using db2inst

 

    * DB2 서버 접속 계정: db2inst

    * DB2 서버 DB 이름: sample

    * 통신 포트 번호: 50000

 

   (2) ODBC 함수를 통한 연동

    - 파일명: /usr/local/apache2/htdocs/odbc.php3

    - 코드

<?

$dsn="sample";

$user="db2inst";

$passwd="db2inst";

$sql="select * from employee";

if ($conn_id=odbc_connect("$dsn","$user","$passwd")){

echo "$dsn 연결 성공";

if($result=odbc_do($conn_id, $sql)) {

echo "'$sql'문 실행";

echo "result:: ";

odbc_result_all($result);

echo "freeing result";

odbc_free_result($result);

} else {

echo "'$sql' 실행에러";

}

echo "$conn_id : 연결닫음";

odbc_close($conn_id);

}else {

echo "$dsn연결실패";

}

?>

 

       - 확인 (http://localhost/odbc.php3)

 

  (3) PDO를 통한 연동

     - 파일명: /usr/local/apache2/htdocs/pdo.php3

     - 코드

<?php

$dbh = new PDO('odbc:SAMPLE','db2inst','db2inst');

echo "Connected\n";

$stmt= $dbh->prepare("call sp_test1(?)");

$stmt->bindParam(1, $return_value, PDO::PARAM_STR, 4000);

$stmt->execute();

print ":: sp_test1 returned ret_val: $return_value\n";

?>

 

Stored Procedure 코드

db2 +p -td"!" << EOF

Connect to sample user db2inst1 using db2inst1 !

drop procedure sp_test2 !

create procedure sp_test2(OUT out_par varchar(100))

language SQL

begin

declare v_cnt integer;

select count(midinit) into v_cnt from employee where midinit='' ;

set out_par = char(v_cnt);

end !

drop procedure sp_test1 !

create procedure sp_test1(OUT out_par varchar(100))

language SQL

begin

call sp_test2(out_par);

end !

terminate !

EOF

 

     - 확인 (http://localhost/pdo.php3)

'Laboratory' 카테고리의 다른 글

FBI (Function Based Index) 테스트  (0) 2012.12.23

[요약]

Oracle에서 지원하는 Function Based Index (이하 FBI) DB2에서 구현하여 테스트

 

[내용]

DB2 V9.7 FBI를 공식적으로 지원하지 않기 때문에, 이와 비슷한 기능을 하도록 구성하여 성능 테스트를 수행

 

  1. 테이블 생성

 

DROP TABLE DB2INST1.ZIP

 

CREATE TABLE DB2INST1.ZIP (

ZIPCODE CHAR(7)     NOT NULL,

SIDO    CHAR(6)     NOT NULL,

GUGUN   VARCHAR(24) NOT NULL,

DONG    VARCHAR(81) NOT NULL,

BUNJI   VARCHAR(48),

SEQ     INTEGER     NOT NULL,

CONSTRAINT PK_ZIP PRIMARY KEY(SEQ)

)

 

CREATE INDEX DB2INST1.IX_ZIP ON DB2INST1.ZIP (ZIPCODE)

 

  1. 데이터 이행

 

IMPORT FROM ./zipcode_1_20100225.csv OF DEL COMMITCOUNT 1000 REPLACE INTO DB2INST1.ZIP

 

  1. 통계정보 갱신

 

RUNSTATS ON TABLE DB2INST1.ZIP ON ALL COLUMNS WITH DISTRIBUTION AND DETAILED INDEXES ALL

 

  1. Predicate 함수를 사용하지 않은 쿼리 작성 , 수행

 

-- db2batch 입력 파일 (query1.bat)

--#COMMENT FBI Test on DB2 V9.7

--#SET PERF_DETAIL 0

 

--#BGBLK 1

  --#COMMENT Predicate 함수를 사용하지 않은 일반적인 경우

  --#SET ROWS_OUT -1

 

  SELECT *

    FROM DB2INST1.ZIP

   WHERE ZIPCODE LIKE '142-%';

 

--#EOBLK

 

db2batch -d SAMPLE -f query1.bat -i complete -o e YES p 1 r -1

 

* 292 페치(fetch), 292 출력됨.

 

* 경과 시간:       0.039400

 

* 블록 번호 1

* 요약 테이블:

 

유형             반복      총시간() 최소 시간() 최대 시간() 산술 평균  기하 평균  페치(fetch) 출된

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

블록              1           1       0.039400           0.039400           0.039400       0.039400       0.039400                  292           292

 

* 항목:                  1

* 총시간:                  0.039400

* 최소 시간:               0.039400

* 최대 시간:               0.039400

* 산술 평균 시간:          0.039400

* 기하 평균 시간:          0.039400

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

 

  1. 실행계획 확인

 

db2exfmt -d SAMPLE -1

 

Access Plan:

-----------

Total Cost:                 15.135

Query Degree:                1

 

               Rows

              RETURN

              (   1)

               Cost

                I/O

                |

              2.64573

              FETCH

              (   2)

              15.135

                 2

           /----+-----\

       2.64573         50838

       IXSCAN   TABLE:    DB2INST1

       (   3)           ZIP

       7.57267          Q1

          1

         |

        50838

 INDEX:    DB2INST1

       IX_ZIP

         Q1

 

  1. Predicate 함수를 사용한 쿼리 작성 , 수행

 

-- db2batch 입력 파일 (query2.bat)

--#COMMENT FBI Test on DB2 V9.7

--#SET PERF_DETAIL 0

 

--#BGBLK 1

  --#COMMENT Predicate 함수를 테스트 목적으로 사용한 경우

  --#SET ROWS_OUT -1

 

  SELECT *

    FROM DB2INST1.ZIP

   WHERE TRIM(ZIPCODE) LIKE '142-%';

 

--#EOBLK

 

db2batch -d SAMPLE -f query2.bat -i complete -o e YES p 1 r -1

 

* 292 페치(fetch), 292 출력됨.

 

* 블록 번호 1

* 요약 테이블:

 

유형             반복      총시간() 최소 시간() 최대 시간() 산술 평균  기하 평균  페치(fetch) 출된

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

블록              1           1       0.051749           0.051749           0.051749       0.051749       0.051749                  292           292

 

* 항목:                  1

* 총시간:                  0.051749

* 최소 시간:               0.051749

* 최대 시간:               0.051749

* 산술 평균 시간:          0.051749

* 기하 평균 시간:          0.051749

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

 

  1. 실행계획 확인

 

db2exfmt -d SAMPLE -1

 

Access Plan:

-----------

Total Cost:                 473.96

Query Degree:                1

 

        Rows

       RETURN

       (   1)

        Cost

         I/O

         |

       5083.8

       TBSCAN

       (   2)

       473.96

         454

         |

        50838

 TABLE:    DB2INST1

         ZIP

         Q1

 

  1. Generate Always 옵션으로 함수가 적용된 컬럼을 테이블에 추가 , 인덱스 생성

 

SET INTEGRITY FOR DB2INST1.ZIP OFF

ALTER TABLE DB2INST1.ZIP ADD COLUMN TRIM_ZIPCODE GENERATED ALWAYS AS (TRIM(ZIPCODE))

SET INTEGRITY FOR DB2INST1.ZIP IMMEDIATE CHECKED FORCE GENERATED

 

CREATE INDEX DB2INST1.IX_TRIM_ZIPCODE ON DB2INST1.ZIP (TRIM_ZIPCODE)

 

  1. 통계정보 갱신

 

RUNSTATS ON TABLE DB2INST1.ZIP ON ALL COLUMNS WITH DISTRIBUTION AND DETAILED INDEXES ALL

 

  1. Predicate 함수를 적용한 쿼리를 다시 수행

 

db2batch -d SAMPLE -f query2.bat -i complete -o e YES p 1 r -1

 

* 292 페치(fetch), 292 출력됨.

 

* 블록 번호 1

* 요약 테이블:

 

유형             반복      총시간() 최소 시간() 최대 시간() 산술 평균  기하 평균  페치(fetch) 출된

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

블록              1           1       0.014503           0.014503           0.014503       0.014503       0.014503                  292           292

 

* 항목:                  1

* 총시간:                  0.014503

* 최소 시간:               0.014503

* 최대 시간:               0.014503

* 산술 평균 시간:          0.014503

* 기하 평균 시간:          0.014503

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

 

  1. 실행계획 확인

 

db2exfmt -d SAMPLE -1

 

Access Plan:

-----------

Total Cost:                 224.481

Query Degree:                1

 

               Rows

              RETURN

              (   1)

               Cost

                I/O

                |

              154.13

              FETCH

              (   2)

              224.481

              29.6758

           /----+-----\

       154.13          50838

       IXSCAN   TABLE:    DB2INST1

       (   3)           ZIP

       7.61844          Q1

          1

         |

        50838

 INDEX:    DB2INST1

   IX_TRIM_ZIPCODE

         Q1

 

  1. 테스트를 위해 추가했었던 컬럼 삭제

 

ALTER TABLE DB2INST1.ZIP DROP COLUMN TRIM_ZIPCODE CASCADE

'Laboratory' 카테고리의 다른 글

[웹서버 구축] Apache + PHP + DB2 연동  (0) 2013.07.15

+ Recent posts