PHP 인터페이스
본 장에서는 PHP에서 Tmax Client의 기능을 사용할 수 있는 확장 모듈의 사용 방법과 예제를 설명한다.
1. 사용 방법
PHP에서는 C 라이브러리를 호출할 수 있는 확장 모듈을 작성하는 방법을 제공한다.
Tmax는 PHP 개발자가 Tmax Client의 기능을 사용할 수 있도록 client 라이브러리의 함수를 호출할 수 있는 확장 모듈을 작성하고 사용하는 방법을 제공한다.
1.1. 개발 환경
확장 모듈을 빌드할 수 있는 환경을 설명한다.
-
4.0.0 이상의 php-devel 이 설치되어 있어야 한다.
-
시스템 환경변수 PHP_TMAX_LIB_BITS 를 32비트인 경우 '32’로, 64비트인 경우 '64’로 설정한다.
1.2. 확장 모듈 작성 절차
확장 모듈은 다음과 같이 작성한다.
-
Tmax 디렉터리 아래 usrinc/webscript/php_tmax 디렉터리를 php 확장 디렉터리 내에 복사한다. 이 디렉터리는 통상적으로 php 소스 위치 아래의 ext 디렉터리이다.
예: /php-5.5.8/ext
-
ext 디렉터리 아래의 php_tmax 디렉터리로 이동한 후 phpize 를 실행한다. configure 파일이 생성된다.
-
./configure 를 실행한다. Makefile 이 생성된다.
-
make 를 실행한다. 하위에 있는 modules 디렉터리 아래에 php_tmax.so 파일이 생성된다.
-
php_tmax.so 파일을 php 확장 모듈이 위치하는 디렉터리로 복사한다. 이 디렉터리는 통상적으로 /usr/lib/php/modules로 설정되며, 환경설정 파일인 /etc/php.ini 에서 extension_dir= 값을 설정하여 지정할 수 있다.
1.3. 확장 모듈 사용 방법
작성된 확장 모듈은 다음과 같이 사용한다.
-
Tmax 디렉터리 아래 usrinc/webscript/ 아래에 있는 tmax.php 파일을 사용자가 실행할 php 파일과 같은 디렉터리에 위치시킨다.
-
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>