PHP的几个有趣的打开方式从初级到变态

PHP有很多打开方式,所以当我们聊PHP时,最好说清楚自己在说什么,比如:

PHP-FPM:传统的经典的动态语言使用方式

PHP-CLI:普遍的强大的高性能的使用方式

PHP-扩展:C/C++级别的扩展能力

以上三种打开方式大家可能都或多或少的了解一些:

PHP-FPM最流行的代表无疑是Wordpress,还有一大堆普遍常见的开发框架和开源产品,如ThinkPHP,Laravel,各类shop.

PHP-CLI也是最近流行起来的开发方式,比如Workerman/Swoole/React-PHP:能够获得更高的性能(相对PHP-FPM,主要是频繁加载等环节),类似Java和Go的部署模式,更多的网络开发能力,比如长链接/微服务,也有更安全的加载方式,比如以前的挂马方式就废了,PHP不再以动态加载的方式运行.

PHP-扩展却不是一个轻松地事,复杂的Zend-API让人望而却步,每个开发者都劝自己,不要搞扩展,好好活着,没必要深入C/C++,还不如学GO了.实际上PHP的扩展也有很多开发方式,比如swoole作者的PHP-X,和我介绍过的一个项目:PHP-CPP,他们把复杂的Zend-API抽象封装,让扩展的开发就像写PHP那样简单(真的,使用PHP-CPP写扩展真的跟PHP一样简单,强烈推荐)

几个有趣的打开方式

以上几种用法算是"官方的","标配的","兼容的"用法,就是说你在PHP-FPM可以运行的代码,在PHP-CLI也能运行,在PHP-扩展中也能调用成功.

但是这里我要介绍几个其他的打开方式,他们或许不能完全兼容原来代码的运行方式,但也为我们的一些业务提供了一些新的开发方式,满足我们一些特殊的要求.

KPHP

KPHP是一个PHP编译器,能够将PHP代码编译成本地二进制文件.

KPHP会将PHP的代码转换成等效的C++代码,然后编译生成的C++代码并以嵌入式HTTP的方式运行.可以把它认为是PHP的"转译",因为他是把PHP的代码"翻译"成C++的代码,但最终效果来看,也算是一个PHP的"编译器".

KPHP不是面向JIT的,所有的了类型都是在编译时(翻译成C++时)推断的,不存在"慢启动"阶段.

但是:

KPHP并不是一个万能的项目,他不是PHP的一个分支,也不是PHP的一个扩展,它是一个全新的独立的运行PHP代码的方式,他有很多的限制,你可能没办法编译你现有的项目(比如ThinkPHP).

KPHP的诸多限制:

不能编译本身就不能编译的功能,不能比如变量名调用函数:$fname()

不能编译破坏系统类型的代码,比如数组中混合数字和对象

一些PHP的细节特性,比如生成器和匿名类

KPHP和PHP本身有很多差异,比如在PHP中,运行时才会报错,而在KPHP中,必须修复所有错误才能运行,再比如在KPHP中所有的代码都是内联的,如果a文件需要b文件的函数,那就require引入b文件,这时其他文件不需要引入b文件也能调用到那个函数,同时KPHP不支持evel,反射,数组指针等等特性.

由于以上诸多限制,一般情况下你并不能将你现有的业务直接使用KPHP编译成二进制.

但是这并不代表他一无是处,你可以按照KPHP的规范标准去写代码,比如你系统中的某一个独立的小模块,然后把他编译成二进制文件,至少这部分系统不需要担心代码泄露的问题.

性能,你肯定想了解它的性能.

实际上对于密集的算法逻辑,比如冒泡排序,在网站给出的测试中:

PHP7.4花费毫秒,

KPHP花费毫秒,

只有四分之一的时间

如果将冒泡排序使用跟多的数组函数进行优化,

KPHP花费毫秒

C++花费毫秒

KPHP的性能几乎和C++一样

在小编看来,KPHP的性能确实不错,不过小编认为KPHP更棒的地方在于能够将PHP代码编译成二进制文件,这样我们在分发系统(产品)的时候,完全可以把最核心的技术和功能编译成二进制,避免代码泄露.

peachpie

另一个有趣的项目是peachpie,它能将PHP便以为.NET,这样就能获得.NET的能力,比如跨平台,二进制.

它的目标如下:

提高性能,一般的将PHP编译成.NET之后,性能会得到一定的提升

安全性.在标准化和可管理的.NET环境或.NETcore环境中运行,代码都是编译过的

跨平台开发,可以将PHP编译成可移植类库,在所有的.NET平台中运行

完全兼容.NET,为peachpie编写的代码与PHP完全兼容

双向操作,可以用C#和PHP混合编写,通过.NET框架通信

与之前介绍的KPHP而言,peachpie的目标和定位是为PHP提供一个新的运行平台,并且应当完全利用和兼容PHP的全部生态,这当然是美好的愿望.

但实际上,peachpie也并没有实现百分之百的PHP的特性,不过也完成了大部分:

更完整的函数表可以参考他的


转载请注明:http://www.aierlanlan.com/rzfs/1535.html

  • 上一篇文章:
  •   
  • 下一篇文章: