-
[web开辟] php上风 - PHP与ASP.NET的斗劲
添加时间:2013-6-26 点击量:php 上风 - PHP与ASP.NET的斗劲
如今当提到 Web 开辟时,您有很多选择。这些办法中很多都涉及到预处理惩罚 — 即,哄骗特定的标识表记标帜将代码嵌入到 HTML 页面中,这些标识表记标帜告诉预处理惩罚器,它们包含代码,并且应对它们作出处理惩罚。与 CGI 很是类似,这些代码在办事器上运行,并返回一些内容,这些内容发挥解析为发还给浏览器的成果 HTML 页面的项目组外观。开放源代码脚本说话 PHP 和 Microsoft 的 ASP.NET 框架中的说话都属于这种类型;JavaServer Pages (JSP) 和 Perl/Mason 也以这种体式格式运行。
在本文中,我将重点讲述 PHP — Oracle 已选择归并到其产品中的技巧 — 和 ASP.NET。我将概述两者的各类上风和弱点,并侧重评论辩论那些将帮助您决意开辟项目应选择哪种技巧的身分。有很多身分须要推敲,不合的项目可能诉诸于不合的技巧。总之,您将看到在价格、速度和效力、安然性、跨平台支撑等方面的逐项斗劲,以及开放源代码解决规划的上风。
什么是 ASP.NET?
ASP 新的版本 ASP.NET 并不完全与 ASP 早期的版本后向兼容,因为该软件进行了完全重写。早期的 ASP 技巧实际上与 PHP 的共同之处比与 ASP.NET 的共同之处多得多,ASP.NET 是用于构建 Web 应用法度的一个完全的框架。这个模型的首要特点之一是选择编程说话的灵活性。ASP.NET 可以应用脚本说话(如 VBScript、JScript、Perlscript 和 Python)以及编译说话(如 VB、C#、C、Cobol、Smalltalk 和 Lisp)。新框架应用通用说话运行景象 (CLR);先将您说话的源代码编译成 Microsoft 中心说话代码,然后 CLR 履行这些代码。
这个框架还供给真正的面向对象编程 (OOP),并支撑真正的持续、多态和封装。.NET 类库按照特定的任务(例如,应用 XML 或图像处理惩罚)组织成可持续的类。
除了编程说话和办法之外,数据库接见也是要侧重关怀的一个身分。当您用 ASP.NET 编程时,可以用 ODBC 来集成数据库;ODBC 供给了一组一致的调用函数来接见您的目标数据库。
上风和弱点
ASP.NET 的上风很明显在于它简洁的设计和实验。这是面向对象的编程人员的胡想:说话灵活,并支撑错杂的面向对象特点。在这种意义下,它真正可以或许与编程人员现有的技能进行互操纵。
ASP.NET 的另一个上风是其开辟景象。例如,开辟人员可以应用 WebMatrix(一个社区支撑的对象)、Visual Studio .NET 或各类 Borland 对象(如 Delphi 和 C++ Builder)。例如,Visual Studio 容许设置断点、跟踪代码段和查看调用客栈。总而言之,它是一个错杂的调试景象。很多其他第三方的 ASP.NET IDE 解决规划也将必定呈现。
但您获得了强健性,就将以丧失效力为价格。ASP.NET 在内存应用和履行时候方面花费很是大,这大项目组归因于较长的代码路径。对基于 Web 的应用法度,这些局限可能是一个严重的题目,因为在 Web 上,您的应用法度可能扩大为每秒成千上万的用户。内存应用率还可能成为 Web 办事器上的一个题目。
什么是 PHP?
PHP 是基于预处理惩罚 HTML 页面模型的一种脚本说话。当 Web 办事器中的 PHP 预处理惩罚器发明像下面如许的 PHP 说话标识表记标帜时,将调用 PHP 引擎来履行该代码:
<?php
some code here
?>
任何应用过号令式编程说话的编程人员都邑对 PHP 很是熟悉;您会发明它与 Perl、C 和 Java 在语法上的类似处。严格来讲,Java 是一种号令式编程说话,但它也哄骗了面向对象的布局和概念。PHP 在合适的时辰鉴戒了这种布局,但它不是一种纯粹的 OOP 说话。
在上方对 ASP.NET 的评论辩论中,我提到了 ODBC 驱动法度,以及在推敲数据库抽象的景象下如何构建应用法度。在 PHP 中,您也可以应用 ODBC 与数据库对话,是以您已经有了一系列支撑的数据库可供选择。也有 MySQL、Oracle 和 Postgres 的原生驱动法度。此外,若是要应用 Oracle,则有一个特别的 OCI8 库将供给对 Oracle 更多接见功能,从而容许您应用诸如 LOB、BLOB、CLOB 和 BFILE 之类的特点。
这时您可能会问“为什么与数据库相干的材料库被称为 PHP 的特点?”数据库抽象或自力性是您在设法构建应用多种数据库或须要在数据库间移植(例如,从开辟到投产时的移植)的应用法度时所要推敲的一个身分。而这些确切是应当关怀和推敲的。
但正如 Tom Kyte 在他的新书 — Effective Oracle by Design (Oracle 出版社) — 中指出的那样,数据库相干性将成为您真正的目标,因为这将使您在该技巧中的投资有效。若是您对 Oracle 进行一般的接见 — 无论经由过程 ODBC 或 Perl 的 DBI 库,那么您将无法应用其他数据库所不具有的特点。此外,优化查询在各个数据库中各不雷同。
Zend Technologies 是一家贸易软件公司,它对 PHP 作出了重大供献。它创建了一个称为 Zend Studio 的贸易开辟景象,这个景象包含了一个错杂的调试器、一个监测器和其他特点。该公司还构建了免费的 Zend Optimizer,它与 Zend Encoder 连络应用来编译 PHP 代码,以提拔机能。还有其他贸易产品,如 Zend Performance Suite,它可以缓存预编译的 PHP 页面,从而进一步明显提拔总体机能。
上风和弱点
到测试版 4 为止,PHP 5 仍然有一些毛病,包含缺乏异常和基于事务的错误处理惩罚例程 — 它们可以或许中断正常的法度流,并将代码跳转到一个特别的错误处理惩罚项目组。Java 也供给了用于错误处理惩罚的异常,而 C++ 经由过程 try、catch 和 throw 语法供给异常处理惩罚。当然,您仍然可以在 PHP 中经管错误,但其布局不是标准化的,因而使得编程人员必须应用本身的对象来决意履行错误处理惩罚的体式格式,这将导致更低的一致性并往往导致推倒重来。
另一个弱点是 PHP 的函数名是不区分大小写的。固然这不是一个严重的毛病,但有些法度员可能会感觉这一特点很憎恶。
不过,我的确对 PHP 的对象模型心存疑虑。PHP 不是专门设计为一种面向对象的说话。这些特点中的一项目组是后来添加的 — 尽管重视了对峙与 PHP 3 的后向兼容性,是以两种模型的特点都留有一些。实际上,在 PHP 5 中这些弱点中的很多都获得懂得决。请留心存眷。
PHP 在一些范畴中缺乏什么,它就会在善于的范畴中敏捷地弥补什么。价格公道,是以您不须要愁闷容许题目。它也是开放源代码的,是以全部社区将亲近存眷开辟过程:发明错误并将其修复。若是有一个特点您不喜好,那么您可以批改代码。此外,PHP 可与 Apache 天然连络:它可以作为一个模块编译,或直接编译成 Apache 二进制文件。
但在 Apache 上运行意味着,哄骗 PHP,您可以或许哄骗您已经在随便率性办事器投资,这是因为 Apache 可以或许运行在 Windows、Linux、Solaris 和各类其他 Unix 平台上。此外,应用拥有 Apache 的跟踪记录的 web 办事器意味着安然性可以或许对峙在高的优先级上。最后,PHP 拥有更小的代码路径,这意味着更少的解析和履行 PHP 页面办事器端代码,这将带来更高效的内存和应用率以及更快的运行。
在 PHP 5 中新增了哪些特点?
PHP 5 的第 4 个测试版在 2003 年 12 月底推出,更改日记清楚地显示已发明很多错误并已将其打消。固然它仍在进行测试,但它的所有新特点和进步都确切值得存眷。
PHP 5 的首要新成绩在于它的异常处理惩罚和一个新对象,这个新对象引入的特点付与了 PHP 真正的 OOP。异常处理惩罚无疑是 PHP 4 中最明显的缺憾之一,而 PHP 5 对异常处理惩罚的引入无疑是一个成熟的标记。异常处理惩罚意味着您在您的软件中拥有了按照说话定义的和标准化的错误处理惩罚办法。只需应用 try、catch 和 throw 办法,您的 PHP 代码就变得加倍强健和简洁。
<?phpclass blue {function openFile (¥inFile)
{if (file_exists (¥inFile))
{# code to open the file here} else {throw new Exception (Cannot open file:¥inFile);
} }}
¥blueObj = new blue ();try {¥blueObj->openFile (/home/shull/file.txt);}
catch (Exception ¥myException) {echo ¥myException->getMessage ();
# rest of exception handling code here}# rest of blue methods here?>
新的对象模型为用 PHP 编写的法度带来很多积极的影响。在 PHP 4 中,当把将一个对象传递给函数或办法时,是经由过程值来传递的 — 除非您另行显式告诉 PHP。这个过程意味着必须复制对象的一个副本(内存中的所稀有据布局)。这个步调应用内存,使得接见变慢和拥塞。而在 PHP 5 中,凡是经由过程引用传递对象。
PHP 5 中新的面向对象的特点(包含机关器和析构器)值得存眷。与 C++ 和 Java 雷同,它们供给了一种标准办法,即经由过程一个机关器办法来创建对象、分派内存和履行任何须要的设置,并经由过程一个析构器办法来履行清理。
PHP 5 还引入了对类中办法和变量的更邃密把握。在 PHP 4,一切都是公有的:您可以从类外或在持续类中接见您类中的变量。在 PHP 5 中,您仍然可以使变量或办法为公有,但您也可以使它们为私有,以使得只能在类本身中应用它们。还可以将它们保护起来,也就是说,可以在类内或在子类中查看办法和变量。
此外,PHP 5 引进了类型提示或更好的类型搜检。当您将一个对象传递给一个例程时,PHP 可以或许搜检它是否是正确的类型,并在搜检失败时产生类型不匹配错误。
因为还有其他特点(如静态办法和变量以及抽象类),是以请务必查看文档,以获取具体信息。
安然性斗劲
ASP.NET 官方请求您应用 IIS。不幸的是,IIS 易受进击的汗青由来已久,这使得很多经管员不肯意安排它来处理惩罚 Web 站点。这些弱点是因为 Microsoft 的缺点或是因为 IIS 是黑客们进击的目标可有可无:这些体系有被黑或被进击的汗青。PHP 也运行在 Apache 上,Apache 快速并且是开放源代码的,并拥有很好的安然性记录。此外,正如我提到过的,Apache 可以在很多平台上运行。
若是您在推敲 ASP.NET,但您想用 Apache 作为 Internet 门户,那么很荣幸您可以有一些选择。起首,您可以应用 Apache 将恳求转发给在另一台策画机上内部运行的 IIS。然后 Apache 处理惩罚静态内容,并将 aspx 内容传送给 IIS 办事器(不露出给 Internet)。
不过,若是您想哄骗 Apache 承载 ASP.NET,那么供给了一些选项,这些选项 Microsoft 可能支撑也可能不支撑。作为最后一种选择,有 Ximian 的 Project Mono,它致力于构建一个开放源代码模块。请浏览 www.go-mono.com,以获取更多信息。
数据库编码示例
您在选用 PHP 或 ASP.NET 时起首要推敲身分之一就是与数据库的连接。不过,哄骗 ASP.NET 更错杂,因为您可以从很多备选说话中选择随便率性一种说话。当然,这些代码示例将必须嵌入到 HTML 页面、实例化的类等之中。不过,以下信息将使您对二者的编码风格有所懂得。
PHP 5 与 Oracle 连接
下面是一个 PHP 5 类,它供给了一个 Oracle 连接和断开例程,用以演示哄骗 PHP 5(也可以应用其他驱动法度(如 ODBC 驱动法度)和通用的数据库接口)与 Oracle 连接的一种体式格式:
class oracle_object {
protected ¥theDB;
protected ¥user;
protected ¥pass;
protected ¥db;
function __construct(¥u, ¥p, ¥d) {
¥this->user = ¥u;
¥this->pass = ¥p;
¥this->db = ¥d;
}
function db_open () {
¥theDB = @OCILogon(¥this->user, ¥this->pass, ¥this->db);
db_check_errors(¥php_errormsg);
}
function db_close() {
@OCILogoff(¥theDB);
db_check_errors(¥php_errormsg);
}
function __destruct () {
print (so long...);
}
}
ASP.NET 与 Oracle 连接
若是您哄骗 VB.NET(Visual Basic 是 Microsoft 的默认 .NET 编程说话)与 Oracle 连接,那么请看一下这个来自 MSDN 的示例:
Imports System
Imports System.Data
Imports System.Data.OracleClient
Imports Microsoft.VisualBasic
Class Sample
Public Shared Sub Main()
Dim oraConn As OracleConnection = New OracleConnection
(Data Source=MyOracleServer;Integrated Security=yes;)
Dim oraCMD As OracleCommand = New OracleCommand
(SELECT CUSTOMER_ID, NAME FROM DEMO.CUSTOMER, oraConn)
oraConn.Open()
Dim myReader As OracleDataReader = oraCMD.uteReader()
Do While (myReader.Read())
Console.WriteLine(vbTab & {0} & vbTab & {1},
myReader.GetInt32(0), myReader.GetString(1))
Loop
myReader.Close()
oraConn.Close()
End Sub
End Class
作出选择
假定您还没有决意选用 PHP,我可以断言 PHP 的上风远远跨越它的弱点。(请拜见表 1 中的概要。)这些上风归结为价格、速度和效力、安然性、跨平台实用性和开放源代码机会。它惟一的弱点是缺乏一种纯粹和完美的 OOP 实现,不过,这是一个很小的毛病。固然说话布局的确有帮助,但好的编码终极是由实践、履行、好的习惯和规范带来的。
PHP与ASP.NET的斗劲
表 1
原来,再大的房子,再大的床,没有相爱的人陪伴,都只是冰冷的物质。而如果身边有爱人陪伴,即使房子小,床小,也觉得无关紧要,因为这些物质上面有了爱的温度,成了家的元素。—— 何珞《婚房》#书摘#