php转go?还是php+swoole?

摘要:
从最早的apache+mod_Php,到后来的nginx+Php_Fpm,再到Php+swoole。从作曲家到psr,从开发php业务代码到编写php语言扩展。我甚至想为PHP添加光纤支持。如果使用fpm,则必须伴随重复应用和资源破坏;如果使用swoole等常驻组件,则应注意内存泄漏问题。虽然围棋在早期也有GC,并停止了世界,但它不再是一个问题。Swoole的高性能只是由于内存驻留灯。我最期待的是8.1的光纤特性,这是社区对swoole等解决方案的响应。到那时,swoole计划应该会逐渐退出历史。

一个老 PHP 程序员建议直接转 go。

我是在 2021 年夏天转 go 的。在那之前,写了很长时间的 php,对这门语言有很深的感情。

php 是我在大学里学的第一种脚本语言。当时流行的是微软的 asp 和 java 的 jsp。jsp 太麻烦,微软的东西我又很排斥,然后就在图书管找到了 php 的参考资料。当年我买了第一本 php 教程。你没看错,当时是有一个 PHP6 的。后来跳票,最终被 PHP7 取代了。

我从这本书学到了使用 PHP 动态生成 html 技术。当时惊为天人,原来还可以这样玩。可以说这本书为我打开了新世界的大门,甚至决定了我毕业的职业生涯。书里的有一些PHP6相关内容确实过时了,但大部分内容是版本无关,非常经典。到今天也值得阅读。

毕业后我的首份工作就是 PHP 开发,当时 PHP 程序员还是相对稀缺的,所以我也顺利拿到 offer。

php的出身定位是web,简单快速,线程的维护较为复杂,用进程来维护反而就简单很多,所以php_fpm会开启多个进程,底层的东西交给虚拟机去完成,所以说php不是不支持多线程,是大多数的框架都是基于php_fpm,gci统一网关的方式,进程级别的。

从最早搞 apache + mod_php,再后来搞 nginx + php_fpm,再后来是 php + swoole。从 composer 到 psr,从开发 php 业务代码到写 php c 语言扩展。甚至还想着给 php 添加 fiber 支持(最终失败了,但 PHP 8.1 引入 fiber 支持,大赞)。有一段时间我希望所有的功能都用 PHP 实现。

所以在2017年有同事向我推销 go 语言的时候,我是拒绝的。


但到了 2018 年,当我有机会从零开始构建业务系统的时候,我开始认真考虑还用 PHP 是否合适的问题了。最终我的结论是「Go(至少)是更好的PHP 」

像 PHP 这类动态语言,开发效率方面快则快矣,但后期的维护成本非常高。PHP 的 Zend 虚拟机本身性能比较差(现在支持 jit 了,但效果有限)。PHP 的垃圾回收使用的引用计数法。为了解决循环引用的问题,不得周期性的停止运行扫描可疑对象(也就是所谓的 stop the world)。如果使用 fpm,那必然伴随着资源的反复申请与销毁;如果使用 swoole 这一类的常驻组件,那要留心内存泄漏的问题。此外,如果 PHP 程序员想更进一步,则需要学习 c 扩展等知识。PHP 社区很多关键的功能都需要 c 语言。c 语言跟 PHP 又差别太大,一般程序员很难完成这一步跨越。

而 Go 语言则几乎囊括了 PHP 的优点而且基本没有对应的缺点。Go虽然也有GC,早期也有 stop the world 的问题,但现在已经不是什么问题。Go语言虽然的强类型的静态语言,但支持类型推导,写起来也不比 PHP 更麻烦。做为一个基础平台,Go没有虚拟机的解释运行开销,可以最大程度利用CPU,这是PHP很难望其项背的。Go语言本身实现了自举,其本身源码是Go代码加上少量汇编。如果程序员有心深入学习,比PHP程序员学 c 语言要容易多了。

那 Go 语言就没有缺点吗?肯定有。在 2018 年的时候,Go 社区还没说要支持泛型,所以在有些场景下需要写很多重复的代码。这确实是一个劣势。但 Go 内置的 map 和 slice 支持声明类型,再辅之以接口和 interface{},基本可以应该常规业务。这个我在文章里已有分析。现在是 2021 年了,再过半年,Go1.18就会支持泛型,到时候 Go 语言就没有什么硬伤了。

要说起并发和网络编程,很少有语言可以跟 Go 语言 PK,PHP则更是不入流。Swoole 的高性能也仅仅是沾了常驻内存的光。只要是常驻内存的方案,比如 amphp 或者 php-pm,性能都甩 php-fpm 几条街,不是它们有多优秀,而是 php-fpm 太慢了。这些性能跟 Go 相比还是差太远。无论这些方案多么精巧,都摆脱不了 Zend 虚拟机的限制:jit 不行、gc 不行。

我现在已经很少写 PHP 了,但依然关注 PHP 的发展。最令我期待的就是 8.1 的 fiber 特性,这是社区对 swoole 这一类方案的回应。到时候 swoole 方案应该会逐步退出历史。但讲道理 PHP 社区并没有着手解决困扰 PHP 的核心问题(jit 和 gc 等),而是在纠结一些不是很重要的问题。

不能说这些改动没用意义,但确实是可有可无。相反,Go 社区则在引入泛型的支持,改用寄存器传参以进一步提高性能,不断改善 gc 延时,优化 defer 执行效率。Go没有太多语法糖,但社区却在实打实把精力放到核心组件上。这让我也觉着 PHP 真是有点日薄西山的意思了。

那 PHP 语言就没有优点吗?肯定有。PHP+MySQL积累了大量的社区财富,像 WordPress 等重量级的应用都是 PHP 开发的,PHP 社区也有像 Laravel 这样优秀的框架。如果你懂 PHP 而且能招到人,那使用PHP快速搭建系统原型是很方便的。但我们也要看到这只是一种历史惯性。随着Go语言的崛起,越来越多的人转Go,现在PHP程序员也越来越难招。最终PHP社区会不断消亡。现在还用PHP的,不是维护老系统,就是希望你转Go或者Java。新系统用 PHP 的已经很少了。

免责声明:文章转载自《php转go?还是php+swoole?》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇学习正则表达式Linux下安装Nginx并实现socket代理下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

php循环删除文件目录及文件

删除文件及目录: 1 //循环删除目录和文件函数 2 function delDirAndFile( $dirName ) 3 { 4 if ( $handle = opendir( "$dirName" ) ) { 5 while ( false !== ( $item = readdir( $handle ) ) ) {...

Ubuntu + pip + Python3 + CPU版本 PaddlePaddle 安装

需要确认您的 Ubuntu 14.04/16.04/18.04 是 64 位操作系统 确认您需要安装 PaddlePaddle 的 Python 是您预期的位置,因为您计算机可能有多个 Python which python3 根据您的环境您可能需要替换本说明中所有命令行中的 python3 为 python ,或者替换为具体的 Python 路径) 同...

第一篇 pycharm安装及设置

1.下载pycharm包安装 (1)安装好Python 安装后在命令行中输入python 检查是否安装成功(进入py的交互行) (2)安装好Python 需要两个地方配置到环境变量里面 1.python的安装目录(python.exe在该文件夹中) 2.以及安装目录中的scripts(模块) 2.破解pycharm 3.pycharm的设置 (1)设置通关...

PHP站内搜索:多关键字、加亮显示

一、SQL语句中的模糊查找       主要通过LIKE(不区分大小写)关键字实现模糊查找。LIKE条件一般用在指定搜索某字段的时候, 通过"%"或者" _" 通配符的作用实现模糊查找功能,通配符可以在字段前面也可以在后面或前后都有。只通过LIKE是无法实现模糊查找的,因此通配符的作用不可忽略。下面是三个实例:搜索以PHP开头:SELECT * FROM ...

Python安装sqlite3

今天使用PYthon时,发现错误 ImportError: No module named sqlite 这是因为缺少 SQLITE3的缘故。 下面分享一下解决此问题的方法步骤: 1. 查看是Python是否有该库 使用http://django-china.cn/topic/413/ 查看自己Python库的路径, >>> impor...

Windows和Linux下查看Apache、MySQL、PHP版本

# Windows查看Apache版本: 使用命令:httpd -v # Linux查看Apache版本: 使用命令:apachectl -v # Windows查看MySQL版本: 使用命令:mysql --version # Linux查看MySQL版本: 使用命令:mysql -V # Windows查看PHP版本: 使用命令:php -v...