—— 一个值得 PHPer 思考的问题
作者:Hosander
来自:PHPChina.com
前言:以下文字并没有非常多的技术词汇,所以只要对 PHP 感兴趣的人都可以看看。
从 PHP 诞生之日起, PHP 就开始在 Web 应用方面为广大的程序员服务。同时,作为针对
Web 开发量身定制的脚本语言, PHP 一直秉承简单、开源的思想,这也使得 PHP 得以快速的发
展,并且大力地推动 Web2 . 0 的出现与发展。但是,长期以来, PHPer ( PHP Programmers )
被认为是处于草根阶层的程序员,被认为是技术含量少,层次低的程序员。这点在国内尤其突出。
记得一个技术主管说过这样一个事情。他给一个程序员分配了 PHP 的开发任务,没想到那个
程序员居然说:“我是学 Java 出身的,你让我去写 PHP ,你这不是在贬低我吗?”。这件事情给我
印象很深、触动也很大。虽然这不能代表大部分程序员的看法,但是这么认为的人应该不少。还有
人说,现在如果是大型的政府项目,PHP 是肯定不会被列入考虑的范围之内的。
那么为什么 PHPer 会被认为是草根阶层,是因为它很简单,人人都可以学会,所以没什么难度
吗?我以前也是这么认为。PHP 入门很快,处理文件,数据,远程连接,网络编程都非常方便,官
方也有这样的说法:PHP 学习的成本很低,所以你容易去使用它。这个想法也是普遍的,甚至大部
分的 PHPer 自己都这样认为。
说到这里,我想大家就会想到我为什么要写这些文字。一年多的 PHP 推广工作让我了解到许
许多多的使用 PHP 的公司的大概情况,在这些过程中我慢慢体会到其中的根本原因。这里我说是
根本原因虽然是个人的看法,但是我觉得事实就是如此。
那么为什么 PHPer 会被看成草根阶层,根本原因是 PHPer 所作的事情(通过代码实现)的绝
大部分都是表现层的东西,这个熟悉 PHP 的人都知道。当然也会有 PHPer 说他用 MVC 结构编写
的某某框架具备的如何如何的功能。但是这些还是表现层。所以只会处理表现层的程序员就被看成
草根阶层了。事实上也是如此,因为这种情况下 PHP 确实很难构造大型的应用。
这就找到原因了,不是的。为什么 PHPer 总是在负责表现层的东西呢。答案是底层的数据处理
( Web 应用就是数据存储和查找)我们一般不去触及!好,那么说到这里有些人可能已经想到了,
那不就是数据库吗!对,就是数据库!让 PHPer 一直当草根的元凶就是数据库。为什么?
因为目前流行的 web 架构中,前端是负载均衡系统,中间是 web 服务器,后面是数据库服务
器。所以,大部分 PHPer 工作在 Web 服务器层面。因为数据库已经很好地为我们组织数据了。所
以 PHP 中没有太多的算法,而且大家潜意识下也觉得不需要,更何况会影响性能与维护。
这种情况下,PHPer 就成为了数据库使用者,他总是在操作数据库。而不是在做程序。一个最
简单的 PHP 脚本就是,连接数据库,把数据取出来,然后用命令输出到浏览器。整个过程不超过 10
行代码。给人的感觉就是太简单了。没有任何技术含量。为什么,因为数据处理部分都已经被数据
库做完了。尤其是 MySQL 的使用! MySQL 是免费的,所以大多数程序员可以自由地使用它,另
外 MySQL 的速度够快了,所以做个 PHP 应用程序非常的简单。这就相当于给你枪以后你觉得没
有必要学习武功一样。当然,我不是说枪没有武功好。而是说,枪的出现,小孩都可以轻松便捷地
杀人了。
http://www.phpchina.com ·PHPer· 40 视点
我们再详细说说为什么是数据库!这里我说一个例子。我去过北京一家非常著名的网站,当时
我们还有一个比较资深的 PHP 程序员在那说些系统架构的事情。我记得当时那个程序员问大家一
个数据结构中的算法问题的时候,全场没有一个人能答得出来(包括我)。然后那个程序员就开始给
大家讲些很基础的数据结构的东西了。让我一下子回想到大学时候学的数据结构课。而这些基础的
数据排序、查找、传递的问题在其他高级语言(比如 C )是非常普遍的。但是在 PHP 没有!PHPchina .
com 的论坛也有个板块叫 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
产品的用户都非常清楚了。速度快、容易被搜索到等等,好处不言而喻。开玩笑地说,现在网站的
主页实现网页静态化只需要硬盘足够大。至于 Caching 就比较复杂些,也是大多数 PHPer 感到头
疼的地方。甚至于有些人会用 C 来实现。因为 Caching 中的数据有效期验证、查找、提取、更新
等等都是比较难处理。当然,也有人会用数据库来处理 Caching 问题。
所以,当访问量激增的时候, PHP 架构的网站会出现的很多问题都因数据库而起。数据库的
http://www.phpchina.com ·PHPer· 41
同步问题还不算什么。关键是数据库的响应速度会有指数级的降低。这个问题我在 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 是草根吗?
作者:Hosander
来自:PHPChina.com
前言:以下文字并没有非常多的技术词汇,所以只要对 PHP 感兴趣的人都可以看看。
从 PHP 诞生之日起, PHP 就开始在 Web 应用方面为广大的程序员服务。同时,作为针对
Web 开发量身定制的脚本语言, PHP 一直秉承简单、开源的思想,这也使得 PHP 得以快速的发
展,并且大力地推动 Web2 . 0 的出现与发展。但是,长期以来, PHPer ( PHP Programmers )
被认为是处于草根阶层的程序员,被认为是技术含量少,层次低的程序员。这点在国内尤其突出。
记得一个技术主管说过这样一个事情。他给一个程序员分配了 PHP 的开发任务,没想到那个
程序员居然说:“我是学 Java 出身的,你让我去写 PHP ,你这不是在贬低我吗?”。这件事情给我
印象很深、触动也很大。虽然这不能代表大部分程序员的看法,但是这么认为的人应该不少。还有
人说,现在如果是大型的政府项目,PHP 是肯定不会被列入考虑的范围之内的。
那么为什么 PHPer 会被认为是草根阶层,是因为它很简单,人人都可以学会,所以没什么难度
吗?我以前也是这么认为。PHP 入门很快,处理文件,数据,远程连接,网络编程都非常方便,官
方也有这样的说法:PHP 学习的成本很低,所以你容易去使用它。这个想法也是普遍的,甚至大部
分的 PHPer 自己都这样认为。
说到这里,我想大家就会想到我为什么要写这些文字。一年多的 PHP 推广工作让我了解到许
许多多的使用 PHP 的公司的大概情况,在这些过程中我慢慢体会到其中的根本原因。这里我说是
根本原因虽然是个人的看法,但是我觉得事实就是如此。
那么为什么 PHPer 会被看成草根阶层,根本原因是 PHPer 所作的事情(通过代码实现)的绝
大部分都是表现层的东西,这个熟悉 PHP 的人都知道。当然也会有 PHPer 说他用 MVC 结构编写
的某某框架具备的如何如何的功能。但是这些还是表现层。所以只会处理表现层的程序员就被看成
草根阶层了。事实上也是如此,因为这种情况下 PHP 确实很难构造大型的应用。
这就找到原因了,不是的。为什么 PHPer 总是在负责表现层的东西呢。答案是底层的数据处理
( Web 应用就是数据存储和查找)我们一般不去触及!好,那么说到这里有些人可能已经想到了,
那不就是数据库吗!对,就是数据库!让 PHPer 一直当草根的元凶就是数据库。为什么?
因为目前流行的 web 架构中,前端是负载均衡系统,中间是 web 服务器,后面是数据库服务
器。所以,大部分 PHPer 工作在 Web 服务器层面。因为数据库已经很好地为我们组织数据了。所
以 PHP 中没有太多的算法,而且大家潜意识下也觉得不需要,更何况会影响性能与维护。
这种情况下,PHPer 就成为了数据库使用者,他总是在操作数据库。而不是在做程序。一个最
简单的 PHP 脚本就是,连接数据库,把数据取出来,然后用命令输出到浏览器。整个过程不超过 10
行代码。给人的感觉就是太简单了。没有任何技术含量。为什么,因为数据处理部分都已经被数据
库做完了。尤其是 MySQL 的使用! MySQL 是免费的,所以大多数程序员可以自由地使用它,另
外 MySQL 的速度够快了,所以做个 PHP 应用程序非常的简单。这就相当于给你枪以后你觉得没
有必要学习武功一样。当然,我不是说枪没有武功好。而是说,枪的出现,小孩都可以轻松便捷地
杀人了。
http://www.phpchina.com ·PHPer· 40 视点
我们再详细说说为什么是数据库!这里我说一个例子。我去过北京一家非常著名的网站,当时
我们还有一个比较资深的 PHP 程序员在那说些系统架构的事情。我记得当时那个程序员问大家一
个数据结构中的算法问题的时候,全场没有一个人能答得出来(包括我)。然后那个程序员就开始给
大家讲些很基础的数据结构的东西了。让我一下子回想到大学时候学的数据结构课。而这些基础的
数据排序、查找、传递的问题在其他高级语言(比如 C )是非常普遍的。但是在 PHP 没有!PHPchina .
com 的论坛也有个板块叫 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
产品的用户都非常清楚了。速度快、容易被搜索到等等,好处不言而喻。开玩笑地说,现在网站的
主页实现网页静态化只需要硬盘足够大。至于 Caching 就比较复杂些,也是大多数 PHPer 感到头
疼的地方。甚至于有些人会用 C 来实现。因为 Caching 中的数据有效期验证、查找、提取、更新
等等都是比较难处理。当然,也有人会用数据库来处理 Caching 问题。
所以,当访问量激增的时候, PHP 架构的网站会出现的很多问题都因数据库而起。数据库的
http://www.phpchina.com ·PHPer· 41
同步问题还不算什么。关键是数据库的响应速度会有指数级的降低。这个问题我在 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 是草根吗?