最近在自己的开发环境上测试了一下 golang 写 php 扩展的可能性
https://github.com/Aimsam/go2php_trial
用到了 go1.5 新特性 buildmode=c-shared
结果是虽然成功编译运行, golang 的函数也正常运行了,但是很大概率会 Segmentation fault 。虽然到了不了能用的地步。但是至少说明还是可行的吧: )
1
johnsneakers 2015-12-25 13:49:48 +08:00
楼主, 我想问一下 Go 写 PHP 扩展主要是用在什么地方?
|
2
vigoss OP 并发长连接吧,可惜还到不了可用的地步。
|
3
pathletboy 2015-12-25 14:20:58 +08:00
@vigoss 直接用 go 整 web ,岂不是更好?如果只是为了在原有 php 项目上扩展,那可以反代某级 url ,比如
http://xxxx/go-api/,这样可以最小改动的情况下,利用上 go 的特性。 |
4
vigoss OP 很多情况下 golang 还是无法替代 php 的,事实上要 php 项目也会安装大量扩展才可用的,只是一个小例子了,并不是要这么开发了,你说的是一个办法很多情况下也是这么做的。
|
5
ncisoft 2015-12-25 14:46:55 +08:00
层上各种图样,显然楼主不会 c/c++,没法给 php 写扩展,刚好 golang 可能可以, but 仍然图样,用 golang 写扩展了, golang 的 gc 肿么办
|
6
vigoss OP @ncisoft 求你不要说出真相。不过我猜测 golang 生成的变量应该是 golang 负责回收的, C 申请的依然需要手动回收。当然目前看肯定是有问题的。
|
7
ncisoft 2015-12-25 15:37:07 +08:00
@vigoss 抱歉, php 我不熟悉,不知道写插件怎么管理内存的,不过 lua 对插件的内存回收支持非常赞,可以对 c 中申请的内存配置自己的关方法来 free 内存、关闭句柄,你配置好了之后, lua gc 自动帮你调用回收
|
8
vigoss OP @ncisoft 哈哈开个玩笑,我也只是验证一下是否可行。 php 的扩展是用 C 来做的, API 里封装了一些函数,是否稳定还是看 C 的功力了。你提的到“ lua 对插件的内存回收”是指的用 lua 做 C 的 GC ?我不太了解 lua 也不太会 C
|
9
ncisoft 2015-12-25 17:18:45 +08:00
@vigoss lua gc 运行中,会依据依赖关系自动连带处理你在 c 扩展中申请的内存,通过调用你配置的 gc 方法( c 回调函数)来释放所分配的内存,设计相当优美
|
10
xiaotianhu 2015-12-25 17:31:35 +08:00
关注一下,技术栈跟 lz 重合
也梦想用 golang 写扩展... |
11
gecco 2019-10-08 23:46:03 +08:00
挖坟了,Lua gc 这样配置确实能说设计相当优美,但是用 Golang 给 PHP 写扩展,比如一个 Golang 实现的 func sumGo(a int,b int) int,实际上需要导出供 C 语言 int sum(int a,int b){return sumGo(a,b);}调用,然后 C 语言经过封装成.so 文件成为一个 PHP 扩展供 PHP 调用,这边的 Golang 的回收是由 Golang 的运行时来处理的,C 语言内的回收需要自行处理,且也最为重要,但到了 PHP 就只管调用就好,如果提供回收方式更佳,其调用及回收路径实这样的:PHP->C->Go,实际 PHP 调用完 C 的实现,除了所谓的 PHP 脚本结束自动释放内存外,PHP-FPM 会在达到设定的请求数后重启当前 FPM 进程,避免第三方扩展内存泄露。
为什么要写扩展,这个问题我觉得我们就不讨论了,在要写扩展的前提需求下,这边为什么用 Golang 写 PHP 扩展的原因应该在于语言熟练度及使用的难易程度,学习和熟练 Golang 的速度可能比 C 语言更快,一家之言,仅供参考。 |
12
vigoss OP em...这个坟挖得很远了。个人感觉不可用的原因主要还是,实际上是 C->Go 并不是完美无缝的。
|