看到 swoole 又出黑料,忍不住分享一个 PHP 高并发方案

2020-09-04 01:13:18 +08:00
 HiCode

坦白说,今天其实在看 deno 的资料,一直有考虑换语言了,或是 js,或是 lua

回归正题,这个高并发方案是基于 Serverless,参考 Laravel Vapor 的思路:

利用 Serverless 开启一个 php-cgi 服务,再将函数接收到的请求数据,转发给 php-cgi 去处理,拿到响应数据后再返回给浏览器,这样就可以在 Serverless 继续以传统 PHP WEB 的方式来开发,无需做多余的适配。

项目地址在: https://gitee.com/haimadongli001/scf_php_cgi_proxy

用这个方案,目前很多 PHP 项目(要兼容 PHP 7.2 )可以无缝切换到 Serverless 服务上运行,轻松扛高并发。

当然,代码质量导致的系统缓慢和数据库链接数限制问题,就需要开发者自己“加钱”处理。

其他吐槽:

用了 PHP 好几年了,抄过 MVC 框架,写过 CMF 系统(自用不开源,上百项目使用过),玩过 PHP GUI 扩展( https://gitee.com/haimadongli001/php-iup )。其实编程能力到了一定程度后,语言的依赖性是非常小的,影响我们更换语言的阻力主要在自身积累和语言生态。

接下来先努力尝试在前端中切换到 lua (基于 https://fengari.io/ ),成功后就轮到后端来切换。

就这么定了,提前说再见,PHP!

2970 次点击
所在节点    PHP
17 条回复
blless
2020-09-04 01:30:40 +08:00
老实说,想不到动态语言在工程实践中有什么保障性可言。除非项目都是一个人写,不然动态语言自由度实在是太可怕了。就觉得没有啥特殊需求,后端干嘛非得死磕一些动态语言呢?
eslizn
2020-09-04 01:33:30 +08:00
serverless 也是靠堆机器
正途高性能方案有 reactphp/polarphp
eslizn
2020-09-04 01:34:37 +08:00
@blless 有很多短平快接口逻辑,及大多数适用 serverless 的场景都适合用动态语言
HiCode
2020-09-04 01:38:12 +08:00
@blless

对于技术人员来说,追求工程化无可厚非,而现实就是,大部分项目还没大到愿意为了工程化而降低效率。

这个世界很多事情都是草台班子搞出来的,接受这一点就理解为什么“动态语言会一直有市场”。
HiCode
2020-09-04 01:39:28 +08:00
@eslizn 你也可以在 serverless 里面开启 reactphp/polarphp,所有的扛高并发最终都是“靠堆机器”——谁也不例外。
eslizn
2020-09-04 01:46:46 +08:00
@HiCode “谁也不例外”这个结论不清楚你怎么得到的,反正我的经验是在海量服务的环境下,单机提升 10 倍以上带来的人力成本远低于机器成本。
ysc3839
2020-09-04 02:27:11 +08:00
但支持 PHP 的 Serverless 平台很少吧?搞不好会被锁死在某个平台上。还是选择大多数平台都支持的 Node.js 更为保险。
HiCode
2020-09-04 03:13:47 +08:00
@eslizn 唉,自己看 Serverless 的技术实现,你想强调性能的话,你也可以基于 Serverless 去启动 reactphp/polarphp 服务,你可以把 Serverless 当成是自动扩容系统。先去熟悉后再说。

然后,看看这个数据
https://www.techempower.com/benchmarks/#section=data-r19&hw=ph&test=fortune&l=zik073-f

哪怕是 swoole,也只有原生 PHP 2.97 倍的性能优势,除非你选用一个特别慢的 PHP 框架,不然达不到 10 倍差距的。

懒得回了。
HiCode
2020-09-04 03:21:23 +08:00
@ysc3839 唉,这个项目是一个代理层,代理层,代理层。

没要求你按特定方式去写 PHP 代码,按传统 web 开发方式去开发你的系统即可,这个代理层本身会解决 Serverless 环境问题。

所以不存在锁死在某个平台上的问题,哪天你想换其他平台了,阿里的函数计算本身有提供类似的代理层,亚马逊的平台可以参考 Laravel Vapor,你的业务系统代码依然可以拿到其他平台上去运行。
HiCode
2020-09-04 03:23:25 +08:00
在 PHP 技术圈最尴尬的事情就是,你说一个技术实现,一个开发思路的时候,总有很多人喜欢在不了解基础背景知识的情况下,来参与讨论。不是不欢迎这种讨论,只是是觉得很尴尬。
ysc3839
2020-09-04 03:24:08 +08:00
@HiCode 没明白你的意思,Serverless 平台不提供 PHP 环境怎么运行呢?
HiCode
2020-09-04 03:29:22 +08:00
@ysc3839 你去看 Laravel Vapor 的实现,亚马逊的平台是不提供 PHP 环境的。然后 Laravel Vapor 把 PHP 的可执行文件打包上传,再通过 node 或 python 去启动上传的 PHP 可执行文件。

Serverless 简单点可以理解为,提供了一个自动扩容的 linux 环境。
ysc3839
2020-09-04 03:43:30 +08:00
@HiCode 多谢指教!从理论上来讲确实有可能可以实现,不过关键在于平台是否允许执行可执行文件吧?这个还不好保证。
刚刚搜索了一下 "Laravel Vapor" on "firebase",似乎并没有成功案例,实际使用中可能还是受 Laravel Vapor 所支持的平台限制的。
HiCode
2020-09-04 04:16:39 +08:00
@ysc3839 你可以按这个思路去试一下在 Google Cloud Functions 上实现一个代理层。不排除谷歌真的你说的禁止执行可执行文件。
eslizn
2020-09-04 10:46:32 +08:00
@HiCode 你先看清楚你这个 2.97 倍性能是基于什么逻辑做的比较,我说的这些解决方案都是通过非阻塞 io 带来的高性能,在我实践过程中至少带来了 10 倍吞吐量的提升。serverless 也不是银弹,同样有它自己的缺点
HiCode
2020-09-04 13:10:32 +08:00
@eslizn 行行行,你喜欢就好,你要是真的有点击项目链接进去看,就知道我这个项目针对的是什么场景,项目文档里已经很明确说明适用场景了。不看就来评论的,我也懒得回了,你自己喜欢就好,继续吧!
agdhole
2020-09-09 19:32:57 +08:00
@ysc3839 #13 serverless 的 php 实现可以参考: https://github.com/juicyfx/vercel-php

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/704048

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX