Java和PHP在Web开发方面的比较

Python018

Java和PHP在Web开发方面的比较,第1张

比较PHP和JSP这两个Web开发技术 在目前的情况是其实是比较PHP和Java的Web开发 以下是我就几个主要方面进行的比较

一 语言比较

PHP是解释执行的服务器脚本语言 首先php有简单容易上手的特点 语法和c语言比较象 所以学过c语言的程序员可以很快的熟悉php的开发 而java需要先学好java的语法和熟悉一些核心的类库 懂得面向对象的程序设计方法 所以java不如php好学

Java首先要编译成字节码 class文件 然后在java虚拟机上解释执行 Java的Web开发首先最容易想到的就是JSP(现在已经到JSP ) 原来的java的Web开发都是用servlet来实现的 用servlet来开发需要程序员在java的源文件中嵌入大量的代码 所以后来就出现了JSP JSP可以方便的嵌入到文件当中 其实jsp文件在服务器上执行的时候首先会被应用服务器转换成servlet 然后再编译执行 Jsp可以通过servlet和JavaBean的支持产生强大的功能 JavaBean 是一种可复用的 跨平台的软件组件 使用javabean可以方便的实现java代码和的分离 能够增强系统的功能和软件的复用性

Java的Web开发属于SUN公司定义的J EE其中的规范 而且在J EE中包括了java的Web开发的所有方面 如 JSP Servlet JDBC JNDI JAVABEAN EJB等等 J EE就特别适合于做大型的企业级的应用

二 数据库访问比较

Java通过JDBC来访问数据库 通过不同的数据库厂商提供的数据库驱动方便地访问数据库 访问数据库的接口比较统一

PHP对于不同的数据库采用不同的数据库访问接口 所以数据库访问代码的通用性不强 例如 用Java开发的Web应用从MySQL数据库转到Oracle数据库只需要做很少的修改 而PHP则需要做大量的修改工作

三 系统设计架构比较

采用Java的Web开发技术 需要使用的是面向对象的系统设计方法 而PHP还是采用面向过程的开发方法 所以用Java进行开发前期需要做大量的系统分析和设计的工作

四 跨平台性

Java和PHP都有很好的跨平台的特性 几乎都可以在不作任何修改的情况下运行在Linux或者Windows等不同的操作系统上

五 开发成本比较

PHP最经典的组合就是 PHP + MySQL + Apache 非常适合开发中小型的Web应用 开发的速度比较快 而且所有的软件都是开源免费的 可以减少投入

Java的Web应用服务器有免费Tomcat JBoss等 如果需要更好的商业化的服务有 Web Sphere和 Web logic

六 分布式多层架构比较

PHP只能实现简单的分布式两层或三层的架构 而JAVA在这方面就比较强大 可以实现多层的网络架构 数据库层(持久化层) 应用(业务)逻辑层 表示逻辑层彼此分开 而且现在不同的层都已经有一些成熟的开发框架的支持 例如Struts就是利用java的Web开发技术实现了MVC的设计模式 而在业务逻辑层也有Spring框架 数据库持久化层有Hibernate等框架 这些框架可以方便开发者高效 合理 科学得架构多层的商业应用

下面简要的说一下Struts 它实质上是在JSP Model 的基础上实现的一个MVC(Model View Controler)框架 JSP Model 体系结构是一种联合使用JSP 与Servlet 来提供动态内容的方法 在Struts框架中 模型由实现业务逻辑的JavaBean或EJB组件构成 控制器由Servlet实现的 视图由一组JSP文件组成 采用Struts可以明确角色的定义和开发者与网页设计者的分工 而且项目越复杂 其优势越明显

七 源代码安全

PHP开发的程序的源代码都是公开的 他人拿到php开发的程序后都可以进行修改

Java开发的程序 最后用户拿到的是只是一些编译好的class类 无法看到完整的源代码 安全性高

   八 性能比较

有人做过试验 对这两种种语言分别做回圈性能测试及存取Oracle数据库测试

在循环性能测试中 JSP只用了令人吃惊的四秒钟就结束了 * 的回圈 而PHP测试的是 * 循环(少一个数量级) 却分别用了 秒

数据库测试中 二者分别对 Oracle 进行 次 Insert Update Select和Delete JSP 需要 秒 PHP 需要 秒  

项目

PHP

JAVA

可复用性

开发速度

易维护性

可移植性

优- Linux

Windows Unix

安全性

开发费用

多层架构

数据库访问

接口不统一

接口统一

可扩展性

面向对象

lishixinzhi/Article/program/PHP/201311/21447

一、需要解决中央控制端到各节点服务器之间的通信。

这个其实牵扯到一个通信协议的问题,各语言都有自己的socket,thread的库,直接调用即可。但是这个通信协议就需要自己来完成了。既不能太简单,太简单了,明码传输,如果别人获知了这个接口,就很容易执行一些令人讨厌的操作。也不能太复杂,太复杂了等于是给自己找麻烦,所以简单的数据包编解码的工作或者用token验证的方式是需要的。通信协议起码要两种,一种是传输命令执行的协议,一种是传输文件的协议。

二、跨语言的socket通信

为什么要跨语言,主控端和代理端通信,用什么语言开发其实无所谓。但是为了给自己省事,尽可能使用服务器上已经有了的默认语言,Ambari前期采用php+puppet的方式管理集群,这不是不可以,puppet自己解决了socket通信协议和文件传输的问题,可你需要为了puppet在每台服务器上都安装ruby。我是个有点服务器和代码洁癖的人。光是为了一个puppet就装个ruby,我觉得心里特对不起服务器的资源。所以我自己写了一个python的代理端。python是不管哪个linux系统在安装的时候就都会有了。然后主控端的通信,可以用python实现,也可以用php实现,但是考虑到对于更多的使用者来说,改php可能要比改tornado简单许多,所以就没用python开发。hadoop分支版本众多,发布出去,用户要自己修改成安装适合自己的hadoop发行版,就势必要改源码,会php的明显比会python的多。php里面的model封装了所有的操作,而python只是个操作代理人的角色而已。

所以也延伸出一个问题,什么语言用来做这种分布式管理系统的代理端比较合适,我自己觉得,也就是python比较合适了,操作系统自带,原生的package功能基本够用。用java和php也可以写agent,但是你势必在各节点预先就铺设好jre或者php运行环境。这就跟为什么用python和java写mapred的人最多是一样的。没人拦着你用nodejs写mapred,也可以写,就是你得在每个节点都装v8的解释引擎,不嫌麻烦完全可以这样干。原理参看map/reduce论文,不解释。perl也是操作系统原生带的,但是perl的可维护性太差了,还是算了吧。

所以这就牵扯到一个跨语言的socket问题,理论上来说,这不存在什么问题。但这是理论上的,实际开发过程中确实存在问题,比如socket长连接,通信数据包在底层的封装方式不同。我没有使用xml-rpc的原因之一就是我听说php的xmlrpc跟其他语言的xmlrpc有不同的地方,需要修改才能用,我就没有用这种办法。最早是自己定义的操作协议,这时就遇到了这些问题,所以后来直接采用了thrift方式。就基本不存在跨语言的socket通信问题了。

三、代理端执行结果的获取

无论命令还是文件是否在代理端执行成功,都需要获取到执行结果返回给中央端。所以这里也涉及一个读取节点上的stdout和stderr的问题。这个总体来说不是很难,都有现成的包。当然这个时候你需要的是阻塞执行,而不能搞异步回调。

还有个问题是,我要尽可能使用python默认就带的包,而尽量不让服务器去访问internet下载第三方的包。

还有代理端最重要的一点,就是python的版本兼容性。centos5用python 2.4,centos6用python 2.6,ubuntu基本默认都是2.7。所以一定要最大限度的保证语言的跨版本兼容性,要是每个操作系统和每一个版本我都写一个代理,我一个人就累死了。