首页   注册   登录
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX  ›  PHP

golang 写 php 扩展

  •  
  •   vigoss · 2015-12-25 13:33:37 +08:00 · 4657 次点击
    这是一个创建于 1420 天前的主题,其中的信息可能已经有所发展或是发生改变。

    最近在自己的开发环境上测试了一下 golang 写 php 扩展的可能性

    https://github.com/Aimsam/go2php_trial

    用到了 go1.5 新特性 buildmode=c-shared

    结果是虽然成功编译运行, golang 的函数也正常运行了,但是很大概率会 Segmentation fault 。虽然到了不了能用的地步。但是至少说明还是可行的吧: )

    12 回复  |  直到 2019-10-09 11:53:24 +08:00
        1
    johnsneakers   2015-12-25 13:49:48 +08:00
    楼主, 我想问一下 Go 写 PHP 扩展主要是用在什么地方?
        2
    vigoss   2015-12-25 14:06:31 +08:00 via Android
    并发长连接吧,可惜还到不了可用的地步。
        3
    pathletboy   2015-12-25 14:20:58 +08:00
    @vigoss 直接用 go 整 web ,岂不是更好?如果只是为了在原有 php 项目上扩展,那可以反代某级 url ,比如
    http://xxxx/go-api/,这样可以最小改动的情况下,利用上 go 的特性。
        4
    vigoss   2015-12-25 14:27:56 +08:00
    很多情况下 golang 还是无法替代 php 的,事实上要 php 项目也会安装大量扩展才可用的,只是一个小例子了,并不是要这么开发了,你说的是一个办法很多情况下也是这么做的。
        5
    ncisoft   2015-12-25 14:46:55 +08:00
    层上各种图样,显然楼主不会 c/c++,没法给 php 写扩展,刚好 golang 可能可以, but 仍然图样,用 golang 写扩展了, golang 的 gc 肿么办
        6
    vigoss   2015-12-25 15:16:00 +08:00
    @ncisoft 求你不要说出真相。不过我猜测 golang 生成的变量应该是 golang 负责回收的, C 申请的依然需要手动回收。当然目前看肯定是有问题的。
        7
    ncisoft   2015-12-25 15:37:07 +08:00
    @vigoss 抱歉, php 我不熟悉,不知道写插件怎么管理内存的,不过 lua 对插件的内存回收支持非常赞,可以对 c 中申请的内存配置自己的关方法来 free 内存、关闭句柄,你配置好了之后, lua gc 自动帮你调用回收
        8
    vigoss   2015-12-25 17:13:28 +08:00
    @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   36 天前
    挖坟了,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   36 天前
    em...这个坟挖得很远了。个人感觉不可用的原因主要还是,实际上是 C->Go 并不是完美无缝的。
    关于   ·   FAQ   ·   API   ·   我们的愿景   ·   广告投放   ·   感谢   ·   实用小工具   ·   4071 人在线   最高记录 5043   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.3 · 29ms · UTC 07:27 · PVG 15:27 · LAX 23:27 · JFK 02:27
    ♥ Do have faith in what you're doing.