Phalanger是一種PHP語言編譯器,也是針對.NET的PHP運行時。它可以用於把PHP web項目編譯成.NET字節碼,並在Windows中使用IIS或 者在Linux上使用Mono和Apache作為ASP.NET應用程序來執行。然而,Phalanger不僅僅是把已經存在的PHP應用編譯到.NET中。
我們可以使用Phalanger創建組合.NET和PHP的解決方案,所采用的方式用標准的PHP解釋器是不可能做到的。有了Phalanger擴展,PHP 程序可以直接使用.NET類,而.NET程序(比方說用C#編寫的)也可以動態地調用PHP腳本,或者使用在PHP中實現的函數和類【6】。
本文中,我麼會簡要地介紹Phalanger,然後查看三種使用方案。我們會討論如何整合PHP應用程序和.NET;如何高效地在Windows上運 行PHP應用程序,以及如何使用PHP作為ASP.NET的視圖引擎(view engine)。
Phalanger簡介
Phalanger已經存在一段時間了。第一版Phalanger是於2003年在布拉格的查爾斯大學作為軟件項目創建的。稍後就開始了2.0版本的開 發,並且於2006年在CodePlex作為開源項目發布。微軟支持了這個項目一段時間,後來一位Phalanger開發者加入微軟,並從事動態語言運 行時方面的工作。
Phalanger相關活動在2008年恢復,這多虧有了與Jadu的合作,它使用Phalanger為在PHP中開發的CMS構建了.NET版本。從2010年開始, Phalanger的開發主要由DEVSENSE提供資金支持,它也為Phalanger提供了商業支持。最近發布的版本Phalanger 2.1【7】,其中提升了與 標准PHP實現的兼容性,在動態操作的實現過程中利用了DLR,並提供了PHP和其他.NET語言(像C#、F#和Visual Basic)之間的互操作性。
Phalanger的組件
Phalanger包括多個部分獨立的組件,可以用來開發運行在.NET上的PHP應用程序,並使用.NET或Mono來運行它們:
Phalanger編譯器Phalanger會把PHP源代碼編譯成.NET程序集,它可以使用.NET JIT(Just-in-time編譯器,它會為當前平台生成本地 代碼)執行。編譯後的PHP代碼會使用Phalanger運行時和動態語言運行時,從而提供了PHP語言動態特性的高效率實現。
Phalanger運行時和類庫Phalanger運行時提供了對數組之類PHP特性的實現。Phalanger還包含了針對I/O、正則表達式以及其他標准PHP 類庫的.NET實現。
本地擴展在32位Windows平台上,Phalanger可以通過本地的橋接程序使用所有現存的PHP 4擴展。盡管這會帶來一些運行時負載,但這 讓我們不需要額外工作就可以運行某些PHP應用程序。
托管的擴展 通過包裝.NET中提供的類似功能,PHP擴展也可以重新實現。這些擴展可以是由任何.NET語言編寫,並提供很好的性能。 Phalanger中包含多個擴展,包括SPL、JSON、SimpleXML、MySQL和MS SQL的提供程序。DEVSENSE【9】還提供了附加的擴展,像Memcached 、圖像和cURL等。
與Visual Studio的集成Phalanger還與Visual Studio集成(最近的更新支持Visual Studio 2010)。集成功能添加了針對PHP文件的顏 色突出顯示和智能提示功能,讓我們可以調試使用Phalanger運行的PHP應用程序。
Phalanger使用案例
Phalanger在很大程度上與PHP 5兼容,可以運行大量開源的PHP項目,包括WordPress和MediaWiki。我們可以使用它把這些項目集成 到.NET生態系統中,也可以開發新的項目,它會兼有PHP和.NET的優勢。在本文剩下的內容中,我們會討論以下三種使用案例:
方案1: 高效運行PHP應用程序。使用PHalanger在Windows上編譯的PHP應用程序的性能,要比通過FastCGI使用標准PHP解釋器運行的高 。這使得選擇Phalanger在Windows環境中部署PHP很具有吸引力。
方案2: 把WordPress與ASP.NET整合。使用Phalanger編譯的PHP代碼能夠調用所有.NET程序庫。這可以用於在PHP和ASP.NET應用程序之 間共享用戶數據庫或者其他數據。
方案3: 從ASP.NET應用程序中調用PHP。PHP的靈活性對於編寫腳本或者編寫web應用程序的表現層非常有用。有了Phalanger,我們就 可以在.NET中開發應用程序,並使用PHP作為腳本語言或者視圖引擎。
以下三個部分會詳細討論各種方案。我們首先會給出概覽,然後查看一些技術細節,它會說明Phalanger中讓你感興趣的內容。
方案1: 高效運行PHP應用程序
Phalanger之所以能夠高效地運行PHP應用程序,是因為以下兩個原因。首先,它會編譯PHP源代碼,而不是解釋它;其次,它會把應用 作為ASP.NET應用程序運行,那會在Windows下提供額外的性能優勢。
使用Phalanger和.NET編譯PHP
編譯過程如圖1所示。正如圖上所顯示的,Phalanger會把PHP源代碼編譯成.NET IL(中間語言),那是與架構獨立的低級字節碼。編譯 後的代碼會使用PHP核心庫(Phalanger的一部分)和動態語言運行時(DLR)來執行標准的PHP操作。當應用程序啟動時,.NET JIT(just -in-time)編譯器會把這些組件轉換為針對當前處理器架構優化過的本地代碼。
圖1. 使用Phalanger把PHP源代碼編譯成本地代碼的過程
正如Phalanger評測顯示【10】,使用Phalanger編譯的WordPress在Windows下的性能比通過FashCGI使用標准PHP解釋器的好,也比通過 WinCache使用PHP的稍好一些。然而,評測沒有測試Phalanger最新的版本,它使用DLR進行了進一步優化。