PHP为何会被认为是草根语言?

如下文字并无很是多的技术词汇,因此只要对PHP感兴趣的人均可以看看。前端

PHPer是草根吗?

从PHP诞生之日起,PHP就开始在Web应用方面为广大的程序员服务。同时,做为针对Web开发量身定制的脚本语言,PHP一直秉承简单、开源的思想,这也使得PHP得以快速的发展,而且大力地推进Web2.0的出现与发展。可是,长期以来,PHPer(PHP Programmers)被认为是处于草根阶层的程序员,被认为是技术含量少,层次低的程序员。这点在国内尤为突出。程序员

记得一个技术主管说过这样一个事情。他给一个程序员分配了PHP的开发任务,没想到那个程序员竟然说:“我是学Java出身的,你让我去写 PHP,你这不是在贬低我吗?”。这件事情给我印象很深、触动也很大。虽然这不能表明大部分程序员的见解,可是这么认为的人应该很多。还有人说,如今若是是大型的政府项目,PHP是确定不会被列入考虑的范围以内的。web

那么为何PHPer会被认为是草根阶层,是由于它很简单,人人均可以学会,因此没什么难度吗?我之前也是这么认为。PHP入门很快,处理文件,数据,远程链接,网络编程都很是方便,官方也有这样的说法:PHP学习的成本很低,因此你容易去使用它。这个想法也是广泛的,甚至大部分的PHPer 本身都这样认为。算法

说到这里,我想你们就会想到我为何要写这些文字。由于一年多的PHP推广工做让我了解到许许多多的使用PHP的公司的大概状况。在这些过程当中我慢慢体会到其中的根本缘由。这里我说是根本缘由虽然是我的的见解,可是我以为事实就是如此。数据库

那么为何PHPer会被当作草根阶层,根本缘由是PHPer所做的事情(经过代码实现)的绝大部分都是表现层的东西,这个熟悉PHP的人都知道。固然也会有PHP会说他用MVC结构编写的某某框架具有的如何如何的功能。可是这些仍是表现层。因此只会处理表现层的程序员就被当作草根阶层了。事实上也是如此,由于这种状况下PHP确实很难构造大型的应用。编程

这就找到缘由了,不是的。为何PHPer老是在负责表现层的东西呢。答案是底层的数据处理(Web应用就是数据存储和查找)咱们通常不去触及。好,那么说到这里有些人可能已经想到了,那不就是数据库吗?对,就是数据库。让PHPer一直当草根的元凶就是数据库。为何?浏览器

PHPer对MySQL的依赖过大

由于目前流行的web架构中,前端是负载均衡系统,中间是web服务器,后面是数据库服务器。因此,大部分PHPer工做在Web服务器层面。由于数据库已经很好地为咱们组织数据了。因此PHP中没有太多的算法,并且你们潜意识下也以为不须要,更况且会影响性能。缓存

这种状况下,PHPer就成为了数据库使用者,他老是在操做数据库。而不是在作程序。一个最简单的PHP脚本就是,链接数据库,把数据取出来,而后用命令输出到浏览器。整个过程不超过10行代码。给人的感受就是太简单了。没有任何技术含量。为何了,由于数据处理部分都已经被数据库作完了。尤为是MySQL的使用。MySQL是免费的,因此大多数程序员能够自由地使用它,另外MySQL的速度够快了,因此作个PHP应用程序很是的简单。这就至关于给你枪之后你以为没有必要学习武功同样。固然,我不是说枪没有武功好。而是说,枪的出现,小孩均可以轻松便捷地杀人了。服务器

咱们再详细说说为何是数据库。这里我说一个例子。我去过北京一家很是著名的网站,当时咱们还有一个比较资深的PHP程序员在那说些系统架构的事情。我记得当时那个程序员问你们一个数据结构中的算法问题的时候,全场没有一我的能答得出来(包括我)。而后那个程序员就开始给你们讲些很基础的数据结构的东西了。让我一会儿回想到大学时候学的数据结构课。而这些基础的数据排序、查找、传递的问题在其余高级语言(好比C)是很是广泛的。可是在PHP没有。PHPchina.com的论坛也有个板块叫PHP的数据结构和算法。这个板块的帖子也是寥寥无几。网络

说到这里,你们明白了吧?大部分PHPer仅仅处理表现层的东西,而在MySQL的便捷使用下,PHPer几乎不用触及任何数据结构与算法的状况下完成大部分开发任务,因此一个才有上面的,没有一个PHP程序员可以回答出那道数据结构的问题,换成是C等语言,状况可能就大不相同了。是PHPer草根,才让PHP显得草根

仔细回想下,目前网络上你们讨论的最多的是两个方面的问题。一个是PHP的类的使用(处理过程的封装),还有一个是开发框架问题。可是咱们仔细分析的话,发现这些所谓的PHP中比较复杂的概念里面没有数据处理。为何,有数据库。用一个Adodb或者PHP5的PDO就能够搞定了。真的搞定了吗?不是,这些无非是在链接数据库,没有数据处理。因此PHPer彷佛就没有什么能够拿出台面上的东西。

再说一个具体的代码问题,无级分类。这个概念我想你们都不会陌生了吧。我见过两种处理方式。第一个是地道的PHPer的处理方式,也是目前比较流行的。就是用数据库来处理。并且字段不多,只须要加个父类的字段并加以判断就好了。并且这个方法很实用。效率也高。可是这个不是数据处理的范畴了,而是数据库的查找。

第二个是C程序员用PHP写出来的,他把全部的分类信息都从数据库取出来,而后用数据结构算法进行排列分布,而后输出。

这里咱们不对这两种方式的效率进行对比,我想你们都有各自的想法。可是我想说明一个问题,就是这两种作法的本质的区别。PHPer习惯性地用数据库来处理,并且有很巧的处理方式,效率也很高。这种方式就是数据库查询。而第二种方法是比较有特色的。他认为数据库就是存放数据的地方,具体的逻辑处理还要靠本身的逻辑。

所以,结论是第二种方法的使用者以为本身强些,由于数据的逻辑是他组织的。而且以为PHPer的那种作法无非就是会查询数据库罢了。因此他认为PHPer是草根级的,只懂得操做数据库和排列页面(smarty搞搞那种)。

让数据库回归本职工做

说到这里,我想你们都已经回忆了很多本身平时用PHP作开发的经历了吧,是否发现你们确实都在操做数据库呢。

那么咱们来讨论下这个问题。数据库很差吗?为何我一直用数据库处理数据都没有问题。我要说的是数据库是有问题的,并且有很大的问题。固然这里我并非说不能用数据库,也不是在贬低数据库的性能。而是,咱们没有充分认识到数据库所起到的做用。

个人想法源起于这样一个事情,有一次一个网站的技术总监问我,为何他们的网站那么慢,要怎么办。当时,个人MSN里Zend总部的工程师正好在线,我就问他PHP响应比较慢了,怎么办?他当时直接告诉我,是数据库问题。确定是数据库没有优化设计好。因此,我没有给那个技术总监确切的答案了,由于他们的数据库设计咱们是不能涉及的。因此就给了大概的数据库优化的建议。这样的事情多次发生,我就开始怀疑,为何Zend总部的工程师每次都跟我说是数据库的问题呢,难道咱们不能从PHP层面来解决这个问题吗?答案是不能。由于PHP目前的运行速度已是很快了,经过Zend的性能分析也能看到一个用户的点击,PHP的运行时间只有10%不到,那PHP在干嘛?它在等。等数据库的查询结果。这个方面在目前的PHP产品中有了很大的提升,那就是 Caching和网页静态化两个方案。

Caching可能你们会比较陌生,可是网页静态化如今连PHP产品的用户都很是清楚了。速度快、容易被搜索到等等,好处不言而喻。开玩笑地说,如今网站的主页实现网页静态化只须要硬盘足够大。J至于Caching就比较复杂些,也是大多数PHPer感到头疼的地方。甚至于有些人会用C来实现。由于Caching中的数据有效期验证、查找、提取、更新等等都是比较难处理。固然,也有人会用数据库来处理 Caching问题。

因此,当访问量激增的时候,PHP架构的网站会出现的不少问题都因数据库而起。数据库的同步问题还不算什么。关键是数据库的响应速度会有指数级的下降。这个问题我在10月23号LAMP发布会的时候问过MySQL的副总裁。他当时也没有给我比较完美的答案(这也个人意料之中),由于数据库总会有瓶颈的,除非是神仙数据库,哈哈!

这里有个题外话,LAMP大会的时候我跟Yahoo的一个技术高管聊的时候,我问他Yahoo在选择MySQL仍是Oracle的时候是怎么考虑,他的答案令我很是惊讶。他说大部分的时候咱们是会用MySQL的,由于它的性能已经达到咱们的要求。可是何时咱们会选用Oracle呢,就是当咱们须要存储收费用户的数据的时候。我就问为何,难道Oracle比MySQL稳定吗?他说,这个倒没有特别考虑。关键是若是使用Oracle的话,当出现问题的时候咱们能够找到负责人,Oracle会负责事故的处理,可是若是用MySQL的话,咱们找谁去?

因此,咱们对数据库的见解应该纠正过来,就是说数据库不是万能的。若是有实力的话本身开发数据库。据说Google就是那样的。

那么咱们怎么看待数据库呢?我我的的理解是数据库只是用来下降开发成本的手段。由于采用数据库之后咱们不须要考虑数据的存储,尤为是排序和查找。可是这会带来什么问题呢?就是当业务膨胀的时候,数据库就成为瓶颈了。这个时候问题就会很是棘手。由于这个是底层的数据处理。牵一发而动全身。

因此我认为正确的观点是,数据库是一个数据备份机。怎么理解,咱们只须要保证数据的存储有效性就好了。而这原本就是数据库的核心功能,只不过由于数据库的方便的排序等功能让你们把过多的处理都交给数据库来操做了。一个用户的点击PHP就把一大堆的任务交给数据库,而后把结果排列下给用户就完事了。这对数据库是不公平的。也是所以你们开始抱怨数据库的性能了。

针对这个观点,咱们再举个例子,有一次我去拜访一个大型的网络公司(基本上国内只要上过互联网的都知道),他们使用PHP不多,可是我了解到他们其它业务是怎么使用数据库。他们自豪地跟我介绍说他们在数据库的外围有个第二数据库(我这里起名叫第二数据库)。为何叫第二数据库呢,原来它是一个缓存系统。那么开发工程师怎么去这个缓存系统获取数据呢?那个技术总监自豪地说,他们这个缓存系统有SQL查询语句。我当时很惊讶,可是后来想一想确实须要这个。由于当你的缓存系统达到必定量级的时候从缓存获取数据都很是复杂,干脆写个SQL查询语句让缓存系统分析、处理并返回数据。并且他们告诉我,在他们那里,就算是用PHP的话也是让PHP去那个缓存系统读取数据。

因此说,若是你能处理好这样的问题的话,把数据存放在数据库,而后数据库只起到备份的做用。而后你用本身的中间层来处理分析数据,效果是90% 以上的用户不访问数据库。有人就会说了,这不就相似链接池的东西吗?是的,由于数据库的瓶颈是没法解决的,咱们只能在Web服务器和数据库中间加个中间层来作缓冲。

可能你们会说了,切,这个咱们早就知道了。那好,这里我要说的是它引起的两点思考:

第一,有些语言已经有链接池技术的基础上,那些程序员能够方便地使用链接池而构建大型应用。那么若是他们认为 PHPer只会是用数据库,那么咱们是否是能够说他们只会是用链接池呢?链接池和数据库在这个概念上有何区别?

第二,当PHPer开始构建本身的缓存系统的时候,他是否是突破了PHPer只会是用数据库的层次?由于他参与了数据逻辑的处理工做。那么他仍是草根吗?

最后,懂得独立思考的PHPer不是草根,什么事情都丢给数据库去作的才是。


转载随意,但请带上本文地址:

http://www.nowamagic.net/librarys/veda/detail/2407