|
|
6 ヶ月 前 | |
|---|---|---|
| .. | ||
| model | 7 ヶ月 前 | |
| .gitignore | 7 ヶ月 前 | |
| Makefile | 6 ヶ月 前 | |
| README.md | 7 ヶ月 前 | |
| build.sh | 6 ヶ月 前 | |
| go.mod | 7 ヶ月 前 | |
| go.sum | 7 ヶ月 前 | |
| lib_news.h | 6 ヶ月 前 | |
| main.go | 6 ヶ月 前 | |
本目录包含 news 插件的核心数据逻辑,该逻辑通过 Go 语言实现并通过 FFI (Foreign Function Interface) 提供给 PHP 使用。
main.go: Go 语言实现的 CRUD (增删改查) 服务,处理所有新闻和新闻分类的数据操作。lib_news.so: 由 main.go 编译成的共享库文件,PHP FFI 实际加载和调用的对象。Makefile: 自动化编译脚本。本模块的数据库连接信息不是硬编码在 Go 代码中的。它通过一个可导出的 Initialize 函数,在运行时由 PHP 动态注入。PHP 端 (NewsFfiService.php) 会从项目的 .env 文件中读取配置,并在第一次使用本模块时进行初始化。
由于 PHP-FPM 会在内存中缓存加载的 .so 库文件,因此每次修改 main.go 文件后,必须严格遵循以下步骤才能使改动生效:
修改 Go 代码:
在 main.go 文件中进行你的修改。
重新编译 .so 文件:
在当前目录 (backend/extension/news/ffi/) 下,运行 make 命令。
make
这将调用 Docker 来编译 Go 代码,并生成最新的 lib_news.so 文件。
重启 PHP-FPM 服务:
这是最关键且最容易忘记的一步。必须重启 PHP-FPM 容器来清除旧的 FFI 缓存,并强制它加载新的 .so 文件。
docker-compose restart php
⚠️ 警告: 如果你编译后没有重启 PHP-FPM,你的任何 Go 代码改动都不会生效,并且可能会遇到 Failed resolving C function 之类的错误。
将核心数据逻辑用 Go 实现并通过 FFI 暴露给 PHP,是基于代码安全和技术战略的综合考量。
这是采用 FFI 方案最主要的目的。
.php 文件) 在部署时是完全可见的。而 Go 是一种编译型语言,我们最终部署的是由源代码编译成的二进制共享库 (.so 文件),无需提供 .go 源文件。.so 文件反向工程出可读的 Go 源代码是极其困难的,需要专业的工具和深厚的底层知识。这为项目中最核心的业务逻辑提供了非常高级别的知识产权(IP)保护。对于当前模块执行的数据库增删改查(CRUD)这类 I/O 密集型 (I/O-Bound) 任务,性能并非首要考量,其特点如下:
注: 如果未来有 计算密集型 (CPU-Bound) 的任务(如复杂的算法、图像处理等),将其用 Go 实现则会带来数量级的性能提升。