ASP.NET网页设计利用Phalanger整合PHP和.NET仓酷云
有时也搞不懂应该学那种;主要看你以后去的那个公司是使用哪种了。就像王千祥的课上说的:企业应用现在主要就三层(其实也差不多就是MVC):表示层(主要使用html写的,很简单)、业务逻辑层(主要就是应用服务器的)。最后就是数据层(其实就是学习数据库)Phalanger是一种PHP言语编译器,也是针对.NET的PHP运转时。它能够用于把PHPweb项目编译成.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的视图引擎(viewengine)。
Phalanger简介
Phalanger已存在一段工夫了。初版Phalanger是于2003年在布拉格的查尔斯年夜学作为软件项目创立的。稍后就入手下手了2.0版本的开辟,而且于2006年在CodePlex作为开源项目公布。微软撑持了这个项目一段工夫,厥后一名Phalanger开辟者到场微软,并处置静态言语运转时方面的事情。
Phalanger相干举动在2008年恢复,这多亏有了与Jadu的互助,它利用Phalanger为在PHP中开辟的CMS构建了.NET版本。从2010年入手下手,Phalanger的开辟次要由DEVSENSE供应资金撑持,它也为Phalanger供应了贸易撑持。比来公布的版本Phalanger2.1【7】,个中提拔了与尺度PHP完成的兼容性,在静态操纵的完成过程当中使用了DLR,并供应了PHP和其他.NET言语(像C#、F#和VisualBasic)之间的互操纵性。
Phalanger的组件
Phalanger包含多个部分自力的组件,能够用来开辟运转在.NET上的PHP使用程序,并利用.NET或Mono来运转它们:
[*]Phalanger编译器Phalanger会把PHP源代码编译成.NET程序集,它可使用.NETJIT(Just-in-time编译器,它会为以后平台天生当地代码)实行。编译后的PHP代码会利用Phalanger运转时和静态言语运转时,从而供应了PHP言语静态特征的高效力完成。
[*]Phalanger运转时和类库Phalanger运转时供应了对数组之类PHP特征的完成。Phalanger还包括了针对I/O、正则表达式和其他尺度PHP类库的.NET完成。
[*]当地扩大在32位Windows平台上,Phalanger能够经由过程当地的桥接程序利用一切现存的PHP4扩大。只管这会带来一些运转时负载,但这让我们不必要分外事情就能够运转某些PHP使用程序。
[*]托管的扩大经由过程包装.NET中供应的相似功效,PHP扩大也能够从头完成。这些扩大能够是由任何.NET言语编写,并供应很好的功能。Phalanger中包括多个扩大,包含SPL、JSON、SimpleXML、MySQL和MSSQL的供应程序。DEVSENSE【9】还供应了附加的扩大,像Memcached、图象和cURL等。
[*]与VisualStudio的集成Phalanger还与VisualStudio集成(比来的更新撑持VisualStudio2010)。集乐成能增加了针对PHP文件的色彩凸起显现和智能提醒功效,让我们能够调试利用Phalanger运转的PHP使用程序。
Phalanger利用案例
Phalanger在很年夜水平上与PHP5兼容,能够运转大批开源的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
编译历程如所示。正如图上所显现的,Phalanger会把PHP源代码编译成.NETIL(两头言语),那是与架构自力的初级字节码。编译后的代码会利用PHP中心库(Phalanger的一部分)和静态言语运转时(DLR)来实行尺度的PHP操纵。当使用程序启动时,.NETJIT(just-in-time)编译器会把这些组件转换为针对以后处置器架构优化过的当地代码。
.利用Phalanger把PHP源代码编译本钱地代码的历程
正如Phalanger评测显现【10】,利用Phalanger编译的WordPress在Windows下的功能比经由过程FashCGI利用尺度PHP注释器的好,也比经由过程WinCache利用PHP的稍好一些。但是,评测没有测试Phalanger最新的版本,它利用DLR举行了进一步优化。
利用ASP.NET部署PHP使用程序
Phalanger使用程序的运转体例和ASP.NET使用程序完整不异。这让它具有了主要的功能上风,出格是在Windows体系下,历程要比线程泯灭更多资本。
显现了运转PHP使用程序的分歧可选计划。
当利用尺度CGI形式时,web服务器会为每一个进进的哀求启动新的历程。在Windows下,如许做的效力不高,它还制止了共享位于共享内存中的形态,也很难举行历程中缓存(in-processcaching)。当利用FashCGI形式时,web服务器会重用历程,如许它不必要为每一个哀求启动新的历程。但是,这仍是没法共享内存中的形态,由于分歧的历程具有分歧的形态。
(点击图象能够缩小)
.利用CGI、FashCGI和Phalanger运转PHP
Phalanger的举动体例和一切ASP.NET使用一样。独自的叫做使用池(ApplicationPool)的ASP.NET历程会处置一切进进的哀求。我们乃至能够在单一历程(使用池)中设置多个PHP使用程序(像多个WordPress的自力实例)。在历程中,会有多个线程,这些线程会被重用以处置独自的哀求。在Windows下,线程要比历程更轻量级,以是这类办理计划更无效率,而且会损耗更少的内存。
关于运转在单一历程中的使用程序,我们能够举行进一步的优化,并接纳别的风趣的计划。比方,Phalanger会利用静态言语运转时(DLR)来做静态办法挪用。DLR会利用与工夫相顺应的缓存机制,因而在几回哀求以后,DLR就会“晓得”使用程序利用的是哪一个办法,并变得更快一些。这只要在单一历程中处置哀求的情形下才大概做到。
在单一历程中运转一切代码也意味着使用程序能够在内存中存储全局形态。这能够用于完成与WinCache供应的UserCache相似的功效,可是不会有跨历程通讯酿成的负载。
计划2:把WordPress与ASP.NET整合
PHP的一点上风就在于具有大批优异的开源CMS体系(WordPress、Joomla等等)、表单使用程序(phpBB及其他)和wiki(Mediawiki及其他),个中良多都经由过程了Phalanger的测试。
这些使用一般会比.NET平台下相似的程序包供应更多特征。开辟基于ASP.NET网页的公司大概会晤临以下情形:
[*]它必要向现存的ASP.NET办理计划中增加wiki、论坛大概博客,可是只要在PHP中存在符合的使用程序(比方,收费而且带有一切需要特征)。
[*]使用程序大概会在子域下运转,可是它应当共享用户数据库。别的,一旦用户登录到主页,那末他就应当同时登录到wiki、论坛和博客上。
ASP.NET使用程序可使用ASP.NET的成员办理(ASP.NETMembership),它还用来办理用户、脚色和功效的尺度机制。有了Phalanger,我们就能够修正开源的PHP项目,从而利用一样的机制。下一部分会演示利用WordPress怎样做到这一点。
为WordPress完成ASP.NET成员办理插件
假如你对代码不感乐趣,那末就能够略过这个部分,间接检察第三种情形。可是,我们不会检察手艺细节,只是对让PHP挪用.NET程序库的PHP扩大做扼要的概述。
我们可使用插件轻松地自界说在WordPress办理用户的体例。办理用户的插件必要完成一个PHP类,个中有各类成员函数。个中最值得等候的功效就是身份考证,它会取得用户名和暗码。它应当添补以后用户的信息,大概,当用户不存在的时分,就会把称号设置为NULL。
为了利用.NET中的ASP.NET成员办理来完成身份考证功效,我们可使用System.Web.Security定名空间中的功效。静态办法Membership.ValidateUser会反省暗码是不是准确,而Membership.GetUser会前往用户的基础信息。利用Phalanger,我们能够会见.NET对象,就像它是尺度的PHP对象一样,如许完成考证机制就很复杂了。代码1展现了简化后的代码。
代码1在WordPress插件中完成身份考证功效的函数
importnamespaceSystem:::Web:::Security;functionauthenticate(&$username,$password){global$errors;//Testwhetherthepasswordiscorrectif(Membership::ValidateUser($username,$password)){//Getinformationabouttheuserandfill$userarray$user=Membership::GetUser($username);$userarray=$user->UserName;$userarray=$user->Email;$userarray=$username;$userarray=$password;//Loadingofroles&profilesomittedforsimplicity//UpdateorcreatetheuserinformationinWordPressif($id=username_exists($username)){$userarray=$id;wp_update_user($userarray);}elsewp_insert_user($userarray);}else{//Reporterroriftheloginfailed$errors->add(user-rejected,Log-infailed!);$username=NULL;}}代码起首声了然主要的定名空间。这是一个非尺度的Phalanger扩大,它从援用的程序库的.NET定名空间中导进了功效(我们可使用web.config文件来援用程序库)。在未来的版本中,Phalanger会利用PHP5.3撑持的尺度定名空间,可是这项改动还没有完整完成。
残剩部分的代码看起来和尺度的PHP代码一样。但是,Membership类实践上是尺度的.NET类。Phalanger会把PHP类和.NET类一律看待,以是我们可使用尺度的语法来挪用.NET办法。函数ValidateUser和GetUser都是静态函数,以是利用::语法来挪用。GetUser的了局是一个.NET的MembershipUser对象,个中带有各类属性,包含关于用户的基础信息。我们仍旧可使用尺度的标志法来会见对象的字段(它们被完成为.NET的属性)。
正如你所看到的,我们能够很天然地在PHP中利用.NET功效。因为代码会被编译成.NET程序,以是在挪用.NET库时不会有任何负载。下一部分展现的是反偏向的整合——从.NET使用程序中挪用PHP。
计划3:从ASP.NET使用程序中挪用PHP
PHP的次要上风就在于天真性和复杂性,这使得它成为编写剧本和完成衬着HTML很棒的言语。但是,有些人发明,想要完成年夜型使用程序,那末在静态范例言语——像Java或C#——会更简单一些。利用Phalanger,我们能够同时取得两方面的上风。
这个部分所会商的计划演示了一种组合ASP.NET和PHP的体例。它基于先辈的ASP.NETMVC(模子、视图、把持器)框架,将体现层、卖力交互的层和使用程序的营业逻辑分别开来。我们可使用分歧的言语来开辟独自的组件:
[*]C#模子和把持器模子和把持器会在C#中编写。使用程序的这个部分会完成营业逻辑,一般这在静态范例言语中编写更简单一些,出格是在营业逻辑十分庞大的情形下。别的,我们还可使用像LINQ之类的手艺来存储数据,利用义务并行库(TaskParallelLibrary)利用多线程来完成高功能盘算。
[*]PHP视图使用程序的体现层会用PHP编写。在这里,PHP的复杂性和天真性会供应最年夜的优点。别的,这意味着使用程序的这个部分能够由开辟履历对照少的开辟者来编写,由于年夜多半web开辟者的web计划师都对PHP有些懂得。
另有一些情形,从C#中挪用PHP会很有效。比方,你能够在年夜型的C#项目中利用PHP作为剧本言语。这也十分有效,由于PHP是一种广为所知的言语。另外一种情形是,当在C#中利用PHP程序库的时分——正由于有了Phalanger的ducktyping机制,这才失掉了很年夜水平的简化,该机制乃至能够为挪用文档完备的PHP代码天生静态范例的C#接口。
在本文残剩的内容中,我们会侧重会商利用PHP完成ASP.NET使用程序体现层的计划。你能够在文章开端找到其他计划(像编写剧本)的参考信息。
在C#和PHP中创立模子-视图-把持器使用程序
起首让我们看下利用C#和PHP组合创立出来的复杂使用程序。使用程序的模子和把持器都是利用C#编写的,如代码2所示。在这个例子中,模子只是一个复杂的C#类,它暗示的是产物信息。在实际情形下,这个类大概会卖力从数据库载进数据,而且大概利用LINQ来完成。
代码2:示例web使用程序(C#)的模子和把持器
publicclassProduct{publicstringProductName{get;set}publicdoublePrice{get;set}}publicclassHomeController:Controller{publicActionResultIndex(){ViewData.Model=newProduct{ProductName="JohnDoe",Price=99.9};returnView();}}把持器组件是经由过程HomeController类完成的,它会承继ASP.NETMVC把持器。类中只包括一个举措,展示使用程序的索引页面。当用户会见/Home/Index(大概根URL)的时分就会触发这个举措。它会创立模子(Product类的实例)并把它传送给视图组件。
在尺度的ASP.NETMVC使用程序中,视图组件一般会利用ASPX页面大概利用带有利用C#或VisualBasic编写的代码的Razor视图来完成。Phalanger让我们可使用PHP来完成视图。代码3展现了这个例子。
代码3示例Web使用程序(PHP)的视图
<html><head><title>SampleviewwritteninPHPtitle>head><body><h1>ProductListingusingPhalangerh1>Product:$MODEL->ProductName;?><br/>Price:$MODEL->Price;?>body>html>视图会利用上面形貌的ASP.NETMVC扩大来衬着。扩大会实行代码3中所示的PHP剧本,并界说名为$MODEL的全局变量,个中会包括把持器前往的数据。在上述示例中,$MODEL是对尺度.NET类的援用。Phalanger会对.NET类和PHP对象一律看待,以是利用echo布局,我们很简单就能够显现产物的属性。
示例显现了使用程序的基础布局,可是它极其复杂,以是不会真正显现出在体现层利用PHP所能给我们带来的优点:
[*]PHP与生俱来的静态特征使得衬着任何布局的数据都很复杂。视图其实不仅限与复杂剧本,而且可使用任何现存的PHP库,包含盛行的模板引擎(templatingengines)。
[*]视图可使用PHP的include功效完成多文件的布局,如许你能够完整把持页面怎样天生。
[*]创立视图的开辟者不必要晓得任何干于.NET的常识。这意味着从PHP转型为C#的公司,仍旧撑持现存的开辟者妙技。
为了让你更好地懂得这个计划的事情体例,以下部分会申明关于PHP和C#整合的手艺细节。假如你对细节不感乐趣,那末就能够间接跳到总结部分。
透过征象看实质
这个部分所形貌的计划基于PicoMVC项目【4】,它让我们能够组合PHP和F#。为了让示例更复杂,我把代码从F#转换为C#。在PicoMVC中PHP整合的中心是一个复杂的函数,它会获得PHP剧本的文件名,并利用Phalanger运转时来运转。函数如代码4所示。
代码4从ASP.NETweb使用程序挪用PHP剧本
voidPhalanagerView(stringfileName,objectmodel,HttpContextcurrent){//InitializePHPrequestcontextandoutputstreamusing(varrc=RequestContext.Initialize(ApplicationContext.Default,current))using(varbyteOut=HttpContext.Current.Response.OutputStream)using(varuftOut=newStreamWriter(byteOut)){//CurrentcontextforevaluatingPHPscriptsvarphpContext=ScriptContext.CurrentContext;//RedirectPHPoutputtotheHTTPoutputstreamphpContext.Output=uftOut;phpContext.OutputStream=byteOut;//Declareglobal$MODELvariable(ifmodelisset)if(model!=null)Operators.SetVariable(phpContext,null,"MODEL",ClrObject.WrapDynamic(model));phpContext.Include(fileName,false);}}PhalangeriView办法会取得文件名(指向PHP剧本)、代表作为模子前往的数据的.NET对象和以后的HTTP高低文。它起首会初始化RequestContext,从而Phalanger晓得它是在处置作为HTTP哀求一部分的剧本。然后,它会确保一切PHP剧本天生的输入城市间接作为HTTP呼应发送。看成为剧本运转PHP的时分,输入能够重定向到内存流,从而以分歧的体例处置。最初,办法会声明全局变量MODEL,并利用Phalanger所供应的Include办法来实行PHP剧本。
这个例子其实不完整是从C#挪用PHP的指引,你能够在Phalanger博客的文章中找到更具体的信息。但是,它应当能够申明,利用Phalanger从C#挪用PHP剧本相称简单。这在本节会商的web编程情形下会很有效,可是它给了我们更多选择。
总结
本文扼要地先容了Phalanger——针对.NET的PHP编译器——和几种计划,我们能够在理论中利用它来办理主要成绩。比来Phalanger项目十分活泼,2.1版本中包括了良多兼容性方面的改良、利用静态言语运转时(DLR)以取得更好的功能,和与VisualStudio2010的集成。
我们看了三种能够在web开辟中利用Phalanger的计划。第一种计划是利用Phalanger在Windows情况下运转未经修正的开源PHP项目(像WordPress)。利用Phalanger编译的使用程序能够运转在ASP.NET下,这类主时机更轻量级,运转效力也更高。
在第二种计划中,我们检察了集成在.NET生态体系中的PHP使用程序。有了Phalanger扩大,我们就能够在PHP代码中间接挪用.NET程序库。比方,这能够用来整合ASP.NET使用程序和WordPress之间的用户数据库。
最初一种计划演示了一种web框架,它利用PHP作为在ASP.NETMVC中编写视图的言语。经由过程这类体例,.NET开辟者能够很简单地供应使用程序的营业功效,而PHP开辟者能够在体现层中间接利用它。
关于作者
TomasPetricek是微软的C#MVP和F#传教师。他和JonSkeet一同编写了《Real-WorldFunctionalProgramming》一书,申明了函数式的观点,并向有C#背景的开辟者申明怎样利用F#。Tomas仍是DEVSENSE的配合开创人,他对良多开源项目都做出了奉献,包含Phalanger和F#言语针对MonoDevelop的集成。
参考信息
ThePhalanger网站包括了关于项目标最新动静。
文档和先容(PhalangerWiki)
Phalanger2.1下载包含安装程序和源代码(CodePlex)
PicoMVC项目利用Phalanger作为轻量级的视图引擎(RobertPkckering的Strange博客)
PHP作为针对C#的剧本言语会商了另外一种对Phalanger的用法(Phalanger博客)
以范例平安的体例在C#中利用PHP对象(UsingPHPobjectsfromC#inatype-safeway)申明了Phalanger供应的,用于从C#会见PHP对象的平安机制。
Phalanger使用DLR的上风公布了Phalanger2.1的公布(Phalanger博客)
JaduCMS和Microsoft.NET——利用Phalanger把PHP使用程序编译到.NET的案例进修
Phalanger撑持包括了分外托管的PHP5扩大(DEVSENSE)
Phalanger评测包括分外的功能信息(Phalanger博客)
检察英文原文:IntegratingPHPwith.NETUsingPhalanger
如果英语好,口才好,加上女孩子的优势说不定有机会进去做做别的工具) 是指转换后的Servlet程序代码的行数。这给调试代码带来一定困难。所以,在排除错误时,可以采取分段排除的方法(在可能出错的代码前后输出一些字符串,用字符串是否被输出来确定代码段从哪里开始出错)。 由于JSP/Servlet都是基于Java的,所以它们也有Java语言的最大优点——平台无关性,也就是所谓的“一次编写,随处运行(WORA–WriteOnce,RunAnywhere)”。除了这个优点,JSP/Servlet的效率以及安全性也是相当惊人的。 那么,ASP.Net有哪些改进呢? 由于CGI程序每响应一个客户就会打开一个新的进程,所以,当有多个用户同时进行CGI请求的时候,服务器就会打开多个进程,这样就加重了服务器的负担,使服务器的执行效率变得越来越低下。 大哥拜托,Java在95年就出来了,微软垄断个妹啊,服务器市场微软完全是后后来者,当年都是Unix的市场,现在被WindowsServer和Linux抢下大片,包括数据库也一样。 ASP.net1.1和2.0在程序上的语法也有很大不同,现在2.0属于新出来的,不知道半年后会不会有3.0(说笑一下)。Windows2003系统自动支持ASP和ASP.net环境,不用安装任何程序。Asp.net属于编译语言。ASP的最大不同(ASP属于解释语言)。 同时也感谢博客园给我们这个平台,也感谢博客园的编辑们做成专题引来这么多高人指点。 以上是语言本身的弱点,在功能方面ASP同样存在问题,第一是功能太弱,一些底层操作只能通过组件来完成,在这点上是远远比不上PHP/JSP,其次就是缺乏完善的纠错/调试功能,这点上ASP/PHP/JSP差不多。 对于中小项目来说.net技术是完全可以胜任,但为什么现在大型公司或网站都选择php或java呢?就是因为微软不够开放,没有提供从硬件到应用服务器再到业务应用的整套解决方案。 asp.net最主要特性包括:◆编程代码更简洁◆网站可实现的功能更强大◆运行效率高◆节省服务器的动作资源
页:
[1]