发表在我的博客:
用好PECL
PECL(The PHP Extension Community Library),PHP官方提供的PHP扩展库。这个主要可以解决社区和第三方提供的PHP扩展的安装问题。早些年看张宴老师的PHP编译部署的文档,生产环境的PHP扩展安装从那时起都是从网站上下载,然后自己编译安装。后来PHP版本升级后,原来文档里面提供的扩展包已经不能匹配新版PHP环境了。其实PHP一直都有PECL这个工具用来管理第三方扩展,使用起来非常方便。
在Linux/Unix/MacOS上,使用PECL是一件非常方便的事情。如果你的PHP环境是自己编译的,在PHP的安装目录的bin下会有pecl这个文件,把它软链到/usr/bin下面你就可以随时使用pecl了。以下给出两种软链它的方案,Linux发行版推荐使用alternatives工具。
我的PHP安装在:/usr/local/php-5.5.10
alternatives安装方式
alternatives --install /usr/bin/pecl pecl /usr/local/php-5.5.10/bin/pecl 1000
soft link安装方式
ln -s /usr/local/php-5.5.10/bin/pecl /usr/bin/pecl
注意你可能需要管理员权限才能进行此操作。
在Windows上同样可以使用PECL,但是不如Linux/Unix系统上那么无痛。有相当多常用的扩展并不提供编译好的.dll,而且要在Windows上自己编译PHP扩展,现阶段来看,称其为一场灾难也不为过。要做到VC版本、x86/x64、线程安全/非线程安全版本的完全匹配,一个版本的扩展至少要产生8~12个版本的DLL。
使用PECL非常简单,常用的命令包括list、search、install、uninstall。
list命令可以帮你查看当前PHP环境已经安装的扩展:
[root@dev2 bin]# pecl listInstalled packages, channel pecl.php.net:=========================================Package Version Statememcache 2.2.7 stablemongo 1.5.1 stableredis 2.2.5 stable
search命令可以在软件仓库中查找需要的扩展软件包:
[root@dev2 bin]# pecl search mongoRetrieving data...0%Matched packages, channel pecl.php.net:=======================================Package Stable/(Latest) Localmongo 1.5.1 (stable) 1.5.1 MongoDB database driver
如果你要安装mongo的扩展,那么直接执行:
pecl install mongo
可搞定,多简单!
需要注意的一点是,PECL并不会替你修改php.ini文件,所以使用pecl安装扩展后,请编辑php.ini文件增加配置使扩展生效。
拥抱PHP 5.3+
貌似很多国内项目还在坚守PHP 5.2,老项目的迁移抛开不说,如果你正准备进行一个新的PHP项目,那么请将你的默认PHP版本升级到5.3.8以上,推荐直接升级到PHP 5.5。为什么要这样做?首先是更加完善的面向对象支持,PHP 5.3开始支持命名空间,这一特性对现在社区的库和扩展来说是一项最起码的要求。如果你还打算继续使用PHP 5.2甚至更老的版本,那么恭喜你只能望Composer兴叹了(下面会告诉你Composer是个多么令人惊奇的东西)。另外就是新版本的安全性和性能会更好。(PS吐槽:总有人认为老版本更稳定或者给更安全,美其名曰经历过实战检验——这群人的万能挡箭牌。呵呵。)
PHP 5.3开始支持命名空间,同时也由此诞生了psr规范(什么是PSR?)。有了这一特性之后,我们终于有了普遍适用的类和文件加载机制,再也不用关心使用类之前是否require过,或者费心使用各种框架五花八门晦涩的组件加载方法了。
PHP 5.4开始支持了数组定义的缩略写法,以前我们定义一个数组通常是这样的:
$array = array('a', 'b', 'c');
大家用JS就会发现这种写法其实不够简洁,于是PHP5.4开始支持了类似JS的这种写法:
$array = ['a', 'key' => 'val', 'c'];
另外,PHP 5.4开始,支持了方法参数的强制类型定义(以前只支持array),这对提高代码的健壮性和IDE支持有了很大帮助:
function test(PDO $pdo) {...}
关于PHP 5.4中支持的新特性,请参考:
当然,一些特性不再必要,或者受支持,请参考:
在PHP 5.5中,有更多的新特性被支持,比如empty开始支持表达式了,新版本现在开始支持yield关键字了。如果你对.net比较熟悉,那这个对你来说一定不陌生。
关于PHP 5.5的新特性,参考这里:
当然,一些特性不再必要,或者受支持,请参考:
使用Composer
Composer绝对是一个令人眼前一亮的东西,它更像是PHP的Maven。现在一门编程语言,得社区者得天下。Java的广泛应用,功劳肯定离不开数以万计的社区项目支持。你要开发一个模块,还继续自己先造轮子吗?No,Composer已经为你提供了数以万计的轮子供你挑选,现在要做的,就仅仅是从一些漂亮的轮子里面挑选合适的放在你的项目里,而不是写一些未经严格测试的代码就作为系统的基础类库。
关于Composer的介绍,请参考我之前写的一篇文章:
做一件事情,现在只需要往composer.json中添加一个合适的库依赖,然后使用composer update,这些天降神兵的家伙就加入到你的项目中了。我现在使用了这样几个组件,通过composer安装:
Doctrine ORM – 一个PHP的ORM框架,下面会讲到。
php-resque、php-resque-scheduler – 一个PHP的后台任务处理框架、计划任务框架。
phpexcel – 老牌PHP处理Excel的组件
image – 一个PHP的图像处理库
我要做的仅仅是写几行类似胶水的代码,把这些类库粘接起来。其他的事情全部交给开源社区了:-)。
别被框架绑架
不能不说,如今PHP开发不整一个框架,都不算会写PHP。有那么多框架可供选择:Zend、Symfony、Yii、CakePHP等等,但是千万记得别被框架绑架。这句话有两个方面的意思,首先,别让框架把简单事情复杂化。PHP论性能不如Java,论语法糖不如C#,论灵活性扩展性不如Python、Ruby这些家伙,那为什么还用PHP呢。我觉得仅仅是因为,KISS原则:Keep it simple, stupid. PHP要实现一个功能很简单,可能Java搭建框架的功夫,PHP就已经交付了这个功能。开发迅速,维护简单是他的优势,别让框架把它搞复杂了。其次,如果一个设计,框架不支持,或者做不到,不要想当然的以为PHP也做不到,这就错了。别忘了你有Composer:-)。但是如果一个框架不能够很好的支持社区组件,那么是时候把它扫进垃圾堆了。
Doctrine ORM
这家伙实在是不得不说它了。按照我以前的想法,PHP存在ORM这种东西完全是找虐。用过了Doctrine ORM才彻底改变了我的想法(其实不得不提的是之前做了接近一年的Java,JPA、Spring Data神马的已经开始依赖了)。
新的项目使用了我自己写的SimplePHP框架()。但是业务领域还是有一些复杂的。为了便于以后的开发和维护,也为了团队协作更加方便(关于领域和数据访问层的设计,请参考《企业应用架构模式》这本书。),我决定尝试一种PHP的ORM框架。在Composer上找了一下,发现Doctrine ORM使用最多,果断尝试一下。刚刚读完,我就立即发现,这货完全就是PHP版本的JPA,连API都非常接近。
$entityManager = EntityManager::create($conn, $config);$product = new Product();$product->setName($newProductName);$entityManager->persist($product);$entityManager->flush();
SimplePHP可以很好地兼容PSR-0,所以直接通过Composer安装,简单配置一下即可:
Conf/db.conf:
/* Doctrine */return ['doctrine' => array( 'metadata_type' => 'php', 'metadata_path' => array(APP_ROOT.DIRECTORY_SEPARATOR.'Entity'), 'dev_mode' => true, 'db_param' => array( 'driver' => 'pdo_mysql', 'host' => '127.0.0.1', 'user' => 'public', 'password' => 'public', 'dbname' => 'test', 'charset' => 'utf8' ),)]
我写了一个简单的工厂类,来帮助从配置文件产生EntityManager对象,在业务逻辑类里面可以直接使用:
$em = EntityManagerFactory::getManager();
来取得EntityManager对象。
项目开发证明,Doctrine ORM非常必要,它带来很多方便的特性,重要的是,Doctrine ORM性能也还不错。
通过注解方式配置的POPO(对应POJO),可以直接从领域模型快速建出,并且无需关心数据库建表,这一切都会有Doctrine的Tools帮你建立。甚至代码有了修改之后,都能自动地更新数据库表结构,简直不能更爽了,哈哈(PS:其实JPA一直都可以好嘛)。
基本上要说的也就这几点了,作为一点点经验分享给大家。