再谈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秒钟内处理的程序数量是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句话。

12条评论:
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
6   四不象 2021-06-13 18:29
php还是无法处理io密集的场景,只能通过swoole或workman之类的非官方解决方案

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

正文:

  记住信息?

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

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

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

Blog存档 Archives

2022年07月
2022年06月(15)
2022年05月(20)
2022年04月(16)
2022年03月(9)
2022年02月(9)
2022年01月(10)
2021年 +

2020年 +
2019年 +
2018年 +
2016年-2017年(9)
2014年06月-09月(10)
2013年 +
2012年 +
2011年 +
2010年 +
2009年 +
2008年 +
2007年 +
2006年 +
2005年09月(4)

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