使用 swoft 的话是否完全可以抛弃 PHP -fpm?

2019-01-12 11:07:40 +08:00
 sunmoon1983
要开发一套新的商城,项目中想使用 swoft,但是没有相关的经验,很纠结,是否完全可以抛弃 php-fpm?

nginx 只用来反向代理或者处理静态文件!

对于用惯了 Yii2 的我们,在使用 swoft 的时候,有没有什么建议?

有没有什么坑需要注意?
15235 次点击
所在节点    PHP
49 条回复
elarity
2019-01-12 18:04:17 +08:00
作为一个拥有生产环境主导部署 swoole 的人,我决定现身说法一波儿,但可惜我并不是来推荐你用 swoole 的,我的态度是中立,我只客观描述事实,你自己做决定。

项目是我 前前东家 的时候,我是服务端主程,产品是基于 LBS 地理位置的陌生社交,名字叫做积目(不怕有人说我广告狗),用户在百万级别。这种情况下,至于你们敢不敢上 swoole,反正我敢。。。确切说,我是从一开始就直接用了 swoole,一直从几千用户支撑到了百万(可不是一百万,比这个还要高)以上。

说下这个东西相对于 fpm 的优势:
1、常驻内存,节省了 php 代码反复解析耗费的资源
2、可以使用长链接方式连接 mysql 等数据存储介质
3、可以使用 TCP 协议了
4、服务器上确实不用部署 nginx,fpm 了

我们从来没有尝试过异步写业务,这里的准则就是“没有钢筋钻,不烂瓷器活”。

swoole 在项目里的主要用途是部署内网 RPC 服务,对外则有 API Gateway 统一协议,端上是无法连接到 swoole 服务器的。

1、我们用的比较保守,尚未遇到过 core dump
2、内存泄漏一直是有的,但没有那么严重,除非你自己手很残,这个问题可以通过 max-request 参数来解决,类似于 fpm 中的 max-request

不会推荐,也不会不推荐,毕竟也不是什么银弹,用站着说话不腰疼的方式说就是“其实就是个 epoll 高性能网络库+worker 进程(只不过这个 worker 中能写异步代码也能写同步代码)”。

然后是这个东西在大公司,一直是没什么场景的,尽管天峰在不断布道。原来我在 momo 的时候,我知道的只有我们部门一个小项目在用;现在我在 didi,除了王晶(桶哥)那个部门,其他部门也暂未听说有场景应用。不过有趣的是,最近天峰去 momo 专门布道 swoole 了,是我 momo 同事告诉我的。

swoole 本身的值得尊重的,毕竟他弥补了现有 PHP 生态里最大的缺陷;但是,我并不会说什么但是,没有了。

对于绝大部分 PHPer 从业者而言,如果自身不具备科班出身或者较为踏实的基础,swoole 看起来很难,你不能指望以前连进程、socket 等、同步异步阻塞非阻塞这些概念都不理解的人能很快接受吸纳这个东西;

但实际上对于科班出身或者基础较为踏实的人来说,这个东西其实确实也没什么的。


最后说点儿有用的,如果你打算转 swoole,而且你的小伙伴基础不太好,最好保证你的小伙伴们快速熟悉一下下列概念,对于开展工作会有很大帮助,我认为是算是短期育肥比较有效的方法:
1、进程
2、进程间通信
3、同步异步阻塞非阻塞
4、socket,epoll
5、TCP 协议,主要是拆包,粘包概念

然后安利一下当初我们用的基于 swoole 1.9.22 封装的东西,希望你协助你快速开展业务拆分: https://github.com/elarity/ti-rpc

这个比 swoft 粗暴粗旷很多,几乎没有做什么厚重封装,理解起来会快太多太多
gouchaoer
2019-01-12 19:22:37 +08:00
@elarity swoole 的醍醐味就在于类似 golang 那样的协程,所以 2.0 以下的版本感觉比较鸡肋
salamanderMH
2019-01-12 19:31:41 +08:00
@sunmoon1983
是的,自己开个 http server。不过就像楼上说的,有内存泄露问题,我也是用 max-request 解决的。
@gouchaoer nodejs 有 await 和 async,写起来就跟同步代码一样
tanszhe
2019-01-12 19:48:40 +08:00
楼主可以试试这个 https://github.com/lizhichao/one
完全支持 fpm 和 swoole 的协成。如果觉得 swoole 不保险,完全可以在 fpm 下运行。
非常轻量的框架,如果用过 laravel tp 或者 yii 可能有似曾相识的感觉。
gouchaoer2
2019-01-12 20:36:24 +08:00
@salamanderMH await 和 async 也有 callback hell 问题啊,而且 php 和 nodejs 的生态最大的不同是 js 的 api 天生是异步的,而 php 天生是同步的,这就导致了一个问题,要把 php 的 api 改造成 async/await 都会遇到 callback hell 问题。。。于是干脆 hook 统一协程化
2kCS5c0b0ITXE5k2
2019-01-13 00:16:26 +08:00
如果是自己的项目随便玩啊,如果是工作还是快点写完摸鱼把,别老想着搞新技术,老板不认的.还嫌弃你做的慢....
k9982874
2019-01-13 00:23:50 +08:00
@gouchaoer #13 我觉得你对 node.js 有误解
sagaxu
2019-01-13 02:25:57 +08:00
@abcbuzhiming swoole 哪来的 jit?
@liaohongxing openssl 也有 free 无法释放的资源
@gouchaoer2 await 和 async 也有 callback hell 问题? 能举个例子吗
gouchaoer2
2019-01-13 12:43:47 +08:00
@sagaxu 如果把一个同步的 api 换成 async 的 api,那这个 api 就得一层层往里改 async
sunmoon1983
2019-01-13 13:29:19 +08:00
@zjsxwc 何以见得?
sagaxu
2019-01-13 13:33:44 +08:00
@gouchaoer2 https://jsfiddle.net/5ste9ou8/

function fa() {
(async function() {
const v = await fc();
alert(v);
})();
}

function fb() {
fc().then(function(v) {
alert(v)
});
}

async function fc() {
const a = await ft(1000) + await ft(2000);
return a;
}

function ft(delay) {
return new Promise(function(resolve, reject) {
setTimeout(function() {
resolve(delay);
}, delay);
})
}

ft 是一个传统的返回 Promise 的函数,它 sleep 指定的时间后返回。
fc 是一个 async 函数,因此 fc 里面可以 await ft 返回的 Promise,用同步的写法。
fb 不是 async 函数,所以它可以把 fc 的返回值当作 Promise 使用。
fa 也不是 async 函数,但是它可以使用 async 闭包 await fc 的返回值。
async 函数中也能使用回调,比如 function fb()改成 async function fb()也是对的。

被标记为 async 的函数 fc,
它不会把 async 往下层传递,下层继续使用 Promise,ft 是不需要关心它的调用者是不是 async 函数
它也不会把 async 向上层传递,fb 把它当作一个返回 Promise 对象的函数使用,fa 则通过 async 闭包调用它。
fa 和 fb 都是普通函数,他们的调用者可以是任意的函数,跟 async 一点儿关系都没有。

假如你把某个 API 换成了 async 的,作为使用者,我不需要做任何修改。但是 API 的内部实现,你可以获得 async/await 的便利性了。async 的传染性,只在你希望加入 await 的那一层,它不强迫调用它的上层函数做改变,也不强迫被它调用的下层做改变。


如果把一个同步的 api 换成 async 的 api,那这个 api 就得一层层往里改 async
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 这个一层层往里改,如何体现?
salamanderMH
2019-01-13 14:02:13 +08:00
@gouchaoer2 不用一层层改,套一层 Promise 就可以了
zjsxwc
2019-01-13 15:10:49 +08:00
@sunmoon1983

swoft 整体设计比 yii2 先进,比如 yii2 的依赖注入有点简陋,又比如 github 上那个 star 很多的 yii2 模板项目里面不少硬编码反模式改都改不了。
gouchaoer2
2019-01-13 15:12:31 +08:00
@sagaxu 我看不太懂,js 太难了
sunmoon1983
2019-01-13 18:46:25 +08:00
@zjsxwc 但是,我看 swoft 的 issue 里面也有好多问题~~而且,我们的商城业务肯定不会太简单,单独使用 swoft 的内置 server 我怕搞不定。。。
flowerains
2019-01-13 19:16:44 +08:00
@elarity 很赞成你说的这些话。
我们公司也是少有的把 swoole 用在生产环境的公司,希望有机会一起交流一下~
elarity
2019-01-13 19:46:52 +08:00
sagaxu
2019-01-13 19:56:09 +08:00
@gouchaoer2 js 的确复杂,我也不太懂。不过关于 async 传染性这一点,还是不要以讹传讹了。
sagaxu
2019-01-13 19:58:21 +08:00
@flowerains 我司可能是 swoole 最大用户之一了,swoole 处理的日请求量超过百亿
Govda
2019-01-13 21:58:32 +08:00
不如稳一手使用 fpm,选择这玩意儿写简单的项目还好,一旦大项目失控了转身成本太高。

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

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

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

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

© 2021 V2EX