본문 바로가기

PHP관련

FREETDS를 이용해 LINUX-PHP에서 원격의 MS-SQL 연결하기

[원문] http://bug007.mireene.com/zbxe/freeboard/331/page/4

FREETDS를 이용해 LINUX-PHP에서 원격의 MS-SQL 연결하기

LINUX OS 에 PHP 를 사용하면서 원격의 MS-SQL에 연결하는 방법에 대한 내용입니다.

웹상에 관련 자료가 있긴 했지만, 저의 작업 환경과 틀려서인지, 세부 내용이 잘못 기재되어 있는것들이 많아, 어렵게 작업을 성공한 이후 나름대로 관련 내용을 정리했습니다.


해당 작업을 하는 분들에게 조금이나마 도움이 되었으면 합니다.


현존하는 LINUX + PHP 와 MS-SQL 연결 방법


1. freetds 을 이용한 방법

2. Sybase Client Library 을 이용한 방법

3. odbc 를 이용한 방법


저는 관련 내용이 많이 배포되어 있는 FREETDS 를 이용한 방법을 사용했습니다.


- 작업 환경 -

Linux REDHAT 9.0

PHP 4.3.5


WINDOWS 2000 Server

MS-SQL 2000


FREETDS를 쓰면 좋은점

1. 속도가 빠르다.

2. 윈도우쪽은 전혀 건들지 않아도 된다. (리퀘스트브로커 같은거 안깔아두 된다)

3. php 에서 top 이라든가 distinct 등의 구문이 먹지 않는데 freetds 는 아무 문제가 없다.

4. 예전엔 한글 지원이 되지 않았던 문제점이 있었으나, 그 문제 또한 해결되었다.


설치 방법


1. www.freetds.org 에서 최신 버전을 다운받는다. (현재 0.63까지 나와 있음)

freetds-0.63.tar


2. /usr/local/ 하단에 압축을 풀고 설치한다.

(전 /usr/local/freetds-0.63 의 디렉토리명을 /usr/local/freetds 로 변경했는데, 보기 쉽게 할려는 것이지 설치에 반드시 필요한 사항은 아닙니다.)


# cd freetds

#./configure --with-tdsver=7.0 --enable-msdblib --enable-dbmfix --with-gnu-ld --enable-shared --enable-static

# make

# make install


3./usr/local/freetds/freetds.conf 에 연결할 ms-sql 에 대한 환경 설정을 확인한다.

[MyServer2k]

host = ntmachine.domain.com

port = 1433

tds version = 4.2


위 내용을 확인 후 host 정보를 변경합니다.

tds version = 4.2 로 되어 있는것을 꼭 확인하세요.


4. php 새로 컴파일하기

#./configure --with-sybase=/usr/local/freetds --생략..

# make && make install

# cp php.ini /usr/local/lib/php.ini


5. APACHE 재구동

# /usr/local/apache/bin/apachectl stop

# /usr/local/apache/bin/apachectl start


이전까지 php 컴파일시 /usr/local/apache/bin/apachec시 restart 로 작업을 해왔었는데,

이 sybase 작업시에 그렇게 하니까, 아파치 데몬이 작동안되거나, php 인식이 되지 않는등의 문제점이 많이 발생되더군요..

그런 경우엔 반드시 아파치 재구동을 할때 먼저 stop 하고 start 하십시오.

본인은 이것 때문에 좀 혼란스럽기도 했습니다.

아파치 재구동시킨 후 phpinfo() 확인해보면


sybase

Sybase Support

enabled

Allow Persistent Links

Yes

Persistent Links

0/unlimited

Total Links

0/unlimited

Application Name

PHP 4.0

Client API Version

$Id: dblib.c,v 1.187.2.4 2005/01/07 16:34:39 jklowden Exp $


와 같은 내용이 나타나면 성공한 것입니다.


6. 최종 테스트

-- PHP 소스 페이지 --


<?php

putenv("FREETDSCONF=/usr/local/freetds/freetds.conf");

putenv("TDSVER=42"); // tds 버전을 여기다 적어두 된다


$hostname = "MyServer2k"; // freetds.conf 에서 적어준걸로..

$username = "id";

$password = "xxxx";

$dbname = "dbname";

$connection = mssql_connect($hostname,$username,$password);

mssql_select_db($dbname);


echo("<table border=1>");

$query = "select * from test" ;

$query_result = mssql_query($query) ;

$number_rows = mssql_num_rows($query_result) ;

$number_fields = mssql_num_fields($query_result) ;


for ($row_number=0; $row_number<=$number_rows-1; $row_number++)

{

print "<tr>";

for ($field_number=0; $field_number<=$number_fields-1; $field_number++)

{

print "<td>" . mssql_result($query_result, $row_number, $field_number) . "</td>" ;

}

print "</tr>";

}

print "</table>";

mssql_close($connection);

?>


* putenv("FREETDSCONF=/usr/local/freetds/freetds.conf");

관련 자료를 찾아보면 putenv("mssql=/usr/local/freetds"); 로 기재하는 내용이 대부분이던데, 그렇게 해서 실행되지 않아 삽질을 하다 결국엔 php.net 에 있는 내용을 찾아보다 위와 같이 ms_sql 관련 명령어를 사용하기 위해 freetds.conf 파일을 putenv 해야 하는것을 알게 되었다. 웹상의 자료에 다른 내용들은 다양하게 기재되어 있었는데, 이 사항이 없는것을 보니, 버전의 차이인지 이해가 가질 않으나, 설치시 기본 매뉴얼을 참조하는것이 가장 급선무인것을 이번 기회에 다시 한번 느끼게 되었다.. freetds.org 에도 관련 매뉴얼이 없는것 같고, 하여튼 이 내용을 몰라 많이 고생했다.


이렇게 하면 LINUX + PHP에서 원격의 MS-SQL 연결이 되는것을 확인할수 있을것입니다.


참고 사이트

http://www.php.net/manual/en/ref.mssql.php ; 리눅스에서 ms_sql 관련 함수 사용에 관한 내용

http://database.sarang.net/database/mssql/php/#g ; mssql 관련 기본적인 내용

전제조건 : php, apach 컴파일을 할수 있을 것 sybase 연동 부분에 대한 것만 정리함

환경 :

OS : CentOS 4.1 (Final)

Apache : 1.3.33

php : 5.0.3

mysql : 4.0.17

1. www.freetds.org 에서 다운받는다. 현재 버전은 0.63 까지 나와 있당


2. 압축풀고 설치

#cd freetds
#./configure --prefix=/usr/local/freetds --with-tdsver=5.0 --enable-msdblib --enable-dbmfix --with-gnu-ld --enable-shared --enable-static
#make
#make install

참고 tdsver 은 아래를 참조한다. Sybase 의 경우에는 5.0 이다

VendorVersionTDS Version
Sybase4.92+5.0
Microsoft6.0, 6.54.2
Microsoft7.0/20007.0

3. 접속하려는 서버정보를 설정한다.

/usr/local/freetds/etc/freetds.conf 에 다음을 추가한다 (0.63 버전)

[test]
host = 192.168.1.100
port =7777
tds version = 5.0

4. PHP 소스 수정 5.0.3 기준

vi 설치디렉토리/php-5.0.3/ext/sybase/php_sybase_db.c

php_sybase_fetch_hash(INTERNAL_FUNCTION_PARAM_PASSTHRU);
if (Z_TYPE_P(return_value)==IS_ARRAY) {
- Z_TYPE_P(return_value)=IS_OBJECT;
- Z_OBJPROP_P(return_value) = Z_ARRVAL_P(return_value);
- Z_OBJCE_P(return_value) = ZEND_STANDARD_CLASS_DEF_PTR;
+ object_and_properties_init(return_value,
ZEND_STANDARD_CLASS_DEF_PTR, Z_ARRVAL_P(return_value));
}

참초 : - 된 부분은 모두 삭제하고 +된 부분만 첨가한다.

5. PHP configure 설정

#./configure --with-sybase=/usr/local/freetds --생략..
#make

#make install

6. 아파치 configure, make, make install 은 생략

실패사례 : Sybase ASE 15 를 설치하였으나 제대로 작동되지 않았음..

Sybase 설치후 php, apache 를 모두 재컴파일에 성공했으나 sybase_connect 가 작동되지 않음.

대안으로 Freetds 를 설치함..

테스트 php

sybase_test.php

<?

$syb_conn=sybase_connect("192.168.1.100:7777", "guest", "guest");
$syb_sel=sybase_select_db("HOMEDB",$syb_conn);
$result=sybase_query("select id from member" ,$syb_conn);

$total=sybase_num_rows($result);

print "Total Rows : $total\n";

while($array=sybase_fetch_array($result)){
print_r($array);
}

?>

FreeTDS의 Compile 및 Install

FreeTDS는 RPM파일이 아직은 없습니다. 따라서 본인이 직접 컴파일과 설치작업을 하실수 있는 좋은 기회를 가질 수 있습니다. Compile시에 여러 Option을 설정하실수 있으나 기본적으로 간단히 설치하는 방법을 알려 드리고 상세한 내용은 같이 따라오는 Install문서를 참조 하시기 바랍니다.

또한, 저의 System이 알짜Linux 6.0에 Kernel 2.2.5 입니다.

  1. 압축해제.

    tar -xvfz freetds-0.50.tgz 압축을 해제하시면 freetds라는 디렉토리와 함께 하부 디렉토리도 만들어집니다. 설치 파일들은 freetds 디렉토리에 있습니다.

              freetds--+-- include  ---> db-lib,ct-lib,tds등 각종 header file                   |                   +-- doc      ---> tds-layer등에관한 .txt문서                   |                   +-- samples  ---> db-lib,ct-lib,tds를 이용한 sample code                   |                   +-- src      ---> source file          

  2. freetds디렉토리에서 './configure'를 하시면 해당 System에 대한 configure package를 작성합니다.

    혹, 오래된 System V에서 'csh'을 사용하실경우에는 'sh ./configure'로 실행 하시기 바랍니다. 이후에는 엄청많은 양의 messages를 쏟아 낼것 인데 차후에 참고하시기 바랍니다.

    참고) 기본 설치위치 : '/usr/local/freetds' TDS version : 5.0

  3. `make'를 사용하여 package를 compile한다 (Note- FreeBSD 사용자는 'gmake'를 사용하여야한다.)

  4. option으로 make후 `make check'는 package를 self-test를 한다.

  5. `make install'를 하면 각종 data files과  documentation을 설치한다.

  6. `make clean'는 프로그램 바이너리 code 및 object files 제거한다. 이것은 source code 디렉토리에서 실행을 해야합니다.

  7. 1) 5)번까지 아무런 이상이 없으면 정상적으로 Install이 되었습니다.

    Compile과 Install작업이 모두 이루어졌으면 환경변수의 설정을 해야하는데 이것은 Shell에 따라서 다르게 이루어 집니다.

    LD_LIBRARY_PATH 또는 LIBPATH에 SYBASE환경 변수를 추가후 export해야 합니다. 아래는 FreeTDS에 포함된 예시입니다.

          bash사용자 :      $ SYBASE=/usr/local/freetds      $ LD_LIBRARY_PATH=${LD_LIBRARY_PATH}:$SYBASE/lib      $ export SYBASE LD_LIBRARY_PATH      csh사용자 :      $ setenv SYBASE /usr/local/freetds      $ setenv LD_LIBRARY_PATH ${LD_LIBRARY_PATH}:$SYBASE/lib

    다음으로 작업을 하실내용은 db-lib,ct-lib가 DBMS을 찾아갈 수 있는 정보를 환경변수 SYBASE에 기재된 경로에가셔서 (기본적인 경로는 /usr/local/freetds) 'interfaces'라는 file을 편집하셔야 합니다. 아래는 따라오는 예제 입니다.

          bash사용자 :      myserver2  -----> server name(임의 부여해도 관계 없음.)              query tcp ether 127.0.0.1 4001              master tcp ether 127.0.0.1 4001                                  ----+---- --+-                                   |       +----> port번호                                   +---> IP주소

    이 interface 파일이 잘못기재되면 server를 찾지 못하고 error가 발생하니 자세한 IP와 port번호는 담당 시스템관리자에게 문의를 하시기 바랍니다.

    여기까지 다하셨다면 Linux에서 Sybase와 MS-SQL server에 접속할 준비는 다 끝났습니다.