원래 IIS 기반 ASP, ASP.NET으로만 개발하다 이번에 PHP를 제대로 스터디하며 하나씩 배우고 있다. 원래 PHP에 MYSQL을 주로 사용을 하지만 나는 이제까지 MSSQL만 사용했고 회사 프로젝트에 MSSQL을 사용해야 돼서 SQL 서버 드라이버를 설치하게 되었다. 그런데 의문은??? 같은 DLL인데 TS, NTS 2가지의 버전이 있었다. ㅡoㅡ 오호 이건 도대체 멀징?
그래서 의문점을 가지고 알아보았다.
예전 자료를 찾아보니 PHP는 TS 버전만 빌드되었다고 한다. 아무래도 리눅스 기반으로 개발되었으니 기존 리눅스/유닉스 계열이 지원하는 Multi-process 방식이었기 때문이다. php가 대중화되면서 iis와 연동하게 되었고 Multi-thread 방식인 윈도우 계정에 이 TS버전을 빌드하게 되면서 문제가 발생하였다. PHP를 IIS와 연동하기 위해 CGI(FastCGI) 또는 ISAPI(Internet Server API) 방식으로 연동을 해야 하는데 기존에 PHP와 관련된 모듈은 TS로 다 개발되었기 때문에 ISAPI로 연동하였을 경우 서버가 다운되는 대참사가 발생하였다.
이를 방지하기 위해 CGI 방식으로 변경하여 사용했으나 퍼포먼스 쪽에 문제가 생겼고 이를 개선하기 위해 나온 버전이 NTS(Non-Thread Safe) 버전이다.
처음에 아무 생각 없이 Dynamic Extensions에 추가를 했는데 동작을 안 해서 이것저것 자료를 찾다 보니 알게 되었다.
이번에 Microsoft Drivers 5.9 for PHP for SQL Server를 사용해 작업하고 있는데....
php_pdo_sqlsrv_80_nts_x64.dll
php_sqlsrv_80_nts_x64.dll
두 가지를 Dynamic Extensions 추가해 사용하면 정상적으로 사용이 된다. 참.. 새로운 걸 사용한다는 게 쉬운 게 아니네.. ㅎㅎㅎ
참고로 더 확인해보니.. 윈도우인 경우에도 종류에 따라 사용 버전이 틀려진다.
Windows + IIS(FastCGI) : NTS 버전 Windows + Apache : TS 버전
이렇게 사용하면 된다. ^^;;; 윈도우 기반이더라도 Apache를 통해 서비스한다면 TS 버전 사용이 가능하다.
* 트랜잭션 처리 및 관련 PDO 클래스는 아래 링크를 참조하면 된다. https://docs.microsoft.com/ko-kr/sql/connect/php/pdo-class?view=sql-server-ver15
* 마이크로 소프트 샘플 예정 ( 전 이걸 수정해서 테스트 했습니다. )
<!--============= This file is part of a Microsoft SQL Server Shared Source Application. Copyright (C) Microsoft Corporation. All rights reserved.
THIS CODE AND INFORMATION ARE PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A PARTICULAR PURPOSE. ============= *-->
<!--Note: The presentation formatting of this example application --> <!-- is intentionally simple to emphasize the SQL Server --> <!-- data access code.--> <html> <head> <title>AdventureWorks Product Reviews</title> </head> <body> <h1 align='center'>AdventureWorks Product Reviews</h1> <h5 align='center'>This application is a demonstration of the object oriented API (PDO_SQLSRV driver) for the Microsoft Drivers for PHP for SQL Server.</h5><br/> <?php $serverName = "(local)\sqlexpress";
if(isset($_REQUEST['action'])) { switch( $_REQUEST['action'] ) { /* Get AdventureWorks products by querying against the product name.*/ case 'getproducts': try { $params = array($_POST['query']); $tsql = "SELECT ProductID, Name, Color, Size, ListPrice FROM Production.Product WHERE Name LIKE '%' + ? + '%' AND ListPrice > 0.0";
/* Display form for uploading a picture.*/ case 'displayuploadpictureform': try { $tsql = "SELECT Name FROM Production.Product WHERE ProductID = ?"; $getName = $conn->prepare($tsql); $getName->execute(array($_GET['productid'])); $name = $getName->fetchColumn(0); } catch(Exception $e) { die( print_r( $e->getMessage() ) ); } DisplayUploadPictureForm( $_GET['productid'], $name ); break;
/* Upload a new picture for the selected product. */ case 'uploadpicture': try { $tsql = "INSERT INTO Production.ProductPhoto (LargePhoto) VALUES (?)"; $uploadPic = $conn->prepare($tsql); $fileStream = fopen($_FILES['file']['tmp_name'], "r"); $uploadPic->bindParam(1, $fileStream, PDO::PARAM_LOB, 0, PDO::SQLSRV_ENCODING_BINARY); $uploadPic->execute();
/* Get the first field - the identity from INSERT - so we can associate it with the product ID. */ $photoID = $conn->lastInsertId(); $tsql = "UPDATE Production.ProductProductPhoto SET ProductPhotoID = ? WHERE ProductID = ?"; $associateIds = $conn->prepare($tsql); $associateIds->execute(array($photoID, $_POST['productid'])); } catch(Exception $e) { die(print_r($e->getMessage())); }
원래 C/S 개발이 전문이지만.... 이것저것 하다 보니... PHP를 스터디 진행하게 됐다. 물론 기존에 ASP, ASP.NET으로 개발을 했지만.. 향후를 위해 PHP 스터디를 진행하기로 했다. 기존에 ASP 사이트와 같이 운영을 해야 되다 보니 IIS 환경에 PHP를 같이 돌려야 되는 상황이다.
IIS에 PHP를 구동하면 php.ini 파일은 c:\windows 폴더 안에 넣은 후 iis를 재실행하면 반영이 되도록 되어있다.
그래서 c:\php 폴더안에 php.ini-production 파일을 php.ini로 변경하여 c:\windows 폴더에 넣었다. 그런 후 iis를 재실행하고 phpinfo(); 함수가 있는 페이지를 로딩하자 빈 화면만 나타났다 -_-;; 소스 보기를 하니 그림과 같이 소스가 그대로 보이는 현상이.. -_-;;;;
그래서 찾아보니 몇 가지 속성을 변경해 주어야 된다. 일단 타임존을 설정해 두어야 된다. ( 기본은 그냥 주석처리가 되어있다. ) "Asia/Seoul"로 설정하였다.
그리고 short_open_tag = On 으로 값을 변경해준다. ( Off로 기본 셋팅이 되어있다. )
이렇게 수정 후 IIS를 재 실행 후 PHPINFO 페이지를 호출하면 잘 나온다 ^^
또 순간적으로 욱!! 해서... PHP고 머고 접을 뻔했네 ㅋㅋㅋ
결론은 저 옵션이 짧은 태그에 대한 허용을 해주는 옵션인데.. 소스 길이가 너무 짧아서 차단되는 기형상을 본 것이다. -_-;;; 앞날이 까마득하네.... 그래도 조만간 PHP도 고수가 되겠지... HTML5, AJAX, JQUERY는 동일하니.. ^^a
나중에 안 사실이지만... php 구분을 선언한때 <? ?> 이렇게 선언하는데... <?php ?> 이렇게 했으면 문제가 없던거였네.. ㅠ_ㅠ 결국 내 손이 문제였네 ㅋ