Posts Tagged ‘php’

漫谈PHP和Java

September 27th, 2009

我为公司内部交流而写的PPT,谈论PHP和JAVA相关的话题。在这里查看:

漫谈PHP和Java

  • Share/Bookmark

以字符串为key访问key为整数的数组

June 29th, 2009

题目比较拗口,不多说了,看了程序就明白了:

<?php
$b = array(0=>'bbb');
echo $b['0'];

$v = array(0=>'bbb', '0'=>'ccc');
echo $v['0'];
?>

程序输出bbbccc。当数组里没有字符串的’0′,有0时,php自动把作为key的’0′转变成了0。

  • Share/Bookmark

为什么java没有php开发web容易?

June 2nd, 2009

为什么java没有php开发web容易?原因可能有很多种,就我这半年的php经验来看,主要有以下几点原因:

1. java没有php那样好用的map(在php里叫做array)

这一点很重要,直接看代码吧:
php的:

$values= array(
    'login_name'=>'sulong',
    'password'=>'',
    'login_result'=>array(
        'error_no'=>3,
        'msg'=> 'account disabled'
    )
);

java的:

Map values = new HashMap();
values.put("login_name", "sulong");
values.put("password", "");

Mapresult = new HashMap();
result.put("error_no", "3");
result. put("msg", "account disabled");

values.put("login_result", result);

很多时候,java程序员宁愿选择建一个新的类来做数据的载体,也就是常说的bean了。但是很多时候,我只想要一个简洁好用的Map而已。

最好的是groovy:

values = [
    login_name: "sulong",
    password: "",
    login_result: [
        error_no: "3",
        msg: "account disabled"
    ]
]

仅凭这一点,我就觉得在groovy克服其它问题后,必会成为java在web开发上的利器。

2. java经常要重启服务器

用java开发web,只要改动了java代码,就要重新启动服务器,至少要重新部署一下应用,才能看到新代码的效果,而php就不需要。所以,开发php的时候,经常是一边写,一边运行看效果,快速的迭代和开发。相比之下,java要不断的编译重新发布,重启服务器,比php慢多了。如果java开发也可以即时生效,不用不断的重启的话,那么java的开发效率必然会有很大的提升。

3. 动态类型

确实,动态类型意味这较弱的IDE支持,意味着要进行更多的测试,以避免意想不到的效果,但是,另一方面,动态类型将代码简化,让程序员关注于做什么,而不是怎么做,提升了生产率。比如,用动态类型语言的时候,我们只要说,dog.bark(),那么我们不用关心dog到底是不是dog,只要他能bark(),那bark()就好了。而在静态类型的语言中,我们一定要先搞清楚那是什么,能不能bark,如果不能bark怎么办?是不是要做一层包装?做类型的转换?等等。严谨固然有他的好处,但自由简明显然开发起来更加的快速。

  • Share/Bookmark

企业应用集成–java与php

April 23rd, 2009

随着企业的发展,企业的业务种类越来越多,业务量越来越大,越来越复杂,部署在单一的服务器上的单一的应用很难再满足业务系统在可靠性,性能,易于维护和扩展等很多方面的需求。进而把企业系统拆分成很多的独立应用,部署在多台服务器上,成为必须。拆分开的多个应用并不能独立的完成所有的业务,应用间必然需要集成。用什么样的方式把各应用集成,不仅能满足系统的功能需要,还能做到易于维护,易于扩展,高性能,高可靠,就成为了一个难题。

公司最开始用php做所有的内部(指面向公司内部职员)和外部的应用(外部指面向internet用户的),之后公司开始采用java来逐步代替php来开发内部应用。所以,我们java程序不但面临着如何集成java内部的各个应用的问题,还面临着如何和php集成的问题。我们使用用过以下方法和php集成:

数据库共享:

java和php使用相同的数据库,为了减少混乱,同一张表,只能由java或php其中一方负责写。这种方法使用起来直观,易用,但还是有很多的问题。
首先,java和php对数据库的一些行为是不一致的。mysql数据库的datatime类型,再插入不正确的数据时,mysql会在里面插入”0000-00-00 00:00:00″, php在读取这样的日期时没有问题,反正,他是字符串。但是java这边却会出错,应为jdbc会默认的将它转化成java.sql.Date类型,而在转化的是时候会发生异常。更大的阻力来自于php和java两个团队在使用数据库习惯上的差异。
其次,数据库共享功能不够强。比如,php完成某个业务时,需要及时通知java,但是仅通过数据库共享不好做,除非java对数据库轮询,但这样做显然很难在及时性和性能两者之间找到平衡。
再次,可扩展性差,但需要做出变更时,变更数据库显然是一件更加痛苦的事。这不仅要处理遗留的数据,还要调节两边的数据库访问程序。
所以,正是后续的项目里就没有再使用过这一方案。

SOAP:

按理说soap这种语言中立又规范化的技术应该非常适合于这种场景,但是在使用过程中还是会出现很多的问题。
首先,php和java两边对soap的理解并不一样。Java生成的布尔值在soap的xml里并表示为true或则false,但是在php看来只要不是0,都是true,所以”false”也是true。也许是php那边所使用的soap支持程序有问题,但是这个问题确实给我们带来了很多麻烦。还有一个要命的问题,就是字符集的问题,php以前一直使用gb2312和gb18030,但是soap的xml并不支持gb18030里的某些奇特字符,一旦遇到这样的字符,xml解析就失败。后来,不得不把可能出现此类字符的内容用base64编码。顺便发一下牢骚,这些奇怪的字符网网都来自于那些爱使用脑残体火星文的新新人类,这些人简直就是弱智!

基于http的简单文档交互:

这种方法很简单,就是通过http post个xml或其它文档来实现交互。这种方式就是原始的使用http的soap,只是soap后来加了一大堆的标准(ws-*),在这些标准对我们来说没有意义,而php和java两边对标准的支持不兼容的时候,soap就成了鸡肋。后来,我们就干脆抛弃了soap,而通过我们自己的程序来发送和接收我们自定义的没有歧义的xml。目前为止,这是两边都乐意使用且很少出问题的方式。这种方式需要两边很好的配合,需要规范化的文档,否则以后只会变得混乱。

我们也曾想过使用基于java的php实现,来达到让java和php在语言级别集成,这种方法对于php遗留系统来说风险太大,而且php程序员面并不乐意生活在java的虚拟机内。也许未来这能成为一个成熟的方案。

正因为使用不同技术的应用之间的集成存在很多的问题,在实际项目中应该尽量避免。

  • Share/Bookmark