성태의 닷넷 이야기
홈 주인
모아 놓은 자료
프로그래밍
질문/답변
사용자 관리
사용자
메뉴
아티클
외부 아티클
유용한 코드
온라인 기능
MathJax 입력기
최근 덧글
[정성태] Roll A Lisp In C - Reading ; https...
[정성태] Java - How to use the Foreign Funct...
[정성태] 제가 큰 실수를 했군요. ^^; Delegate를 통한 Bein...
[정성태] Working with Rust Libraries from C#...
[정성태] Detecting blocking calls using asyn...
[정성태] 아쉽게도, 커뮤니티는 아니고 개인 블로그입니다. ^^
[정성태] 질문이 잘 이해가 안 됩니다. 우선, 해당 소스코드에서 ILis...
[양승조
] var대신 dinamic으로 선언해서 해결은 했습니다. 맞는 해...
[양승조
] 또 막혔습니다. ㅠㅠ var list = props[i].Ge...
[양승조
] 아. 감사합니다. 어제는 안됐던것 같은데....정신을 차려야겠네...
글쓰기
제목
이름
암호
전자우편
HTML
홈페이지
유형
제니퍼 .NET
닷넷
COM 개체 관련
스크립트
VC++
VS.NET IDE
Windows
Team Foundation Server
디버깅 기술
오류 유형
개발 환경 구성
웹
기타
Linux
Java
DDK
Math
Phone
Graphics
사물인터넷
부모글 보이기/감추기
내용
<div style='display: inline'> <h1 style='font-family: 맑은 고딕, Consolas; font-size: 20pt; color: #006699; text-align: center; font-weight: bold'>PHP 모듈 - php_mysql 빌드하는 방법</h1><br /> <p> <br /> 그동안, 계속해서 오픈 소스 코드로부터 결과물을 만들어내는 것을 살펴봤는데요.<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; width: 800px; background-color: #fbedbb; overflow-x: scroll; font-family: Consolas, Verdana;' > PHP 소스를 윈도우 환경에서 빌드하기 ; <a target='_tab' href='http://www.sysnet.pe.kr/2/0/1042'>http://www.sysnet.pe.kr/2/0/1042</a> Apache 소스를 윈도우 환경에서 빌드하기 ; <a target='_tab' href='http://www.sysnet.pe.kr/2/0/1048'>http://www.sysnet.pe.kr/2/0/1048</a> 윈도우에서 Apache Module 컴파일 (VC++) ; <a target='_tab' href='http://www.sysnet.pe.kr/2/0/1051'>http://www.sysnet.pe.kr/2/0/1051</a> 윈도우에서 Apache Module - Content Handler 컴파일 ; <a target='_tab' href='http://www.sysnet.pe.kr/2/0/1056'>http://www.sysnet.pe.kr/2/0/1056</a> 소스 코드로부터 php5apache2_2.dll 생성하는 방법 ; <a target='_tab' href='http://www.sysnet.pe.kr/2/0/1057'>http://www.sysnet.pe.kr/2/0/1057</a> </pre> <br /> 이번이 마지막 편으로, php 확장 모듈을 빌드하는 방법을 알아볼 텐데 기본적으로 제공되는 ext 폴더 안의 확장 모듈 소스 코드 중에 "D:\phpbuild\php53dev\vc9\x86\php-5.3.6\ext\mysql"을 선택해 보았습니다.<br /> <br /> <hr style='width: 50%' /><br /> <br /> "<a target='_tab' href='http://www.sysnet.pe.kr/2/0/1057'>소스 코드로부터 php5apache2_2.dll 생성하는 방법</a>"에서 (비록 실패했지만) configure 옵션을 지정해 보는 것을 해보았는데요. "configure --help"에 보면 "--with-mysql"도 있기 때문에 우선 그 옵션을 주는 것으로 시작해 보았습니다.<br /> <br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; width: 800px; background-color: #fbedbb; overflow-x: scroll; font-family: Consolas, Verdana;' > D:\Program Files\Microsoft SDKs\Windows\v6.1><b style='COLOR: blue'>setenv /x86 /xp /debug</b> D:\Program Files\Microsoft SDKs\Windows\v6.1><b style='COLOR: blue'>cd /d d:\phpbuild</b> d:\phpbuild><b style='COLOR: blue'>.\bin\phpsdk_setvars.bat</b> d:\phpbuild>REM phpsdk.bat d:\phpbuild>cd D:\phpbuild\php53dev\vc9\x86\php-5.3.6 D:\phpbuild\php53dev\vc9\x86\php-5.3.6><b style='COLOR: blue'>configure --disable-all --enable-cli --enable-debug --with-mysql</b> Saving configure options to config.nice.bat Checking for cl.exe ... <in default path> Detected compiler MSVC9 (Visual C++ 2008) Detected 32-bit compiler ...[생략]... Build dir: Debug_TS PHP Core: php5ts_debug.dll and php5ts_debug.lib Checking for wspiapi.h ... <in default path> Enabling IPv6 support Enabling SAPI sapi\cli Enabling extension ext\date Enabling extension ext\ereg Enabling extension ext\pcre Enabling extension ext\reflection Enabling extension ext\spl Checking for timelib_config.h ... ext/date/lib Enabling extension ext\standard <b style='COLOR: blue'> mysqlnd not found: mysqlnd support in mysql disabled WARNING: mysql not enabled; mysqlnd is not enabled</b> ...[생략]... | Build type | Debug | | Thread Safety | Yes | | Compiler | MSVC9 (Visual C++ 2008) | | Architecture | x86 | ------------------------------------------- Type 'nmake' to build PHP </pre> <br /> 오~~~ 이번에는 효과가 있습니다. 오류는 발생했지만, 어쨌든 configure가 "--with-mysql" 옵션에 반응을 했다는 것이 중요하지요. ^^ mysqlnd(Mysql Native Client Driver)라... 찾아보니 다음과 같이 정리된 글이 나옵니다.<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; width: 800px; background-color: #fbedbb; overflow-x: scroll; font-family: Consolas, Verdana;' > MySQL Native Driver ; <a target='_tab' href='http://php.net/manual/en/book.mysqlnd.php'>http://php.net/manual/en/book.mysqlnd.php</a> </pre> <br /> 위의 문서에 링크되어 있는 "Installation"에 가보면 설치 관련 이야기가 나오는데,<br /> <br /> <div style='BACKGROUND-COLOR: #ccffcc; padding: 10px 10px 5px 10px; MARGIN: 0px 10px 10px 10px; FONT-FAMILY: 맑은 고딕, Consolas, Verdana; COLOR: #005555'> Installation on Windows<br /> <br /> In the official PHP distributions from 5.3 onwards, <b style='COLOR: blue'>MySQL Native Driver is enabled by default</b>, so no additional configuration is required to use it. All MySQL database extensions will use MySQL Native Driver in this case. <br /> </div><br /> <br /> 즉,,, ^^; 별다르게 해줄 것이 없다는 이야기입니다. 더욱 문제는, 위의 오류로 검색해 봐도 해결책을 제시하는 글이 없었습니다. 아쉽지만, 이번에는 'PHP와 함께 빌드될 수 있다'라는 가능성만 인식하고 <a target='_tab' href='http://www.sysnet.pe.kr/2/0/1057'>php5apache2_2.dll</a> 빌드 때 처럼 직접 "D:\phpbuild\php53dev\vc9\x86\php-5.3.6\ext\mysql" 폴더 안의 소스 코드로 컴파일하기로 했습니다.<br /> <br /> (혹시, 위의 configure를 사용해서 빌드하는 방법을 아시는 분이 있다면 댓글 좀 부탁드립니다. ^^)<br /> <br /> <hr style='width: 50%' /><br /> <br /> "D:\phpbuild\php53dev\vc9\x86\php-5.3.6\ext\mysql" 폴더를 보면, mysql.mak 파일과 mysql.dsp 파일이 함께 있습니다. 오호... 그럼 nmake로 빌드가 되겠군요. <br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; width: 800px; background-color: #fbedbb; overflow-x: scroll; font-family: Consolas, Verdana;' > D:\phpbuild\php53dev\vc9\x86\php-5.3.6\ext\mysql><b style='COLOR: blue'>nmake /f mysql.mak</b> Microsoft (R) Program Maintenance Utility Version 10.00.30319.01 Copyright (C) Microsoft Corporation. All rights reserved. mysql.mak(13) : fatal error U1052: file '<b style='COLOR: blue'>..\../netware/common.mif</b>' not found Stop. </pre> <br /> 아쉬운 빌드 결과입니다. netware 폴더에 보니까, sendmail_nw.h, start.c 파일만 존재하고 common.mif 파일은 없었습니다. 아무래도 mysql.mak 파일은 윈도우 빌드용으로 제작된 것은 아닌 것 같습니다. 그래서, 이번에도 mysql.dsp 파일을 Visual Studio로 열어서 '맞춰주는 작업'을 시작했습니다.<br /> <br /> Visual Studio 2008에서 로드 후, 곧바로 빌드하면 다음과 같은 오류가 발생합니다.<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; width: 800px; background-color: #fbedbb; overflow-x: scroll; font-family: Consolas, Verdana;' > fatal error LNK1104: cannot open file 'libmySQL.lib' </pre> <br /> 지난번 <a target='_tab' href='http://www.sysnet.pe.kr/2/0/1057'>php5apache2_2.dll</a> 빌드와 유사한 경우라고 볼 수 있습니다. 프로젝트 속성 창에서 추가 라이브러리에 설정된 경로를 확인해 보니, "..\..\..\MySQL\lib\Debug"라는 항목이 포함되어 있어서 다음과 같이 <a target='_tab' href='http://www.sysnet.pe.kr/2/0/1058'>MySQL이 설치된 폴더</a>에 있는 lib 폴더를 그대로 복사해 주었습니다.<br /> <br /> <img alt='how_to_build_mysql_ext_1.png' src='/SysWebRes/bbs/how_to_build_mysql_ext_1.png' /><br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; width: 800px; background-color: #fbedbb; overflow-x: scroll; font-family: Consolas, Verdana;' > D:\mysql\lib ==> D:\phpbuild\php53dev\vc9\x86\MySQL\lib </pre> <br /> 다시 빌드하면, 이번엔 다음과 같은 오류들이 발생합니다. (아마도, 다른 분들은 발생하지 않을 수 있습니다.)<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; width: 800px; background-color: #fbedbb; overflow-x: scroll; font-family: Consolas, Verdana;' > error LNK2019: unresolved external symbol __imp__mysqlnd_get_client_info referenced in function _zm_info_mysql error LNK2019: unresolved external symbol __imp__mysqlnd_connect referenced in function _php_mysql_do_connect error LNK2019: unresolved external symbol __imp___mysqlnd_init referenced in function _php_mysql_do_connect error LNK2019: unresolved external symbol __imp__mysqlnd_old_escape_string referenced in function _zif_mysql_escape_string error LNK2019: unresolved external symbol __imp___mysqlnd_fetch_lengths referenced in function _zif_mysql_fetch_lengths </pre> <br /> mysql.dsp 프로젝트에 기본적으로 설정되어 있는 링크해야 할 lib 파일은 다음과 같습니다.<br /> <br /> ==== Debug_TS 빌드인 경우 ====<br /> <br /> <ul> <li>php5ts_debug.lib</li> <li>libmySQL.lib</li> <li>odbc32.lib</li> <li>odbccp32.lib</li> </ul> <br /> 설치된 MySQL 폴더에서 가져온 libmysql.lib에는 _mysqlnd_get_client_info 함수가 정의되어 있지 않다는 것이니, 남은 php5ts_debug.lib에 정의되어 있어야 한다는 가정을 할 수 있습니다.<br /> <br /> 제 경우에, 참조하고 있는 php5ts_debug.lib 파일은 제가 직접 PHP를 빌드해서 생성한 것으로 이전에 써둔 글에 따라 기본적인 configure 옵션만 포함한 것이었습니다.<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; width: 800px; background-color: #fbedbb; overflow-x: scroll; font-family: Consolas, Verdana;' > PHP 소스를 윈도우 환경에서 빌드하기 ; <a target='_tab' href='http://www.sysnet.pe.kr/2/0/1042'>http://www.sysnet.pe.kr/2/0/1042</a> </pre> <br /> 그러니까, "configure --disable-all --enable-cli"만으로 PHP를 컴파일하면 MySQL 관련해서 지원 함수들도 모두 누락된다는 것인데요. 실제로 PHP 웹 사이트에서 배포하고 있는 '바이너리 버전'의 "<a target='_tab' href='http://windows.php.net/downloads/releases/php-5.3.6-Win32-VC9-x86.zip'>php-5.3.6-Win32-VC9-x86.zip</a>" 파일 안에 포함된 php5ts.dll을 구해서 "depends.exe (Dependency Walker)"로 확인을 해보니 다음과 같이 mysqlnd_get_client_info 함수 정의를 포함하고 있었습니다.<br /> <br /> <img alt='how_to_build_mysql_ext_2.png' src='/SysWebRes/bbs/how_to_build_mysql_ext_2.png' /><br /> <br /> 별수 없군요. 일단은 제가 빌드해서 생성한 PHP 바이너리는 포기하고, PHP 웹 사이트에서 배포 중인 PHP 출력물로 대체하기로 결정했습니다. 이를 위해 php5ts.lib 파일을 (최대한 dsp 파일을 수정하지 않고) 빌드가 자연스럽게 되도록 Debug_TS 폴더에 복사해 주어야 합니다.<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; width: 800px; background-color: #fbedbb; overflow-x: scroll; font-family: Consolas, Verdana;' > "D:\apm_build\php-5.3.6-Win32-VC9-x86\dev\php5ts.lib" ==> D:\phpbuild\php53dev\vc9\x86\php-5.3.6\Debug_TS\php5ts_debug.lib </pre> <br /> 이제 빌드하면, 정상적으로 "D:\phpbuild\php53dev\vc9\x86\php-5.3.6\Debug_TS" 폴더에 "php_mysql.dll" 파일이 생성됩니다.<br /> <br /> <hr style='width: 50%' /><br /> <br /> 실제로 잘 동작하는지 테스트를 해봐야 하는데요. 일단, 위의 빌드 과정에서 제가 직접 빌드한 PHP 결과물에는 여러가지로 부족한 면이 많아서, 아래의 글을 쓰면서 구성했던 Apache/PHP 환경에다,<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; width: 800px; background-color: #fbedbb; overflow-x: scroll; font-family: Consolas, Verdana;' > .NET 개발자가 처음 설치해 본 Apache + PHP ; <a target='_tab' href='http://www.sysnet.pe.kr/2/0/1040'>http://www.sysnet.pe.kr/2/0/1040</a> </pre> <br /> 이 글에서 빌드한 "php_mysql.dll"을 복사한 후 php.ini에 extension으로 등록시킨 다음 httpd.exe를 실행했습니다. 결과는?<br /> <br /> <img alt='how_to_build_mysql_ext_3.png' src='/SysWebRes/bbs/how_to_build_mysql_ext_3.png' /><br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; width: 800px; background-color: #fbedbb; overflow-x: scroll; font-family: Consolas, Verdana;' > " PHP Startup: mysql: Unable to initialize module Module compiled with build ID=<b style='COLOR: blue'>API20090626,TS,debug,VC9</b> PHP compiled with build ID=<b style='COLOR: blue'>API20090626,TS,VC9</b> These options need to match " </pre> <br /> 음... 그러니까, Release 모드로 빌드된 PHP 런타임 환경에 Debug 모드로 빌드된 PHP 확장 DLL을 로드할 수 없다는 이야기인데요. ^^; 문제는 Debug/Release 차이만은 아닌 것 같습니다. "build ID"에 API 날짜라든가 컴파일한 Visual C++ 버전 정보까지 들어있는 거 보면 '확장'이라는 말이 왠지 어울리지 않는 구조인 것 같습니다. 그렇다면, 만약 php_mysql.dll 파일의 소스 코드를 변경해서 배포하는 3rd-party 업체가 있다면 수많은 PHP 웹 사이트에서 사용하고 있을 "build ID"에 해당하는 버전의 php_mysql.dll 파일을 유지해야 한다는 결론인데요. 휴~~~~ 제 개인적인 기준으로 보면 말도 안되는 '확장'이군요.<br /> <br /> 단순 테스트를 위한 현재 상황에서 그나마 다행이라면, "build ID" 중에서 틀린 것이 단지 debug/release 정도이니, 이를 맞춰주려면 2가지 방법으로 해결할 수 있습니다. 즉, PHP 런타임을 mysql 지원이 되도록 해서 디버그 버전으로 빌드하거나, 아니면 php_mysql 프로젝트를 Release_TS 모드로 빌드하는 것입니다.<br /> <br /> 여기서는, 후자의 방법이 일단 편리하기 때문에 택했습니다. 하지만 <a target='_tab' href='http://www.sysnet.pe.kr/2/0/1053'>"Shift + F2" 디버깅</a>의 편리함을 누리려면 프로젝트 설정에서 몇 가지 추가적인 변경를 해줘야 합니다.<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; width: 800px; background-color: #fbedbb; overflow-x: scroll; font-family: Consolas, Verdana;' > C/C++ / General / Debug Information Format - Program Database (/Zi) C/C++ / Optimization / Optimization - Disabled (/Od) Linker / General / Output File - D:\apache\phpmodule\ext\php_mysql.dll Linker / Debugging / Generate Debug Info - Yes (/DEBUG) Linker / Debugging / Generate Program Database File - D:\apache\phpmodule\ext\php_mysql.pdb </pre> <br /> 이렇게 변경하고 다시 빌드한 후, "Shift + F2" 키를 눌러 디버깅을 시작합니다. 그런 다음 웹 브라우저를 실행시켜 지난번에 만들어 두었던 <a target='_tab' href='http://www.sysnet.pe.kr/2/0/1058'>mysql_sample.php</a> 파일을 방문하면 아래와 같이 php_mysql의 소스 코드에 걸어 둔 BP(BreakPoint)가 걸리는 것을 확인할 수 있습니다.<br /> <br /> <img alt='how_to_build_mysql_ext_4.png' src='/SysWebRes/bbs/how_to_build_mysql_ext_4.png' /><br /> <br /> 오~~~ 멋지죠~~~!!! ^^<br /> <br /> (<a target='_tab' href='http://www.sysnet.pe.kr/bbs/DownloadAttachment.aspx?wid=1059&boardid=331301885'>첨부한 파일은 위와 같은 설정으로 변경된 mysql 프로젝트</a>입니다.)<br /> <br /> </p> <br /><br /><hr /><span style='color: Maroon'>[이 글에 대해서 여러분들과 의견을 공유하고 싶습니다. 틀리거나 미흡한 부분 또는 의문 사항이 있으시면 언제든 댓글 남겨주십시오.]</span> </div>
첨부파일
스팸 방지용 인증 번호
2093
(왼쪽의 숫자를 입력해야 합니다.)