PHP的使用很广泛,但你一般都会听到有人说“PHP性能不好”之类话。那么PHP到底为什么慢呢?怎么样才算快呢?
其实PHP有很多种运行方式,最传统也是大家最实习的就是PHP-FPM,这也是传统的建站方式。总结一下可以有这些:
这里对以上的说法做个简单的说明,在我其他的文章中基本都讲过,以后有机会系统的为大家介绍一下。
PHP-FPM(FastCGI Process Manager)是一个PHP FastCGI管理器,通常用作Apache或Nginx的FastCGI辅助程序,可以提高PHP应用程序的性能和稳定性。使用PHP-FPM,PHP进程可以在后台运行,并通过FastCGI最小化与Web服务器的交互,从而提高性能和减少服务器负载。PHP-FPM可以配置多个进程池,每个进程池可以有自己的配置选项,例如最小/最大进程数、最大请求数等等。
这是最基本的最传统的建站方式。优点就是稳,稳如老狗。同时又不用担心运维,更新程序的时候,只要把代码上传就行了。
就是一些基于命令行的利用EventLoop特性的框架,比如:workerman,Swoole、ReactPHP等等。这些框架有很多,我也有很多文章都介绍过,不再展开讲了。
PHP的扩展开发好像是一个黑洞,虽然PHP开发者都知道使用扩展开发性能会更高,但没有人会这样做。人们会自然地人为“凭什么要这么做”。这是因为PHP的扩展开发本身很困难。需要掌握C语言的编程能力,需要掌握内存管理等基础的编程经验,还要处理跨平台的兼容性,同时“大佬们”也都再说PHP扩展的接口很混乱,别往坑里跳。
实际上,PHP的开发对PHP开发者不应该这么难,因为PHP的语法吸收C语言,这使得C的语法会让PHP开发者很熟悉。至于接口混乱等问题,Swoole的作者出过一个C++的框架,可以使用C++开发扩展,叫PHP-X。同时还有一个C++框架叫PHP-CPP,这是个非常棒的项目:
1. PHP-CPP 是一个 C++ 扩展库,用于编写高性能的 PHP 扩展。
2. PHP-CPP 支持 PHP 的全部数据类型,包括数字、字符串、数组和对象等。
3. PHP-CPP 提供了简单易用的 C++ 接口,可以方便地和 PHP 交互。
4. PHP-CPP 的运行时性能高于 PHP 的脚本语言,减少了函数调用时的开销。
5. PHP-CPP 支持 PHP 5 和 PHP 7,可以满足不同的项目需求。
6. PHP-CPP 的学习曲线较平缓,易于入门,适合 C++ 开发者从 PHP 开始学习。
7. PHP-CPP 的开发者积极更新和维护,提供了良好的技术支持,可以解决开发者遇到的问题。
有兴趣的可以看我之前的另一篇文章:
《[PHP-CPP]使用C++来扩展PHP的能力》https://phpreturn.com/index/a62308e4c250c1.html
在我看来他最大的优势就是有一个健全的文档,许多程序员认为编写只有自己能理解的代码是一种荣誉。但他们不这样认为。PHP-CPP库已经完整地进行了文档化(文档可以在www.php-cpp.com/documentation找到),源代码包含有注释和解释。
如果您需要更多信息或希望查看源代码,那么可以轻松地找到您想要的(尽管与Zend引擎有关的内部部分有时会令人困惑,但这是因为Zend引擎非常复杂)。
所以请不要害怕PHP扩展开发了,如果你想进阶PHP的下一步,它值得你的关注。
这个标题可能让你感到困惑,这是我自己想到的最恰当的描述了,大致的意思是,把PHP的代码编译成其他的“东西”。比如编译成二进制,编译成.NET平台,编译成C++代码,或者直接把PHP当做node来运行js代码。
我写过另一篇文章,有兴趣的可以了解一下:
《PHP的几个有趣的打开方式:从基本到变态》https://phpreturn.com/index/a623dc0357dead.html
这个概念可能对于PHP开发者会比较陌生,但是JS的开发者可能会更了解一些。其实就是你不用买服务器了,把你的代码传到“平台”里,平台给这个代码分配计算资源。PHP也有一个专门对ServerLess机制友好的框架叫Bref,有兴趣的可以了解了解。
以上讲了这么多,是想说,PHP有很多运行方式,这些运行方式都是天差地别的,所带来的性能效果也完全不同,所以这很重要。
但一般我们讲PHP的时候,主要指的还是一般情况,下面就讲一讲。
什么叫好的代码?是说优秀的命名习惯?合适的分层封装?还是别的。这里我特指,执行起来很糟糕的代码,举个例子:
$user_name = Db::table('think_user')->where('id', 1)->value('name');
$user_credit = Db::table('think_user')->where('id', 1)->value('credit');
以上代码就是糟糕的例子,我使用了TP的数据库操作库,这没什么问题,tp的orm挺好的,但是它太方便了,导致有的新手会写出这样的代码,查询一个用户的名称和积分,他写了两行。他没意识到这样会有什么坏处,这就叫糟糕的代码。逼着更糟糕的是他更新字段的时候,也是更新两次,简直气炸人。
这个是一个比较玄学的事,倒不是说对性能的影响不好判断,而是说,这种做法是在性能和开发体验上的一个平衡。最直观的就是ThinkPHP和Laravel框架之间的对比,ThinkPHP数据轻量级的框架,Laravel则是重量级的框架,他们之间技能在代码数量和大小上体现出来,在运行速度上也能体现出来。这其实涉及到开发者和开发团队的开发规范,并不值得大惊小怪。
在前面举了一个数据库操作的例子,其实大多数的瓶颈都发生在数据库上,所以在业务代码中加上缓存,是一个必须要做的事。你可以想象一下,官网的首页可能要加载多个表的多个数据,如果没有缓存,用户的每次访问都会请求数据库,但其实没必要,如果加上缓存,即便是再多的人,也只是请求一次数据库而已。
一般来讲,越新的PHP版本运行速度更快。这里着重讲一PHP8.0。PHP8.0是最后一个对老版本代码兼容性比较友好的版本了,升级的PHP8.0基本不会有什么障碍,同时又能在不改动任何代码的情况下,提高10%左右的运行速度。我的自媒体网站使用PHP7.4时,首页的访问在110-160毫秒波动,使用了PHP8.0之后,最快的访问直接降到70毫秒左右。没有任何的代码改动。当然,使用PHP8.1会更快,但是一般会遇到小小的兼容性问题。
同时PHP一定要开启Opcache。这是传统PHP-FPM的标配,很多人都没意识到这一点,这样不好。
显而易见,硬件性能越高,PHP的运行速度就会越快。但其实,只能说能够承载的访问更多而已,或许每个代码的执行还是之前的那个速度。如果真的像压榨服务器的性能,最起码得上个“高性能框架”才行。
像Workerman、Swoole、ReactPHP等,都可以利用Linux的高性能特性,具体的这里不展开介绍了,这类介绍也很多,光我就写过几篇文章了。
其实说到底,PHP开发者的水平越高,性能越好,对吧。
原文标题:php 执行速度影响因素有哪些?
原文地址:https://phpreturn.com/index/a6429846d6ae85.html
原文平台:PHP武器库
版权声明:本文由phpreturn.com(PHP武器库官网)原创和首发,所有权利归phpreturn(PHP武器库)所有,本站允许任何形式的转载/引用文章,但必须同时注明出处。