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)编译器会把这些组件转换为针对当前处理器架构优化过的本地代码。498)this.width=498;'' onmousewheel = ''javascript:return big(this)'' alt="" src="/uploadfile/201301/2/A819585744.jpg" />图1. 使用 Phalanger 把 PHP 源代码编译成本地代码的过程正如 Phalanger 评测显示【10】,使用 Phalanger 编译的 WordPress 在 Windows 下的性能比通过 FashCGI 使用标准 PHP 解释器的好,也比通过 WinCache 使用 PHP 的稍好一些。 然而,评测没有测试 Phalanger 最新的版本,它使用 DLR 进行了进一步优化。使用 ASP.NET 部署 PHP 应用程序Phalanger 应用程序的运行方式和 ASP.NET 应用程序完全相同。 这让它具有了重要的性能优势,特别是在 Windows 系统下,进程要比线程耗费更多资源。图 2 显示了运行 PHP 应用程序的不同可选方案。当使用标准 CGI 模式时,web 服务器会为每个进入的请求启动新的进程。 在 Windows 下,这样做的效率不高,它还阻止了共享位于共享内存中的状态,也很难进行进程中缓存(in-process caching)。 当使用 FashCGI 模式时,web 服务器会重用进程,这样它不需要为每个请求启动新的进程。 然而,这还是无法共享内存中的状态,因为不同的进程拥有不同的状态。498)this.width=498;'' onmousewheel = ''javascript:return big(this)'' alt="" src="/uploadfile/201301/2/A619586482.jpg" />图2. 使用 CGI、FashCGI 和 Phalanger 运行 PHPPhalanger 的行为方式和所有 ASP.NET 应用一样。 单独的叫做应用池(Application Pool)的 ASP.NET 进程会处理所有进入的请求。 我们甚至可以在单一进程(应用池)中配置多个 PHP 应用程序(像多个 WordPress 的独立实例)。 在进程中,会有多个线程,这些线程会被重用以处理单独的请求。 在 Windows 下,线程要比过程更轻量级,所以这种解决方案更有效率,并且会消耗更少的内存。对于运行在单一进程中的应用程序,我们可以进行进一步的优化,并采用其它有趣的方案。 例如,Phalanger 会使用动态语言运行时(DLR)来做动态方法调用。 DLR 会使用与时间相适应的缓存机制,因此在几次请求之后,DLR 就会“知道”应用程序使用的是哪个方法,并变得更快一些。 这只有在单一进程中处理请求的情况下才可能做到。在单一进程中运行所有代码也意味着应用程序可以在内存中存储全局状态。 这可以用于实现与 WinCache 提供的 User Cache 类似的功能,但是不会有跨进程通信造成的负载。方案2: 把 W