Phalanger에서 기존 PHP 모듈 활성화하기

PHP 4.x와 PHP 5.x에서 널리 사용되던 모듈 중에는 유용한 것들이 많이 있습니다. 이미지 처리, 데이터베이스 연동, 암호화, MIME TYPE 관련 연동 등 종류도 매우 많으며, 실질적인 웹 기술에 직접 영향을 끼치는 모듈들도 많이 있어서 웹 관련 개발에 큰 생산성 향상을 가져다주기도 합니다.


Phalanger가 문법적으로는 PHP와 상당한 호환성을 보여주지만 결정적으로 궁금한 것은 과연 기존에 사용하던 Native PHP 모듈을 모두 사용할 수 있는가에 대한 부분일 것입니다. 얼핏 보기에는 Phalanger가 그저 호환성 보존 차원에서 API 계층만 제공하는게 아니냐는 생각이 들 수 있는데 사실 Phalanger의 절반을 이루는 것은 바로 이 상호운용성에 대한 내용입니다.


이번 아티클에서는 Phalanger가 지원하는 대표적인 Native PHP Module들을 활성화하는 방법을 소개해보겠습니다. 이 방법을 사용하면 기존의 php.ini와는 달리 웹 서버 전역이 아닌 특정 웹 응용프로그램 풀 안에서만 적용되는 모듈 구성이 가능합니다.


Custom Configuration Hanlder 등록하기


ASP.NET 위에서 호스팅되는 모든 Web App들은 web.config이라고 하는 사전에 약속된 설정 파일을 사용하여 모든 구성을 지정할 수 있으며 이는 Apache에서 사용하는 httpd.conf와 같은 성격의 파일이기도 하지만, 동시에 완벽한 XML을 사용하기 때문에 다양한 관리 도구와 충돌 없이 상호작용할 수 있습니다.


우선 <configuration> 요소 아래의 제일 첫 번째 노드로 와야 하는 내용이 있습니다. 



<configSections>

    <section name=”phpNet” type=”PHP.Core.ConfigurationSectionHandler, PhpNetCore, Version=3.0.0.0, Culture=neutral, PublicKeyToken=0a8e8c4c76728c71″ />

</configSections>


바로 <configSections> 요소인데, 이 요소 아래에 <phpNet> 요소에 대한 처리기를 위와 같이 지정해야 합니다. 이렇게 설정하여 각 웹 사이트 별로 독립적인 PHP 설정을 가지게할 수 있습니다.


<phpNet> 요소 설정하기


아래의 XML 코드 조각은 보통의 php.ini 파일에서 활용할 수 있는 거의 대부분의 Native Module들을 열거한 것입니다. 아래와 같이 지정하였을 때 실제로 해당 Module들을 .NET Runtime 위로 불러오게 됩니다.


<phpNet>
    <classLibrary>
        <add assembly=”System.Configuration, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a” />
        <add assembly=”System.Web, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a” />
  <add assembly=”PhpNetClassLibrary, Version=3.0.0.0, Culture=neutral, PublicKeyToken=4af37afe3cde05fb” section=”bcl” />
  <add assembly=”PhpNetMsSql, Version=3.0.0.0, Culture=neutral, PublicKeyToken=2771987119c16a03″ section=”mssql” />
  <add assembly=”php_bcmath.mng, Version=3.0.0.0, Culture=neutral, PublicKeyToken=4ef6ed87c53048a3″ section=”bcmath” />
  <add assembly=”php_com.mng, Version=3.0.0.0, Culture=neutral, PublicKeyToken=4ef6ed87c53048a3″ section=”com” />
  <add assembly=”php_image.mng, Version=3.0.0.0, Culture=neutral, PublicKeyToken=4ef6ed87c53048a3″ section=”image” />
  <add assembly=”php_zlib.mng, Version=3.0.0.0, Culture=neutral, PublicKeyToken=4ef6ed87c53048a3″ section=”zlib” />
  <add assembly=”php_odbc.mng, Version=3.0.0.0, Culture=neutral, PublicKeyToken=4ef6ed87c53048a3″ section=”odbc” />
  <add assembly=”php_ftp.mng, Version=3.0.0.0, Culture=neutral, PublicKeyToken=4ef6ed87c53048a3″ section=”ftp” />
  <add assembly=”php_calendar.mng, Version=3.0.0.0, Culture=neutral, PublicKeyToken=4ef6ed87c53048a3″ section=”calendar” />
  <add assembly=”php_bz2.mng, Version=3.0.0.0, Culture=neutral, PublicKeyToken=4ef6ed87c53048a3″ section=”bz2″ />
  <add assembly=”php_cpdf.mng, Version=3.0.0.0, Culture=neutral, PublicKeyToken=4ef6ed87c53048a3″ section=”cpdf” />
  <add assembly=”php_crack.mng, Version=3.0.0.0, Culture=neutral, PublicKeyToken=4ef6ed87c53048a3″ section=”crack” />
  <add assembly=”php_curl.mng, Version=3.0.0.0, Culture=neutral, PublicKeyToken=4ef6ed87c53048a3″ section=”curl” />
  <add assembly=”php_db.mng, Version=3.0.0.0, Culture=neutral, PublicKeyToken=4ef6ed87c53048a3″ section=”db” />
  <add assembly=”php_dba.mng, Version=3.0.0.0, Culture=neutral, PublicKeyToken=4ef6ed87c53048a3″ section=”dba” />
  <add assembly=”php_dbase.mng, Version=3.0.0.0, Culture=neutral, PublicKeyToken=4ef6ed87c53048a3″ section=”dbase” />
  <add assembly=”php_dbx.mng, Version=3.0.0.0, Culture=neutral, PublicKeyToken=4ef6ed87c53048a3″ section=”dbx” />
  <add assembly=”php_domxml.mng, Version=3.0.0.0, Culture=neutral, PublicKeyToken=4ef6ed87c53048a3″ section=”domxml” />
  <add assembly=”php_exif.mng, Version=3.0.0.0, Culture=neutral, PublicKeyToken=4ef6ed87c53048a3″ section=”exif” />
  <add assembly=”php_filepro.mng, Version=3.0.0.0, Culture=neutral, PublicKeyToken=4ef6ed87c53048a3″ section=”filepro” />
  <add assembly=”php_gd2.mng, Version=3.0.0.0, Culture=neutral, PublicKeyToken=4ef6ed87c53048a3″ section=”gd2″ />
  <add assembly=”php_gettext.mng, Version=3.0.0.0, Culture=neutral, PublicKeyToken=4ef6ed87c53048a3″ section=”gettext” />
  <add assembly=”php_hyperwave.mng, Version=3.0.0.0, Culture=neutral, PublicKeyToken=4ef6ed87c53048a3″ section=”hyperwave” />
  <add assembly=”php_iconv.mng, Version=3.0.0.0, Culture=neutral, PublicKeyToken=4ef6ed87c53048a3″ section=”iconv” />
  <add assembly=”php_imap.mng, Version=3.0.0.0, Culture=neutral, PublicKeyToken=4ef6ed87c53048a3″ section=”imap” />
  <add assembly=”php_java.mng, Version=3.0.0.0, Culture=neutral, PublicKeyToken=4ef6ed87c53048a3″ section=”java” />
  <add assembly=”php_ldap.mng, Version=3.0.0.0, Culture=neutral, PublicKeyToken=4ef6ed87c53048a3″ section=”ldap” />
  <add assembly=”php_mbstring.mng, Version=3.0.0.0, Culture=neutral, PublicKeyToken=4ef6ed87c53048a3″ section=”mbstring” />
  <add assembly=”php_mcrypt.mng, Version=3.0.0.0, Culture=neutral, PublicKeyToken=4ef6ed87c53048a3″ section=”mcrypt” />
  <add assembly=”php_mhash.mng, Version=3.0.0.0, Culture=neutral, PublicKeyToken=4ef6ed87c53048a3″ section=”mhash” />
  <add assembly=”php_mime_magic.mng, Version=3.0.0.0, Culture=neutral, PublicKeyToken=4ef6ed87c53048a3″ section=”mime-magic” />
  <add assembly=”php_ming.mng, Version=3.0.0.0, Culture=neutral, PublicKeyToken=4ef6ed87c53048a3″ section=”ming” />
  <add assembly=”php_msql.mng, Version=3.0.0.0, Culture=neutral, PublicKeyToken=4ef6ed87c53048a3″ section=”msql” />
        <add assembly=”php_mysql.mng, Version=3.0.0.0, Culture=neutral, PublicKeyToken=4ef6ed87c53048a3″ section=”mysql” />
  <add assembly=”php_openssl.mng, Version=3.0.0.0, Culture=neutral, PublicKeyToken=4ef6ed87c53048a3″ section=”openssl” />
  <add assembly=”php_pdf.mng, Version=3.0.0.0, Culture=neutral, PublicKeyToken=4ef6ed87c53048a3″ section=”pdf” />
  <add assembly=”php_pgsql.mng, Version=3.0.0.0, Culture=neutral, PublicKeyToken=4ef6ed87c53048a3″ section=”pgsql” />
  <add assembly=”php_shmop.mng, Version=3.0.0.0, Culture=neutral, PublicKeyToken=4ef6ed87c53048a3″ section=”shmop” />
  <add assembly=”php_snmp.mng, Version=3.0.0.0, Culture=neutral, PublicKeyToken=4ef6ed87c53048a3″ section=”snmp” />
  <add assembly=”php_sockets.mng, Version=3.0.0.0, Culture=neutral, PublicKeyToken=4ef6ed87c53048a3″ section=”sockets” />
  <add assembly=”php_xml.mng, Version=3.0.0.0, Culture=neutral, PublicKeyToken=4ef6ed87c53048a3″ section=”xml” />
  <add assembly=”php_xmlrpc.mng, Version=3.0.0.0, Culture=neutral, PublicKeyToken=4ef6ed87c53048a3″ section=”xmlrpc” />
  <add assembly=”php_xslt.mng, Version=3.0.0.0, Culture=neutral, PublicKeyToken=4ef6ed87c53048a3″ section=”xslt” />
  <add assembly=”php_yaz.mng, Version=3.0.0.0, Culture=neutral, PublicKeyToken=4ef6ed87c53048a3″ section=”yaz” />
  <add assembly=”php_zip.mng, Version=3.0.0.0, Culture=neutral, PublicKeyToken=4ef6ed87c53048a3″ section=”zip” />
  <add assembly=”php_big_int.mng, Version=3.0.0.0, Culture=neutral, PublicKeyToken=4ef6ed87c53048a3″ section=”big_int” />
 </classLibrary>
</phpNet>

gd2, xml, zip과 같이 널리 사용하는 모듈들을 불러오고 있습니다만 조금 독특한 부분이 있습니다. Native DLL들을 사용하기로 하였지만 DLL에 대한 시그니처는 닷넷 프레임워크에서 사용하는 정규화된 Full Name을 사용하고 있는데, 사실 Phalanger는 Native DLL들을 as-is로 사용하기보다는 별도의 Managed Wrapper를 만들어서 사용하기 때문에 이와 같은 형태가 됩니다. Phalanger 3.0에 들어와서 64비트를 적극적으로 지원할 수 있게되었다고 이야기할 수 있는 것은 이와 같은 Native DLL에 대한 Wrapper를 제공하기 때문입니다.


더 나아가기


Phalanger는 이제 상당한 수준의 웹 개발 프레임워크로 자리 잡았습니다. 그렇지만 이것을 어떻게 활용할 것인가에 대한 고민은 아직 끝나지 않았고, 또한 ASP.NET MVC와의 연계나 기존 PHP 코드와의 호환성 개선 등 서로 다른 양쪽의 환경을 자연스럽게 이어줄 수 있는 다리 역할을 얼마나 잘 할 수 있을지도 사실 아직은 시험대 위에 놓여있는 상태입니다. 그렇지만 무궁무진한 발전이 기대되는 프레임워크인 것은 사실인듯 합니다.

댓글 남기기