王志勇 发表于 2021年01月15日 10:30
在性能方面,在解释型语言里,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句话。
自由勇 2021-01-15 16:23
是的,不说还没发现。我读PHP比较习惯,因为有{},自己编写了一个程序分析器,分析每个花括号的开始、结束的位置。
Shell编程是if开始,fi;结束,感觉可读性远不如PHP。
自由勇 2021-01-15 21:25
多做几个项目就好了。
自由勇 2021-01-16 08:00
感谢参与回复!MySQL还是有不小的影响。
自由勇 2021-01-31 21:14
关于MySQL,最近刚想起来,也有优化得好的,就是2001年~2013年的younet.com,那个手机论坛的网站,是用PHP做的,应该是MySQL数据库。当时整个网站,在线人数应该在2000人~1万人左右。
自由勇 2021-01-16 08:04
我是从2009年开始PHP 5。
我在2001年认识一个人,他那时候是开发PHP 3、ASP的,当时我觉得他的这种双栈技术很高端。在那个时候我还不会编程,觉得编程是一个遥不可及的工程,经过千辛万苦,没想到第2年学会了ASP。
自由勇 2021-01-16 08:07
确实是思路在主导编程。
置顶的文章:
论朋友圈可以发什么?
短信验证开发的方案分享
巡回更新:2018-09-21
速度是永恒的主题
UTF-8、HTTPS原来都是浮云
https安全吗?
独立博客有必要安装https吗?
近期的主题:
关于照片能量
锂电池改1.5V煤气炉供电成功率后期反馈
本博客的后台语言历程(第一次透露)
怎样快速找到通讯录里的号码?
电信补4G卡后续
博客的赚$(赢利)原理
现在的上网浏览器
电信是否换4G卡/电信和移动SIM卡的区别
电信3G已经无法上网
《无名份的浪漫》(续记)
SSL必要与否(1)
大蓝最新视频节目的一点启发
版权声明:本博客所有文章,均符合原创的定义,禁止转载,违者将必究;正确的方法是贴原文的标题和网址即可。
与此相关的链接
自由勇专栏
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年 +