PHP 인터페이스

본 장에서는 PHP에서 Tmax Client의 기능을 사용할 수 있는 확장 모듈의 사용 방법과 예제를 설명한다.

1. 사용 방법

PHP에서는 C 라이브러리를 호출할 수 있는 확장 모듈을 작성하는 방법을 제공한다.

Tmax는 PHP 개발자가 Tmax Client의 기능을 사용할 수 있도록 client 라이브러리의 함수를 호출할 수 있는 확장 모듈을 작성하고 사용하는 방법을 제공한다.

1.1. 개발 환경

확장 모듈을 빌드할 수 있는 환경을 설명한다.

  1. 4.0.0 이상의 php-devel 이 설치되어 있어야 한다.

  2. 시스템 환경변수 PHP_TMAX_LIB_BITS 를 32비트인 경우 '32’로, 64비트인 경우 '64’로 설정한다.

1.2. 확장 모듈 작성 절차

확장 모듈은 다음과 같이 작성한다.

  1. Tmax 디렉터리 아래 usrinc/webscript/php_tmax 디렉터리를 php 확장 디렉터리 내에 복사한다. 이 디렉터리는 통상적으로 php 소스 위치 아래의 ext 디렉터리이다.

    예: /php-5.5.8/ext

  2. ext 디렉터리 아래의 php_tmax 디렉터리로 이동한 후 phpize 를 실행한다. configure 파일이 생성된다.

  3. ./configure 를 실행한다. Makefile 이 생성된다.

  4. make 를 실행한다. 하위에 있는 modules 디렉터리 아래에 php_tmax.so 파일이 생성된다.

  5. php_tmax.so 파일을 php 확장 모듈이 위치하는 디렉터리로 복사한다. 이 디렉터리는 통상적으로 /usr/lib/php/modules로 설정되며, 환경설정 파일인 /etc/php.ini 에서 extension_dir= 값을 설정하여 지정할 수 있다.

1.3. 확장 모듈 사용 방법

작성된 확장 모듈은 다음과 같이 사용한다.

  1. Tmax 디렉터리 아래 usrinc/webscript/ 아래에 있는 tmax.php 파일을 사용자가 실행할 php 파일과 같은 디렉터리에 위치시킨다.

  2. php 파일에 다음 문을 포함시킨다.

    include "tmax.php";
    dl("php_tmax.so");

    dl 문의 결과는 TRUE여야 한다. FALSE이면 php_tmax.so의 로딩이 실패한 것이다.

사용 가능한 함수

PHP 확장 모듈을 통해 사용할 수 잇는 함수는 다음과 같다.

PHP 함수 대응하는 Tmax Client 함수

int php_tmaxreadenv(string file, string label)

int tmaxreadenv (char *file, char *label)

string php_tpgetenv(string name)

char *tpgetenv(char *name)

int php_tpputenv(string env_string)

int tpputenv(char *string)

int php_gettperrno()

int gettperrno(void)

int php_gettpurcode()

long gettpurcode(void)

string php_tpstrerror(int tperrno)

char *tpstrerror (int tperrno)

int php_tpstart(Tpstart tpinfo)

int tpstart (TPSTART_T *tpinfo )

int php_tpend()

int tpend (void)

CallResult php_tpcall(string svcname, string idata, int flags)

int tpcall (char *svc, char *idata, long ilen, char **odata, long *olen, long flags)

int php_tpacall(string svcname, string idata, int flags)

int tpacall (char *svc, char *data, long len, long flags)

CallResult php_tpgetrply(int cd, int flags)

int tpgetrply(int *cd, char **data, long *len, long flags)

int php_tpcancel(int cd)

int tpcancel (int cd)

int php_tpset_timeout(int sec)

int tpset_timeout (int sec)

int php_tpget_timeout()

int tpget_timeout(void)

int php_tx_begin()

int tpget_timeout(void)

int php_tx_commit()

int tx_commit(void)

int php_tx_rollback()

int tx_rollback(void)

int php_tx_set_transaction_timeout(int timeout)

int tx_rollback(void)

int php_tx_set_transaction_control(int control)

int tx_set_transaction_control(TRANSACTION_CONTROL control)

int php_tx_set_commit_return(int when_return)

int tx_set_commit_return (COMMIT_RETURN when_return)

TxInfo php_tx_info()

int tx_info (TXINFO *info)

대부분의 함수는 접두어 php_를 뺀 Tmax Client 함수와 사용하는 방법이 동일하나, 다음 유의점이 있다.

  • php_tpcall, php_tpacall은 STRING 형의 데이터만을 처리하므로 ilen 파라미터를 받을 필요가 없다.

  • php_tpstart 의 인자로 들어가는 클래스 Tpstart 형의 데이터는 tmax.php에 정의되어 있으며 각 필드의 의미는 tpinfo와 동일하다.

  • php_tpcall, php_tpgetrply 의 리턴값은 클래스 CallResult 형의 데이터이다. 각 필드의 의미는 다음과 같다.

    구분 설명

    ret

    tpcall, tpgetrply의 리턴값이다.

    rcvbuf

    받은 데이터이다.

    rcvlen

    받은 데이터의 길이이다.

    tperrno

    에러가 발생할 때 설정된 tperrno 값이다.

    tpurcode

    urcode를 설정할 때 설정된 urcode 값이다.

  • php_tx_info() 의 리턴값은 클래스 TxInfo 형의 데이터이다.이 데이터는 when_return, transaction_control, transaction_timeout, transaction_state 필드를 가지고 있으며 각 필드의 의미는 /usrinc/tx.h 의 TXINFO와 동일하다.

1.4. 예제 프로그램

다음은 계정번호를 통한 입출력관리 예제이다.

<php_tmax_test.php>

<html>
<head>
<title>memman test</title>
</head>
<body>
new page <p/>
<?php
    echo '<p>Hello World</p>';
    include "tmax.php";
    $a = new TpstartT;
    $b = new TpstartT;
    $a -> usrname = "tmax";
    $a -> dompwd = "tmax1234";
    $a -> usrpwd = "tmax1234";
    $a -> cltname = "TP1";
    $a -> flags = TPNOFLAGS;

    if (!dl("php_tmax.so")) {
        echo "<p>\n1 failures detected in \"tmaxreadenv\"\n</p>";
        exit;
    }

    else {
        echo '<p>success</p>'.php_tmaxreadenv("tmax.env","DOM1_NA");
    }
    $ret = php_tpstart(NULL);
    if($ret < 0) {
        echo "<p>\n1 failures detected in \"tpstart\"\n</p>";
        exit;
    }
    $errno = php_gettperrno();
    echo "<p>tperrstr : ".php_tpstrerror($errno)."</p>";
    echo "<p>tpset_timeout : ".php_tpset_timeout(60)."</p>";
    echo "<p>tpget_timeout : ".php_tpget_timeout()."</p>";
    echo "<p>tx_begin : ". php_tx_begin() ."</p>";
    echo "<p>tx_set_transaction_timeout : ".php_tx_set_transaction_timeout(50). "</p>";
    echo "<p>tx_set_transaction_control : ".php_tx_set_transaction_control(TX_CHAINED). "</p>";
    echo "<p>tx_set_commit_return : ".php_tx_set_commit_return(TX_COMMIT_COMPLETED). "</p>";
    $retval = php_tpcall("TOUPPER", "bbb", 0);
    if($retval -> rcvbuf < 0) {
        echo "<p>\n1 failures detected in \"tpcall\"\n</p>";
        exit;
    }
    $cd1 = php_tpacall("TOUPPER","aaa",0);
    if($cd1 < 0) {
        echo "<p>\n1 failures detected in \"tpacall_1\"\n</p>";
        exit;
    }
    $cd2 = php_tpacall("TOUPPER","aaa",0);
    if($cd2 < 0) {
        echo "<p>\n1 failures detected in \"tpacall_2\"\n</p>";
        exit;
    }
    $ret = php_tpcancel($cd1);
    if($cd1 < 0) {
        echo "<p>\n1 failures detected in \"tpcancel\"\n</p>";
        exit;
    }
    $retval1 = php_tpgetrply($cd1, 0);
    if($retval1 -> ret < 0) {
        echo "<p>\n1 failures detected in \"tpgetrply_1\"\n</p>";
        exit;
    }
    var_dump($retval1);
    $retval2 = php_tpgetrply($cd2, 0);
    if($retval2 -> ret < 0) {
        echo "<p>\n1 failures detected in \"tpgetrply_2\"\n</p>";
        exit;
    }
    var_dump($retval1);
    echo "<p>tpgetrply : ". $retval2 -> rcvbuf ."</p>";
    $ret = php_tx_commit();
    if($ret < 0) {
        echo "<p>\n1 failures detected in \"tx_commit(".$ret."\")\n</p>";
        exit;
    }
    $retval = php_tpcall("TOERROR", "bbb", 0);
    var_dump($retval);
    $ret = php_gettpurcode();
    if($ret != 2) {
        echo "<p>\n1 failures detected in \"gettpurcode\"\n</p>";
        exit;
    }
    $ret = php_tpend();
    if($ret < 0) {
        echo "<p>\n1 failures detected in \"tpend\"\n</p>";
        exit;
    }
    echo "<p>\n";
    echo "No errors detected in \"php_tmax_test\"";
    echo "\n</p>";
?>
</body>
</html>