使用 Phalanger 整合 PHP 和 .Net
方案2: 把 WordPress 与 ASP.NET 整合。 使用 Phalanger 编译的 PHP 代码能够调用所有 .NET 程序库。 这可以用于在 PHP 和 ASP.NET 应用程序之间共享用户数据库或者其他数据。
在单一进程中运行所有代码也意味着应用程序可以在内存中存储全局状态。 这可以用于实现与 WinCache 提供的 User Cache 类似的功能,但是不会有跨进程通信造成的负载。
PHP 的一点优势就在于拥有大量优秀的开源 CMS 系统(WordPress、Joomla 等等)、表单应用程序(phpBB 及其他)和 wiki(Mediawiki 及其他),其中很多都通过了 Phalanger 的测试。
} else {
方案3: 从 ASP.NET 应用程序中调用 PHP
Phalanger 的组件
图 2 显示了运行 PHP 应用程序的不同可选方案。
方案1: 高效运行 PHP 应用程序
$userarray['user_login'] = $user->UserName;
head>
[3] Phalanger 2.1下载包括安装程序和源代码(CodePlex)
wp_insert_user ($userarray);
}
[5] PHP 作为针对 C# 的脚本语言讨论了另一种对 Phalanger 的用法(Phalanger 博客)
[10] Phalanger 评测包含额外的性能信息(Phalanger 博客)
// Update or create the user information in WordPress
$userarray['user_email'] = $user->Email;
if ($id = username_exists ($username)) {
Phalanger 之所以能够高效地运行 PHP 应用程序,是因为以下两个原因。 首先,它会编译 PHP 源代码,而不是解释它;其次,它会把应用作为 ASP.NET 应用程序运行,那会在 Windows 下提供额外的性能优势。
Phalanger 使用案例
编译过程如图 1 所示。正如图上所显示的,Phalanger 会把 PHP 源代码编译成 .NET IL(中间语言),那是与架构独立的低级字节码。 编译后的代码会使用 PHP 核心库(Phalanger 的一部分)和动态语言运行时(DLR)来执行标准的 PHP 操作。 当应用程序启动时,.NET JIT(just-in-time)编译器会把这些组件转换为针对当前处理器架构优化过的本地代码。
本地扩展在 32 位 Windows 平台上,Phalanger 可以通过本地的桥接程序使用所有现存的 PHP 4 扩展。 尽管这会带来一些运行时负载,但这让我们不需要额外工作就可以运行某些 PHP 应用程序。
using (var uftOut = new StreamWriter (byteOut)) {
Phalanger 已经存在一段时间了。 第一版 Phalanger 是于 2003 年在布拉格的查尔斯大学作为软件项目创建的。稍后就开始了2.0版本的开发,并且于 2006 年在 CodePlex 作为开源项目发布。 微软支持了这个项目一段时间,后来一位 Phalanger 开发者加入微软,并从事动态语言运行时方面的工作。
using (var byteOut = HttpContext.Current.Response.OutputStream)
// Declare global $MODEL variable (if model is set)
示例显示了应用程序的基本结构,但是它极为简单,所以不会真正显示出在表现层使用 PHP 所能给我们带来的好处:
$username = NULL;
[2] 文档和介绍(Phalanger Wiki)
[7]Phalanger 利用 DLR 的优势宣布了 Phalanger 2.1 的发布(Phalanger 博客)
Price: $MODEL->Price; ?>
import namespace System:::Web:::Security;function authenticate (&$username,$password) {
<body>
// Redirect PHP output to the HTTP output stream
ViewData.Model = new Product { ProductName = "John Doe", Price = 99.9 };
为 WordPress 实现 ASP.NET 成员管理插件
wp_update_user ($userarray);
[4] PicoMVC 项目使用 Phalanger 作为轻量级的视图引擎(Robert Pkckering 的 Strange 博客)
这个部分所描述的方案基于 PicoMVC 项目【4】,它让我们可以组合 PHP 和F#。 为了让示例更简单,我把代码从F#转换为C#。 在 PicoMVC 中 PHP 整合的核心是一个简单的函数,它会取得 PHP 脚本的文件名,并使用 Phalanger 运行时来运行。 函数如代码 4 所示。
关于作者
// Report error if the login failed
if (model != null)
public class HomeController : Controller {
}
}
代码2: 示例 web 应用程序(C#)的模型和控制器
在本文剩余的内容中,我们会着重讨论使用 PHP 实现 ASP.NET 应用程序表现层的方案。 你可以在文章末尾找到其他方案(像编写脚本)的参考信息。
<h1>Product Listing using Phalangerh1>
当使用标准 CGI 模式时,web 服务器会为每个进入的请求启动新的进程。 在 Windows 下,这样做的效率不高,它还阻止了共享位于共享内存中的状态,也很难进行进程中缓存(in-process caching)。 当使用 FashCGI 模式时,web 服务器会重用进程,这样它不需要为每个请求启动新的进程。 然而,这还是无法共享内存中的状态,因为不同的进程拥有不同的状态。
方案1: 高效运行 PHP 应用程序。 使用 PHalanger 在 Windows 上编译的 PHP 应用程序的性能,要比通过 FastCGI 使用标准 PHP 解释器运行的高。 这使得选择 Phalanger 在 Windows 环境中部署 PHP 很具有吸引力。
Phalanger 运行时和类库Phalanger 运行时提供了对数组之类 PHP 特性的实现。 Phalanger 还包含了针对I/O、正则表达式以及其他标准 PHP 类库的 .NET 实现。
如果你对代码不感兴趣,那么就可以略过这个部分,直接查看第三种情况。 但是,我们不会查看技术细节,只是对让 PHP 调用 .NET 程序库的 PHP 扩展做简要的概述。
方案2: 把 WordPress 与 ASP.NET 整合
本文简要地介绍了 Phalanger——针对 .NET 的 PHP 编译器——以及几种方案,我们可以在实践中使用它来解决重要问题。 最近 Phalanger 项目非常活跃,2.1版本中包含了很多兼容性方面的改善、使用动态语言运行时(DLR)以获得更好的性能,以及与 Visual Studio 2010 的集成。
代码 3 示例 Web 应用程序(PHP)的视图
// Current context for evaluating PHP scripts
PhalangeriView 方法会获得文件名(指向 PHP 脚本)、代表作为模型返回的数据的 .NET 对象以及当前的 HTTP 上下文。 它首先会初始化 RequestContext,从而 Phalanger 知道它是在处理作为 HTTP 请求一部分的脚本。 然后,它会确保所有 PHP 脚本生成的输出都会直接作为 HTTP 响应发送。 当作为脚本运行 PHP 的时候,输出可以重定向到内存流,从而以不同的方式处理。 最后,方法会声明全局变量 MODEL,并使用 Phalanger 所提供的 Include 方法来执行 PHP 脚本。
为了使用 .NET 中的 ASP.NET 成员管理来实现身份验证功能,我们可以使用 System.Web.Security 命名空间中的功能。 静态方法 Membership.ValidateUser 会检查密码是否正确,而 Membership.GetUser 会返回用户的基本信息。 使用 Phalanger,我们可以访问 .NET 对象,就像它是标准的 PHP 对象一样,这样实现验证机制就很简单了。 代码 1 展示了简化后的代码。
Phalanger 应用程序的运行方式和 ASP.NET 应用程序完全相同。 这让它具有了重要的性能优势,特别是在 Windows 系统下,进程要比线程耗费更多资源。
使用 Phalanger 和 .NET 编译 PHP
Phalanger 编译器Phalanger 会把 PHP 源代码编译成 .NET 程序集,它可以使用 .NET JIT(Just-in-time 编译器,它会为当前平台生成本地代码)执行。 编译后的 PHP 代码会使用 Phalanger 运行时和动态语言运行时,从而提供了 PHP 语言动态特性的高效率实现。
Phalanger 在很大程度上与 PHP 5 兼容,可以运行大量开源的 PHP 项目,包括 WordPress 和 MediaWiki。 我们可以使用它把这些项目集成到 .NET 生态系统中,也可以开发新的项目,它会兼有 PHP 和 .NET 的优势。 在本文剩下的内容中,我们会讨论以下三种使用案例: