再谈PHP与其它语言相比的优点

王志勇 发表于 2021年01月15日 10:30

本文主要涉及开发速度和日常使用的性能需要,也顺便提一下后台语言Node.js。前几天在V2EX看到有篇帖子是对比PHP和Golang,里面提到有人唱衰PHP。我做PHP编程的时间比较长,2009年至今。之前2002年~2009年都是做ASP编程,因为在那个时候,Web语言主要就是ASP、PHP、CGI,后来相继出现JSP、ASP.net,再后来又有了Golang、Python。

在性能方面,在解释型语言里,PHP应该是属于出类拔萃的。PHP的瓶颈,主要是MySQL,所以会给人一种效率低的印象,并且使并发量大为降低,解决的办法是不用MySQL,而且MySQL备份也很麻烦,备份文件是一个比原数据要大得多的庞大的xml文件。PHP的语法和JavaScript这两者其实有95%以上相似,前面已经对比过了,前文1前文2。所以如果是为了追求JavaScript语法,完全不用学习Node.js,PHP和JavaScript的语法两者就高度相似。

可能很多人会觉得PHP比JavaScript难,其实相反,PHP相对比JavaScript简单一些。这是因为JavaScript要考虑浏览器兼容问题;PHP 5和PHP 7只有少量语法不同,大部分是一样的。

PHP相对比JavaScript简单还体现在,PHP可以独立完成复杂的程序项目,但是JavaScript的编程只能做前台。如果想让页面的效果更酷、更专业一些,PHP必须加上JavaScript。

会PHP的人,JavaScript基本上不用额外学习。
先学PHP,JavaScript能自动学会。
如果直接学习JavaScript,会很难学。

Node.js虽然是编译型语言,但是也有人做过测试,它的执行效率比PHP低。

抗高并发
在抗高并发方面,如果克服了MySQL的瓶颈,理论上PHP的高并发数应该是比较可观的,至少不在Java之下

Apache和Nginx在抗高并发的对比,只能从学习资料、教程里找到过去的老数据。Apache默认是10个进程,也可以把进程数调到50,同时服务器的内存配置需要提高。

如果一个PHP页面在Apache执行完成的时间是10微秒,即0.01毫秒,则理论上10个Apache进程和秒钟处理的程序数量是1*1000*10/0.01=100*1000*10=1000000个,50个进程就是理论上1秒钟处理5000000个程序文件

同理如果一个PHP页面在Apache执行完成的时间是1微秒,则处理能力提高10倍。

程序处理数量,就是理论并发数。实际应该不会有这么多,1秒钟达到100万~500万次,有其它因素在影响并发数,比如硬盘的寻址时间、加载到内存的时间。除去各种因素,理想值除以100,那么并发数1万次~5万次应该是有的,如果服务器是双核CPU,这个并发数应该又可以翻倍。

这很类似于电脑里拷贝、或删除一个100MB的文件,不到一秒钟完成。但是拷贝、或删除2万个小文件,总体积也是100MB,但是时间却需要几分钟、十几分钟。

还有就是MySQL的读取时间比程序执行时间要长得多,可能要达到0.5秒以上,所以使10个Apache进程的并发数骤降到1*10/0.5=20次。10个Apache进程的并发数从理论1万次,骤降到20次。

在前面我做过PHP多版本、在多平台的执行速度小测试:(只做循环程序单项)
http://www.auiou.com/relevant/00001472.jsp

在PHP 7.4下,用循环程序累加1000万次,耗时仅0.0539微秒
而运行了这么多年的PHP 5执行速度也非常快,用循环程序累加1000万次,PHP 5.3耗时0.48微秒,PHP 5.5耗时0.26微秒。

可以侧面看出,PHP在Apache和Nginx下的执行速度是完全一样的

所以,就是一个普通的VPS,如果带宽足够的话,理论上PHP能承载500~2000以上的并发是没有多大问题的。PHP的性能,可能被严重低估。

相反,一些新型的高性能Web编程语言,以及新型的编译型Web编程语言的性能可能会被高估,因为任何语言都可能存在瓶颈,瓶颈很多都出在数据库上
比如在测试中,单是程序这一块能承载1万以上的并发,但是连上数据库之后就只能支持不到1000并发。

Apache和Nginx
Apache和Nginx有一个很大的区别是Apache支持.htaccess,如前文1前文2。也有人唱衰Apache,认为.htaccess应该淘汰了,最基本的作用是用404错误页实现很多复杂的URL伪静态
这么重要的应用,至今还没有替代的方法,怎么可以说淘汰就淘汰?只能说,优秀的技术突然失传了,而不是淘汰了。

Nginx实现伪静态只能用Rewrite。Apache既能用404错误页,也能用Rewrite实现伪静态,而且用Rewrite设置既复杂、又会多占用一点资源。

至少PHP有很多不可替代的作用。业内很多大厂用Java,Golang,很多人认为PHP是中小企业的选择。在多年的实战经历里,我不认为PHP只能做中小规模的项目,这种执行效率高、且语法又简洁的语言完全可以做大部分的大型项目,甚至是一些高并发的项目如百度贴吧、淘宝平台,到达瓶颈时可以采用分流,就像一个演唱会的会场,可以容纳的人数是有一个上限的。

语法
在语法方面,PHP确实有一个值得吐槽的底层设计,是每个变量前都要加$。这可能是原始的设计者,为了Ctrl+F便于查找这个变量。但是,EmEditor等这类文本工具,支持“仅搜寻单字”。即使变量前没有$,也能找到这个变量。

EmEditor用Ctrl+F查找时,如果“仅搜寻单字”打上勾,比如想查找关键“abc”,程序文件中有“abcd”这个变量,这时候搜索结果只会找到“abc”的变量,“abcd”则找不到,这是一个很重要的功能。

变量前多加个$,会使每个程序文件增加不少字节,在高并发环境中,这个文件的体积对性能是有一定影响的。并发数少于1000,应该是体现不出来。

关于文件体积。在输出的Web的HTML页,百度贴吧页,本来15K~20K的页面,实际是200多K。现在还好一些,以前是300多K。也就是说,里面90%都是可以去掉的冗余代码,去掉之后,前台的页面显示没有任何变化。

可见,很多大厂并不那么在乎性能的极限优化,遇到瓶颈就提高机器配置。

Golang的语法让我很难接受的是每个语句必须回行,不像PHP、JavaScript那样写分号之后可以不回行(这样能使程序更加区域化,一看就是关联性强的程序片段)。

因为Golang的语法强制语句必须回行,所以不利于程序的自由排版,在大型项目里可读性不如PHP、JavaScript。以前流行的ASP,也强制语句必须回行。

所以,凡是强制语句必须回行的语言,都会降低开发速度,因为可读性降低。因为可读性造成的开发速度降低,有时会有2~3倍的差距

PHP和Python
作为Web,PHP的性能应该是在Python之上。但是服务器后台,Python功能比PHP强大。
我的解决办法是,暂时用PHP+Shell。

技多不压身,能多学一门语言总是好的。但是,PHP在短期内还是很难被彻底替代,它的作用被严重低估了。曾有人说“PHP是Web之王”、“PHP是世界上最好的语言”,这2句话有80%~90%正确,PHP写得多了会越理解这2句话。

11条评论:
1   小陈故事 2021-01-15 15:40
习惯于PHP严谨的写法后,对Python感觉总是有点别扭,看不到{}不舒服。

自由勇 2021-01-15 16:23
是的,不说还没发现。我读PHP比较习惯,因为有{},自己编写了一个程序分析器,分析每个花括号的开始、结束的位置。
Shell编程是if开始,fi;结束,感觉可读性远不如PHP。

2   执迷不悟 2021-01-15 20:08
羡慕你们这些会编程语言的大佬,有啥想法可以自己动手实现,不像我,只能看着干瞪眼,要不就只能忍受。

自由勇 2021-01-15 21:25
多做几个项目就好了。

3   Godruoyi 2021-01-15 22:32
额怎么说呢,我不赞成说 mysql 是导致 php 性能低的关键。即使一个 1c2g 的数据库,其能达到的并发量也在 600 左右,而在一个 4c8g 的服务器上,php 能表现出来的 qps 也只能达到 4/500,要是涉及数据库调用,就更满了。问题不是出在数据库,而是 fpm,或是你说的 apache ,若你把 server 换位一个常驻内存的服务,比如 swoole ,其能达到的 qps 有 4/5000。

自由勇 2021-01-16 08:00
感谢参与回复!MySQL还是有不小的影响。

自由勇 2021-01-31 21:14
关于MySQL,最近刚想起来,也有优化得好的,就是2001年~2013年的younet.com,那个手机论坛的网站,是用PHP做的,应该是MySQL数据库。当时整个网站,在线人数应该在2000人~1万人左右。

4   CcChen 2021-01-16 00:05
php开展小项目还是很合适的。我是从php3开始撸php,当年我只有一点C基础,完全自学是没有问题的。
go貌似只有我们兲潮比较吃香吧。
因为工作需要,现在还是用python比较多。总体而言python的轮(隔开)子会多点,扩展性会更好。
其实不用拘泥于那种语言,思路是共通的。选择合适的解决方案就行了。

自由勇 2021-01-16 08:04
我是从2009年开始PHP 5。
我在2001年认识一个人,他那时候是开发PHP 3、ASP的,当时我觉得他的这种双栈技术很高端。在那个时候我还不会编程,觉得编程是一个遥不可及的工程,经过千辛万苦,没想到第2年学会了ASP。

自由勇 2021-01-16 08:07
确实是思路在主导编程。

5   哥斯拉 2021-01-17 23:17
高并发,效率,推荐go

发表评论:
名字: (*必填)
博客: (可省)

正文:

  记住信息?

王志勇:1980-09-26 (41周岁)
程序设计,前端设计。

版权声明:本博客所有文章,均符合原创的定义,禁止转载,违者将必究;正确的方法是贴原文的标题和网址即可。

与此相关的链接
自由勇专栏

Blog存档 Archives

2021年01月(30)
2020年12月(19)
2020年11月(18)
2020年10月(15)
2020年09月(14)
2020年08月(14)
2020年07月(14)
2020年06月(16)
2020年05月(13)
2020年04月(18)
2020年03月(14)
2020年02月(15)
2020年01月(16)
2019年12月(11)
2019年11月(26)
2019年10月(25)
2019年09月(30)
2019年08月(10)
2019年07月(29)
2019年06月(30)
2019年05月(26)
2019年04月(30)
2019年03月(30)
2019年02月(30)
2019年01月(30)
2018年12月(30)
2018年11月(30)
2018年10月(30)
2018年09月(17)
2016年-2017年(9)
2014年06月-09月(10)
2013年 +

2012年 +
2011年 +
2010年 +
2009年 +
2008年 +
2007年 +
2006年 +
2005年09月(4)

Copyright © 2006-2021 auiou.com All rights reserved.
此Blog程序由王志勇编写