如何使用Phalanger創(chuàng)建組合.NET和PHP

本篇文章為大家展示了如何使用Phalanger創(chuàng)建組合.NET和PHP,內(nèi)容簡(jiǎn)明扼要并且容易理解,絕對(duì)能使你眼前一亮,通過(guò)這篇文章的詳細(xì)介紹希望你能有所收獲。

創(chuàng)新互聯(lián)公司于2013年開(kāi)始,先為貢覺(jué)等服務(wù)建站,貢覺(jué)等地企業(yè),進(jìn)行企業(yè)商務(wù)咨詢服務(wù)。為貢覺(jué)企業(yè)網(wǎng)站制作PC+手機(jī)+微官網(wǎng)三網(wǎng)同步一站式服務(wù)解決您的所有建站問(wèn)題。

Phalanger 是一種 PHP 語(yǔ)言編譯器,也是針對(duì) .NET 的 PHP 運(yùn)行時(shí)。 它可以用于把 PHP web 項(xiàng)目編譯成 .NET 字節(jié)碼,并在 Windows 中使用 IIS 或者在 Linux 上使用 Mono 和 Apache 作為 ASP.NET 應(yīng)用程序來(lái)執(zhí)行。 然而,Phalanger 不僅僅是把已經(jīng)存在的 PHP 應(yīng)用編譯到 .NET 中。

我們可以使用 Phalanger 創(chuàng)建組合 .NET 和 PHP 的解決方案,所采用的方式用標(biāo)準(zhǔn)的 PHP 解釋器是不可能做到的。 有了 Phalanger 擴(kuò)展,PHP 程序可以直接使用 .NET 類,而 .NET 程序(比方說(shuō)用 C# 編寫的)也可以動(dòng)態(tài)地調(diào)用 PHP 腳本,或者使用在 PHP 中實(shí)現(xiàn)的函數(shù)和類【6】。

我會(huì)簡(jiǎn)要地介紹 Phalanger,然后查看三種使用方案。 討論如何整合 PHP 應(yīng)用程序和 .NET;如何高效地在 Windows 上運(yùn)行 PHP 應(yīng)用程序,以及如何使用 PHP 作為 ASP.NET 的視圖引擎(view engine)。

Phalanger 簡(jiǎn)介

Phalanger 已經(jīng)存在一段時(shí)間了。 ***版 Phalanger 是于 2003 年在布拉格的查爾斯大學(xué)作為軟件項(xiàng)目創(chuàng)建的。稍后就開(kāi)始了2.0版本的開(kāi)發(fā),并且于 2006 年在 CodePlex 作為開(kāi)源項(xiàng)目發(fā)布。 微軟支持了這個(gè)項(xiàng)目一段時(shí)間,后來(lái)一位 Phalanger 開(kāi)發(fā)者加入微軟,并從事動(dòng)態(tài)語(yǔ)言運(yùn)行時(shí)方面的工作。

Phalanger 相關(guān)活動(dòng)在 2008 年恢復(fù),這多虧有了與 Jadu 的合作,它使用 Phalanger 為在 PHP 中開(kāi)發(fā)的 CMS 構(gòu)建了 .NET 版本。 從 2010 年開(kāi)始,Phalanger 的開(kāi)發(fā)主要由 DEVSENSE 提供資金支持,它也為 Phalanger 提供了商業(yè)支持。 最近發(fā)布的版本 Phalanger 2.1【7】,其中提升了與標(biāo)準(zhǔn) PHP 實(shí)現(xiàn)的兼容性,在動(dòng)態(tài)操作的實(shí)現(xiàn)過(guò)程中利用了 DLR,并提供了 PHP 和其他 .NET 語(yǔ)言(像C#、F#和 Visual Basic)之間的互操作性。

Phalanger 的組件

Phalanger 包括多個(gè)部分獨(dú)立的組件,可以用來(lái)開(kāi)發(fā)運(yùn)行在 .NET 上的 PHP 應(yīng)用程序,并使用 .NET 或 Mono 來(lái)運(yùn)行它們:

Phalanger 編譯器

Phalanger 會(huì)把 PHP 源代碼編譯成 .NET 程序集,它可以使用 .NET JIT(Just-in-time 編譯器,它會(huì)為當(dāng)前平臺(tái)生成本地代碼)執(zhí)行。 編譯后的 PHP 代碼會(huì)使用 Phalanger 運(yùn)行時(shí)和動(dòng)態(tài)語(yǔ)言運(yùn)行時(shí),從而提供了 PHP 語(yǔ)言動(dòng)態(tài)特性的高效率實(shí)現(xiàn)。

  • Phalanger 運(yùn)行時(shí)和類庫(kù)
    Phalanger提供了對(duì)數(shù)組之類 PHP 特性的實(shí)現(xiàn)。 Phalanger 還包含了針對(duì)I/O、正則表達(dá)式以及其他標(biāo)準(zhǔn) PHP 類庫(kù)的 .NET 實(shí)現(xiàn)。

  • 本地?cái)U(kuò)展
    在 32 位 Windows 平臺(tái)上,Phalanger 可以通過(guò)本地的橋接程序使用所有現(xiàn)存的 PHP 4 擴(kuò)展。 盡管這會(huì)帶來(lái)一些運(yùn)行時(shí)負(fù)載,但這讓我們不需要額外工作就可以運(yùn)行某些 PHP 應(yīng)用程序。

  • 托管的擴(kuò)展
    通過(guò)包裝 .NET 中提供的類似功能,PHP 擴(kuò)展也可以重新實(shí)現(xiàn)。 這些擴(kuò)展可以是由任何 .NET 語(yǔ)言編寫,并提供很好的性能。 Phalanger 中包含多個(gè)擴(kuò)展,包括 SPL、JSON、SimpleXML、MySQL 和 MS SQL 的提供程序。 DEVSENSE【9】還提供了附加的擴(kuò)展,像 Memcached、圖像和 cURL 等。

  • 與 Visual Studio 的集成
    Phalanger 還與 Visual Studio 集成(最近的更新支持 Visual Studio 2010)。 集成功能添加了針對(duì) PHP 文件的顏色突出顯示和智能提示功能,讓我們可以調(diào)試使用 Phalanger 運(yùn)行的 PHP 應(yīng)用程序。

Phalanger 使用案例

Phalanger 在很大程度上與 PHP 5 兼容,可以運(yùn)行大量開(kāi)源的 PHP 項(xiàng)目,包括 WordPress 和 MediaWiki。 我們可以使用它把這些項(xiàng)目集成到 .NET 生態(tài)系統(tǒng)中,也可以開(kāi)發(fā)新的項(xiàng)目,它會(huì)兼有 PHP 和 .NET 的優(yōu)勢(shì)。 在本文剩下的內(nèi)容中,我們會(huì)討論以下三種使用案例:

  • 方案1: 高效運(yùn)行 PHP 應(yīng)用程序。 使用 PHalanger 在 Windows 上編譯的 PHP 應(yīng)用程序的性能,要比通過(guò) FastCGI 使用標(biāo)準(zhǔn) PHP 解釋器運(yùn)行的高。 這使得選擇 Phalanger 在 Windows 環(huán)境中部署 PHP 很具有吸引力。

  • 方案2: 把 WordPress 與 ASP.NET 整合。 使用 Phalanger 編譯的 PHP 代碼能夠調(diào)用所有 .NET 程序庫(kù)。 這可以用于在 PHP 和 ASP.NET 應(yīng)用程序之間共享用戶數(shù)據(jù)庫(kù)或者其他數(shù)據(jù)。

  • 方案3: 從 ASP.NET 應(yīng)用程序中調(diào)用 PHP。 PHP 的靈活性對(duì)于編寫腳本或者編寫 web 應(yīng)用程序的表現(xiàn)層非常有用。 有了 Phalanger,我們就可以在 .NET 中開(kāi)發(fā)應(yīng)用程序,并使用 PHP 作為腳本語(yǔ)言或者視圖引擎。

以下三個(gè)部分會(huì)詳細(xì)討論各種方案。 我們首先會(huì)給出概覽,然后查看一些技術(shù)細(xì)節(jié),它會(huì)說(shuō)明 Phalanger 中讓你感興趣的內(nèi)容。

方案1: 高效運(yùn)行 PHP 應(yīng)用程序

Phalanger 之所以能夠高效地運(yùn)行 PHP 應(yīng)用程序,是因?yàn)橐韵聝蓚€(gè)原因。 首先,它會(huì)編譯 PHP 源代碼,而不是解釋它;其次,它會(huì)把應(yīng)用作為 ASP.NET 應(yīng)用程序運(yùn)行,那會(huì)在 Windows 下提供額外的性能優(yōu)勢(shì)。

使用 Phalanger 和 .NET 編譯 PHP

編譯過(guò)程如圖 1 所示。正如圖上所顯示的,Phalanger 會(huì)把 PHP 源代碼編譯成 .NET IL(中間語(yǔ)言),那是與架構(gòu)獨(dú)立的低級(jí)字節(jié)碼。 編譯后的代碼會(huì)使用 PHP 核心庫(kù)(Phalanger 的一部分)和動(dòng)態(tài)語(yǔ)言運(yùn)行時(shí)(DLR)來(lái)執(zhí)行標(biāo)準(zhǔn)的 PHP 操作。 當(dāng)應(yīng)用程序啟動(dòng)時(shí),.NET JIT(just-in-time)編譯器會(huì)把這些組件轉(zhuǎn)換為針對(duì)當(dāng)前處理器架構(gòu)優(yōu)化過(guò)的本地代碼。

如何使用Phalanger創(chuàng)建組合.NET和PHP

圖1. 使用 Phalanger 把 PHP 源代碼編譯成本地代碼的過(guò)程

正如 Phalanger 評(píng)測(cè)顯示【10】,使用 Phalanger 編譯的 WordPress 在 Windows 下的性能比通過(guò) FashCGI 使用標(biāo)準(zhǔn) PHP 解釋器的好,也比通過(guò) WinCache 使用 PHP 的稍好一些。 然而,評(píng)測(cè)沒(méi)有測(cè)試 Phalanger ***的版本,它使用 DLR 進(jìn)行了進(jìn)一步優(yōu)化。

使用 ASP.NET 部署 PHP 應(yīng)用程序

Phalanger 應(yīng)用程序的運(yùn)行方式和 ASP.NET 應(yīng)用程序完全相同。 這讓它具有了重要的性能優(yōu)勢(shì),特別是在 Windows 系統(tǒng)下,進(jìn)程要比線程耗費(fèi)更多資源。

圖 2 顯示了運(yùn)行 PHP 應(yīng)用程序的不同可選方案。

當(dāng)使用標(biāo)準(zhǔn) CGI 模式時(shí),web 服務(wù)器會(huì)為每個(gè)進(jìn)入的請(qǐng)求啟動(dòng)新的進(jìn)程。 在 Windows 下,這樣做的效率不高,它還阻止了共享位于共享內(nèi)存中的狀態(tài),也很難進(jìn)行進(jìn)程中緩存(in-process caching)。 當(dāng)使用 FashCGI 模式時(shí),web 服務(wù)器會(huì)重用進(jìn)程,這樣它不需要為每個(gè)請(qǐng)求啟動(dòng)新的進(jìn)程。 然而,這還是無(wú)法共享內(nèi)存中的狀態(tài),因?yàn)椴煌倪M(jìn)程擁有不同的狀態(tài)。

如何使用Phalanger創(chuàng)建組合.NET和PHP

圖2. 使用 CGI、FashCGI 和 Phalanger 運(yùn)行 PHP

Phalanger 的行為方式和所有 ASP.NET 應(yīng)用一樣。 單獨(dú)的叫做應(yīng)用池(Application Pool)的 ASP.NET 進(jìn)程會(huì)處理所有進(jìn)入的請(qǐng)求。 我們甚至可以在單一進(jìn)程(應(yīng)用池)中配置多個(gè) PHP 應(yīng)用程序(像多個(gè) WordPress 的獨(dú)立實(shí)例)。 在進(jìn)程中,會(huì)有多個(gè)線程,這些線程會(huì)被重用以處理單獨(dú)的請(qǐng)求。 在 Windows 下,線程要比過(guò)程更輕量級(jí),所以這種解決方案更有效率,并且會(huì)消耗更少的內(nèi)存。

對(duì)于運(yùn)行在單一進(jìn)程中的應(yīng)用程序,我們可以進(jìn)行進(jìn)一步的優(yōu)化,并采用其它有趣的方案。 例如,Phalanger 會(huì)使用動(dòng)態(tài)語(yǔ)言運(yùn)行時(shí)(DLR)來(lái)做動(dòng)態(tài)方法調(diào)用。 DLR 會(huì)使用與時(shí)間相適應(yīng)的緩存機(jī)制,因此在幾次請(qǐng)求之后,DLR 就會(huì)“知道”應(yīng)用程序使用的是哪個(gè)方法,并變得更快一些。 這只有在單一進(jìn)程中處理請(qǐng)求的情況下才可能做到。

在單一進(jìn)程中運(yùn)行所有代碼也意味著應(yīng)用程序可以在內(nèi)存中存儲(chǔ)全局狀態(tài)。 這可以用于實(shí)現(xiàn)與 WinCache 提供的 User Cache 類似的功能,但是不會(huì)有跨進(jìn)程通信造成的負(fù)載。

方案2: 把 WordPress 與 ASP.NET 整合

PHP 的一點(diǎn)優(yōu)勢(shì)就在于擁有大量?jī)?yōu)秀的開(kāi)源 CMS 系統(tǒng)(WordPress、Joomla 等等)、表單應(yīng)用程序(phpBB 及其他)和 wiki(Mediawiki 及其他),其中很多都通過(guò)了 Phalanger 的測(cè)試。

這些應(yīng)用通常會(huì)比 .NET 平臺(tái)下類似的程序包提供更多特性。 開(kāi)發(fā)基于 ASP.NET 網(wǎng)頁(yè)的公司可能會(huì)面臨以下情況:

  • 它需要向現(xiàn)存的 ASP.NET 解決方案中添加 wiki、論壇或者博客,但是只有在 PHP 中存在合適的應(yīng)用程序(例如,免費(fèi)并且?guī)в兴斜匾匦裕?/p>

  • 應(yīng)用程序可能會(huì)在子域下運(yùn)行,但是它應(yīng)該共享用戶數(shù)據(jù)庫(kù)。 此外,一旦用戶登錄到主頁(yè),那么他就應(yīng)該同時(shí)登錄到 wiki、論壇和博客上。

ASP.NET 應(yīng)用程序可以使用 ASP.NET 的成員管理(ASP.NET Membership),它還用來(lái)管理用戶、角色和功能的標(biāo)準(zhǔn)機(jī)制。 有了 Phalanger,我們就可以修改開(kāi)源的 PHP 項(xiàng)目,從而使用同樣的機(jī)制。 下一部分會(huì)演示使用 WordPress 如何做到這一點(diǎn)。

為 WordPress 實(shí)現(xiàn) ASP.NET 成員管理插件

如果你對(duì)代碼不感興趣,那么就可以略過(guò)這個(gè)部分,直接查看第三種情況。 但是,我們不會(huì)查看技術(shù)細(xì)節(jié),只是對(duì)讓 PHP 調(diào)用 .NET 程序庫(kù)的 PHP 擴(kuò)展做簡(jiǎn)要的概述。

我們可以使用插件輕松地自定義在 WordPress 管理用戶的方式。 管理用戶的插件需要實(shí)現(xiàn)一個(gè) PHP 類,其中有各種成員函數(shù)。 其中最值得期待的功能就是身份驗(yàn)證,它會(huì)獲得用戶名和密碼。 它應(yīng)該填充當(dāng)前用戶的信息,或者,當(dāng)用戶不存在的時(shí)候,就會(huì)把名稱設(shè)置為 NULL。

為了使用 .NET 中的 ASP.NET 成員管理來(lái)實(shí)現(xiàn)身份驗(yàn)證功能,我們可以使用 System.Web.Security 命名空間中的功能。 靜態(tài)方法 Membership.ValidateUser 會(huì)檢查密碼是否正確,而 Membership.GetUser 會(huì)返回用戶的基本信息。 使用 Phalanger,我們可以訪問(wèn) .NET 對(duì)象,就像它是標(biāo)準(zhǔn)的 PHP 對(duì)象一樣,這樣實(shí)現(xiàn)驗(yàn)證機(jī)制就很簡(jiǎn)單了。 代碼 1 展示了簡(jiǎn)化后的代碼。

代碼 1 在 WordPress 插件中實(shí)現(xiàn)身份驗(yàn)證功能的函數(shù)

import namespace System:::Web:::Security;  function authenticate (&$username,$password) {global $errors;  // Test whether the password is correct  if (Membership::ValidateUser ($username,$password)) {  // Get information about the user and fill $userarray  $user = Membership::GetUser ($username);  $userarray['user_login'] = $user->UserName;  $userarray['user_email'] = $user->Email;  $userarray['display_name'] = $username;  $userarray['user_pass'] = $password;  // Loading of roles & profiles omitted for simplicity  // Update or create the user information in WordPress  if ($id = username_exists ($username)) {  $userarray['ID'] = $id;  wp_update_user ($userarray);  }  else wp_insert_user ($userarray);  } else {  // Report error if the login failed  $errors->add ('user-rejected', 'Log-in failed!');  $username = NULL;}}

代碼首先聲明了重要的命名空間。 這是一個(gè)非標(biāo)準(zhǔn)的 Phalanger 擴(kuò)展,它從引用的程序庫(kù)的 .NET 命名空間中導(dǎo)入了功能(我們可以使用 web.config 文件來(lái)引用程序庫(kù))。 在將來(lái)的版本中,Phalanger 會(huì)使用 PHP 5.3 支持的標(biāo)準(zhǔn)命名空間,但是這項(xiàng)改變還沒(méi)有完全實(shí)現(xiàn)。

剩余部分的代碼看起來(lái)和標(biāo)準(zhǔn)的 PHP 代碼一樣。 然而,Membership 類實(shí)際上是標(biāo)準(zhǔn)的 .NET 類。 Phalanger 會(huì)把 PHP 類和 .NET 類同等對(duì)待,所以我們可以使用標(biāo)準(zhǔn)的語(yǔ)法來(lái)調(diào)用 .NET 方法。 函數(shù) ValidateUser 和 GetUser 都是靜態(tài)函數(shù),所以使用::語(yǔ)法來(lái)調(diào)用。 GetUser 的結(jié)果是一個(gè) .NET 的 MembershipUser 對(duì)象, 其中帶有各種屬性,包括關(guān)于用戶的基本信息。 我們?nèi)匀豢梢允褂脴?biāo)準(zhǔn)的標(biāo)記法來(lái)訪問(wèn)對(duì)象的字段(它們被實(shí)現(xiàn)為 .NET 的屬性)。

正如你所看到的,我們可以很自然地在 PHP 中使用 .NET 功能。 由于代碼會(huì)被編譯成 .NET 程序,所以在調(diào)用 .NET 庫(kù)時(shí)不會(huì)有任何負(fù)載。 下一部分展示的是反方向的整合 —— 從 .NET 應(yīng)用程序中調(diào)用 PHP。

方案3: 從 ASP.NET 應(yīng)用程序中調(diào)用 PHP

PHP 的主要優(yōu)勢(shì)就在于靈活性和簡(jiǎn)單性,這使得它成為編寫腳本和實(shí)現(xiàn)渲染 HTML 很棒的語(yǔ)言。 然而,有些人發(fā)現(xiàn),想要實(shí)現(xiàn)大型應(yīng)用程序,那么用靜態(tài)類型語(yǔ)言 —— 像 Java 或C# —— 會(huì)更容易一些。 使用 Phalanger,我們可以同時(shí)獲得兩方面的優(yōu)勢(shì)。

這個(gè)部分所討論的方案演示了一種組合 ASP.NET 和 PHP 的方式。 它基于先進(jìn)的 ASP.NET MVC(模型、視圖、控制器)框架,將表現(xiàn)層、負(fù)責(zé)交互的層和應(yīng)用程序的業(yè)務(wù)邏輯分離開(kāi)來(lái)。 我們可以使用不同的語(yǔ)言來(lái)開(kāi)發(fā)單獨(dú)的組件:

  • C#模型和控制器
    模型和控制器會(huì)在 C# 中編寫。 應(yīng)用程序的這個(gè)部分會(huì)實(shí)現(xiàn)業(yè)務(wù)邏輯,通常這在靜態(tài)類型語(yǔ)言中編寫更容易一些,特別是在業(yè)務(wù)邏輯非常復(fù)雜的情況下。 此外,我們還可以使用像 LINQ 之類的技術(shù)來(lái)存儲(chǔ)數(shù)據(jù),使用任務(wù)并行庫(kù)(Task Parallel Library)使用多線程來(lái)實(shí)現(xiàn)高性能計(jì)算。

  • PHP 視圖
    應(yīng)用程序的表現(xiàn)層會(huì)用 PHP 編寫。 在這里,PHP 的簡(jiǎn)單性和靈活性會(huì)提供***的好處。 此外,這意味著應(yīng)用程序的這個(gè)部分可以由開(kāi)發(fā)經(jīng)驗(yàn)比較少的開(kāi)發(fā)者來(lái)編寫,因?yàn)榇蠖鄶?shù) web 開(kāi)發(fā)者的 web 設(shè)計(jì)師都對(duì) PHP 有些了解。

還有一些情況,從 C# 中調(diào)用 PHP 會(huì)很有用。 例如,你可以在大型的 C# 項(xiàng)目中使用 PHP 作為腳本語(yǔ)言。 這也非常有用,因?yàn)?PHP 是一種廣為所知的語(yǔ)言。 另一種情況是,當(dāng)在 C# 中使用 PHP 程序庫(kù)的時(shí)候 —— 正因?yàn)橛辛?Phalanger 的 duck typing 機(jī)制,這才得到了很大程度的簡(jiǎn)化,該機(jī)制甚至可以為調(diào)用文檔齊備的 PHP 代碼生成靜態(tài)類型的 C# 接口。

在本文剩余的內(nèi)容中,我們會(huì)著重討論使用 PHP 實(shí)現(xiàn) ASP.NET 應(yīng)用程序表現(xiàn)層的方案。 你可以在文章末尾找到其他方案(像編寫腳本)的參考信息。

在 C# 和 PHP 中創(chuàng)建模型-視圖-控制器應(yīng)用程序

首先讓我們看下使用 C# 和 PHP 組合創(chuàng)建出來(lái)的簡(jiǎn)單應(yīng)用程序。 應(yīng)用程序的模型和控制器都是使用 C# 編寫的,如代碼 2 所示。在這個(gè)例子中,模型只是一個(gè)簡(jiǎn)單的 C# 類,它表示的是產(chǎn)品信息。 在現(xiàn)實(shí)情況下,這個(gè)類可能會(huì)負(fù)責(zé)從數(shù)據(jù)庫(kù)載入數(shù)據(jù),并且可能使用 LINQ 來(lái)實(shí)現(xiàn)。

代碼2: 示例 web 應(yīng)用程序(C#)的模型和控制器

public class Product {  public string ProductName { get; set }  public double Price { get; set }  }   public class HomeController : Controller {  public ActionResult Index () {  ViewData.Model = new Product { ProductName = "John Doe", Price = 99.9 };  return View ();  }  }

控制器組件是通過(guò) HomeController 類實(shí)現(xiàn)的,它會(huì)繼承 ASP.NET MVC 控制器。 類中只包含一個(gè)動(dòng)作,展現(xiàn)應(yīng)用程序的索引頁(yè)面。 當(dāng)用戶訪問(wèn)/Home/Index(或者根 URL)的時(shí)候就會(huì)觸發(fā)這個(gè)動(dòng)作。 它會(huì)創(chuàng)建模型(Product 類的實(shí)例)并把它傳遞給視圖組件。

在標(biāo)準(zhǔn)的 ASP.NET MVC 應(yīng)用程序中,視圖組件通常會(huì)使用 ASPX 頁(yè)面或者使用帶有使用 C# 或 Visual Basic 編寫的代碼的 Razor 視圖來(lái)實(shí)現(xiàn)。 Phalanger 讓我們可以使用 PHP 來(lái)實(shí)現(xiàn)視圖。 代碼 3 展示了這個(gè)例子。

代碼 3 示例 Web 應(yīng)用程序(PHP)的視圖

<html><head>    <title>Sample view written in PHP</title>  </head>  <body>    <h2>Product Listing using Phalanger</h2>    Product: <? echo $MODEL->ProductName; ?><br />    Price: <? echo $MODEL->Price; ?>  </body></html>

視圖會(huì)使用下面描述的 ASP.NET MVC 擴(kuò)展來(lái)渲染。 擴(kuò)展會(huì)執(zhí)行代碼 3 中所示的 PHP 腳本,并定義名為$MODEL 的全局變量,其中會(huì)包含控制器返回的數(shù)據(jù)。 在上述示例中,$MODEL 是對(duì)標(biāo)準(zhǔn) .NET 類的引用。 Phalanger 會(huì)對(duì) .NET 類和 PHP 對(duì)象同等對(duì)待,所以使用 echo 結(jié)構(gòu),我們很容易就可以顯示產(chǎn)品的屬性。

示例顯示了應(yīng)用程序的基本結(jié)構(gòu),但是它極為簡(jiǎn)單,所以不會(huì)真正顯示出在表現(xiàn)層使用 PHP 所能給我們帶來(lái)的好處:

  • PHP 與生俱來(lái)的動(dòng)態(tài)特性使得渲染任何結(jié)構(gòu)的數(shù)據(jù)都很簡(jiǎn)單。 視圖并不僅限與簡(jiǎn)單腳本,并且可以使用任何現(xiàn)存的 PHP 庫(kù),包括流行的模板引擎(templating engines)。

  • 視圖可以使用 PHP 的 include 功能實(shí)現(xiàn)多文件的結(jié)構(gòu),這樣你可以完全控制頁(yè)面如何生成。

  • 創(chuàng)建視圖的開(kāi)發(fā)者不需要知道任何關(guān)于 .NET 的知識(shí)。 這意味著從 PHP 轉(zhuǎn)型為 C# 的公司,仍然支持現(xiàn)存的開(kāi)發(fā)者技能。

為了讓你更好地了解這個(gè)方案的工作方式,以下部分會(huì)說(shuō)明關(guān)于 PHP 和 C# 整合的技術(shù)細(xì)節(jié)。 如果你對(duì)細(xì)節(jié)不感興趣,那么就可以直接跳到總結(jié)部分。

透過(guò)現(xiàn)象看本質(zhì)

這個(gè)部分所描述的方案基于 PicoMVC 項(xiàng)目【4】,它讓我們可以組合 PHP 和 F#。 為了讓示例更簡(jiǎn)單,我把代碼從F#轉(zhuǎn)換為C#。 在 PicoMVC 中 PHP 整合的核心是一個(gè)簡(jiǎn)單的函數(shù),它會(huì)取得 PHP 腳本的文件名,并使用 Phalanger 運(yùn)行時(shí)來(lái)運(yùn)行。 函數(shù)如代碼 4 所示。

代碼 4 從 ASP.NET web 應(yīng)用程序調(diào)用 PHP 腳本

void PhalanagerView (string fileName, object model, HttpContext current) {    // Initialize PHP request context and output stream   using(var rc = RequestContext.Initialize (ApplicationContext.Default, current))    using(var byteOut = HttpContext.Current.Response.OutputStream)    using(var uftOut = new StreamWriter (byteOut)) {  // Current context for evaluating PHP scripts  var phpContext = ScriptContext.CurrentContext;  // Redirect PHP output to the HTTP output stream  phpContext.Output = uftOut;  phpContext.OutputStream = byteOut;   // Declare global $MODEL variable (if model is set)  if (model != null)  Operators.SetVariable (phpContext, null, "MODEL",  ClrObject.WrapDynamic (model));   phpContext.Include (fileName, false);  }  }

PhalangeriView 方法會(huì)獲得文件名(指向 PHP 腳本)、代表作為模型返回的數(shù)據(jù)的 .NET 對(duì)象以及當(dāng)前的 HTTP 上下文。 它首先會(huì)初始化 RequestContext,從而 Phalanger 知道它是在處理作為 HTTP 請(qǐng)求一部分的腳本。 然后,它會(huì)確保所有 PHP 腳本生成的輸出都會(huì)直接作為 HTTP 響應(yīng)發(fā)送。 當(dāng)作為腳本運(yùn)行 PHP 的時(shí)候,輸出可以重定向到內(nèi)存流,從而以不同的方式處理。 ***,方法會(huì)聲明全局變量 MODEL,并使用 Phalanger 所提供的 Include 方法來(lái)執(zhí)行 PHP 腳本。

這個(gè)例子并不完全是從 C# 調(diào)用 PHP 的指引,你可以在 Phalanger 博客的文章中找到更詳細(xì)的信息。 然而,它應(yīng)該可以說(shuō)明,使用 Phalanger 從 C# 調(diào)用 PHP 腳本相當(dāng)容易。 這在本節(jié)討論的 web 編程情況下會(huì)很有用,但是它給了我們更多選擇。

簡(jiǎn)要地介紹了 Phalanger &mdash;&mdash; 針對(duì) .NET 的 PHP 編譯器 &mdash;&mdash; 以及幾種方案,我們可以在實(shí)踐中使用它來(lái)解決重要問(wèn)題。 最近 Phalanger 項(xiàng)目非?;钴S,2.1 版本中包含了很多兼容性方面的改善、使用動(dòng)態(tài)語(yǔ)言運(yùn)行時(shí)(DLR)以獲得更好的性能,以及與 Visual Studio 2010 的集成。

我們看了三種可以在 web 開(kāi)發(fā)中使用 Phalanger 的方案。 ***種方案是使用 Phalanger 在 Windows 環(huán)境下運(yùn)行未經(jīng)修改的開(kāi)源 PHP 項(xiàng)目(像 WordPress)。 使用 Phalanger 編譯的應(yīng)用程序可以運(yùn)行在 ASP.NET 下,這種主機(jī)會(huì)更輕量級(jí),運(yùn)行效率也更高。

在第二種方案中,我們查看了集成在 .NET 生態(tài)系統(tǒng)中的 PHP 應(yīng)用程序。 有了 Phalanger 擴(kuò)展,我們就可以在 PHP 代碼中直接調(diào)用 .NET 程序庫(kù)。 例如,這可以用來(lái)整合 ASP.NET 應(yīng)用程序和 WordPress 之間的用戶數(shù)據(jù)庫(kù)。

***一種方案演示了一種 web 框架,它使用 PHP 作為在 ASP.NET MVC 中編寫視圖的語(yǔ)言。 通過(guò)這種方式,.NET 開(kāi)發(fā)者可以很容易地提供應(yīng)用程序的業(yè)務(wù)功能,而 PHP 開(kāi)發(fā)者可以在表現(xiàn)層中直接使用它。

上述內(nèi)容就是如何使用Phalanger創(chuàng)建組合.NET和PHP,你們學(xué)到知識(shí)或技能了嗎?如果還想學(xué)到更多技能或者豐富自己的知識(shí)儲(chǔ)備,歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道。

網(wǎng)頁(yè)題目:如何使用Phalanger創(chuàng)建組合.NET和PHP
文章網(wǎng)址:http://bm7419.com/article18/gejsdp.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供企業(yè)網(wǎng)站制作、網(wǎng)站營(yíng)銷、搜索引擎優(yōu)化、營(yíng)銷型網(wǎng)站建設(shè)、網(wǎng)站建設(shè)、網(wǎng)站設(shè)計(jì)公司

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)

成都app開(kāi)發(fā)公司