博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
进阶PHP需要注意的一些点
阅读量:6586 次
发布时间:2019-06-24

本文共 4456 字,大约阅读时间需要 14 分钟。

hot3.png

发表在我的博客:

用好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一直都可以好嘛)。

基本上要说的也就这几点了,作为一点点经验分享给大家。

转载于:https://my.oschina.net/starlight36/blog/229482

你可能感兴趣的文章
小命令 sysdig
查看>>
IT十八掌作业_java基础第五天_静态代码块、类的继承和接口
查看>>
流程控制-for序列、流程控制-for字典
查看>>
Easy APNs Provider的使用
查看>>
搭建mysql集群
查看>>
Gson工具包使用
查看>>
有一个系统修复处于挂起状态,需要重新启动才能完成该修复
查看>>
Ubuntu上安装bind9
查看>>
访问共享提示“服务器存储空间不足,无法处理此命令。”
查看>>
第七章 虚拟化 虚拟机备份 Veeam backup &Replication
查看>>
路由器与交换机的密码恢复
查看>>
Cisco路由器上的IPSec协议(站点到站点的×××)
查看>>
Linux Python详细安装、升级指南
查看>>
无法修复ie使用代理服务器
查看>>
教你给IDEA安装插件
查看>>
隐蔽可扩展PHP Webshell – Weevely 1.0
查看>>
如何让Yii框架支持多个数据库
查看>>
用函数指针读取并调用虚函数表指向的每个函数
查看>>
办公小贴士之:在Outlook 2010中添加农历生日
查看>>
我的友情链接
查看>>