golang调用php7的方法是怎样的
发表于:2026-11-04 作者:千家信息网编辑
千家信息网最后更新 2026年11月04日,这期内容当中小编将会给大家带来有关golang调用php7的方法是怎样的,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。golang 调用 php7使用 https:
千家信息网最后更新 2026年11月04日golang调用php7的方法是怎样的
这期内容当中小编将会给大家带来有关golang调用php7的方法是怎样的,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。
使用 https://github.com/taowen/go-php7
基于 https://github.com/deuill/go-php 修改而来,fork缘由(https://github.com/deuill/go-php/issues/32)
执行php文件
func Test_exec(t *testing.T) { engine.Initialize() ctx := &engine.Context{ Output: os.Stdout, } err := engine.RequestStartup(ctx) if err != nil { fmt.Println(err) } defer engine.RequestShutdown(ctx) err = ctx.Exec("/tmp/index.php") if err != nil { fmt.Println(err) }}其中 /tmp/index.php 的内容为
Eval,返回值
func Test_eval(t *testing.T) { engine.Initialize() ctx := &engine.Context{} err := engine.RequestStartup(ctx) if err != nil { fmt.Println(err) } defer engine.RequestShutdown(ctx) val, err := ctx.Eval("return 'hello';") if err != nil { fmt.Println(err) } defer engine.DestroyValue(val) if engine.ToString(val) != "hello" { t.FailNow() }}返回的value的生命周期所有权是golang程序,所以我们要负责DestroyValue
设置全局变量来传参
func Test_argument(t *testing.T) { engine.Initialize() ctx := &engine.Context{} err := engine.RequestStartup(ctx) if err != nil { fmt.Println(err) } defer engine.RequestShutdown(ctx) err = ctx.Bind("greeting", "hello") if err != nil { fmt.Println(err) } val, err := ctx.Eval("return $greeting;") if err != nil { fmt.Println(err) } defer engine.DestroyValue(val) if engine.ToString(val) != "hello" { t.FailNow() }}传递进去的参数的生命周期是php控制的,在request shutdown的时候内存会被释放。
PHP 回调 Golang
type greetingProvider struct { greeting string}func (provider *greetingProvider) GetGreeting() string { return provider.greeting}func newGreetingProvider(args []interface{}) interface{} { return &greetingProvider{ greeting: args[0].(string), }}func Test_callback(t *testing.T) { engine.Initialize() ctx := &engine.Context{} err := engine.RequestStartup(ctx) if err != nil { fmt.Println(err) } defer engine.RequestShutdown(ctx) err = engine.Define("GreetingProvider", newGreetingProvider) if err != nil { fmt.Println(err) } val, err := ctx.Eval(` $greetingProvider = new GreetingProvider('hello'); return $greetingProvider->GetGreeting();`) if err != nil { fmt.Println(err) } defer engine.DestroyValue(val) if engine.ToString(val) != "hello" { t.FailNow() }}PHP 错误日志
func Test_log(t *testing.T) { engine.PHP_INI_PATH_OVERRIDE = "/tmp/php.ini" engine.Initialize() ctx := &engine.Context{ Log: os.Stderr, } err := engine.RequestStartup(ctx) if err != nil { fmt.Println(err) } defer engine.RequestShutdown(ctx) _, err = ctx.Eval("error_log('hello', 4); trigger_error('sent from golang', E_USER_ERROR);") if err != nil { fmt.Println(err) }}其中
/tmp/php.ini的内容为error_reporting = E_ALLerror_log = "/tmp/php-error.log"错误会被输出到 /tmp/php-error.log。直接调用error_log会同时再输出一份到stderr
HTTP 输入输出
func Test_http(t *testing.T) { engine.Initialize() recorder := httptest.NewRecorder() ctx := &engine.Context{ Request: httptest.NewRequest("GET", "/hello", nil), ResponseWriter: recorder, } err := engine.RequestStartup(ctx) if err != nil { fmt.Println(err) } defer engine.RequestShutdown(ctx) _, err = ctx.Eval("echo($_SERVER['REQUEST_URI']);") if err != nil { fmt.Println(err) } body, err := ioutil.ReadAll(recorder.Result().Body) if err != nil { fmt.Println(err) } if string(body) != "/hello" { t.FailNow() }}所有的PHP超级全局变量都会被初始化为传递进去的Request的值,包括
$_SERVER$_GET$_POST$_FILE$_COOKIE$_ENVecho的内容,http code和http header会被写回到传入的ResponseWriter
fastcgi_finish_request
PHP-FPM 很常用的一个功能是
fastcgi_finish_request,用于在php里做一些异步完成的事情。这个特殊的全局函数必须支持func Test_fastcgi_finish_reqeust(t *testing.T) { engine.Initialize() buffer := &bytes.Buffer{} ctx := &engine.Context{ Output: buffer, } err := engine.RequestStartup(ctx) if err != nil { fmt.Println(err) } defer engine.RequestShutdown(ctx) ctx.Eval("ob_start(); echo ('hello');") if buffer.String() != "" { t.FailNow() } ctx.Eval("fastcgi_finish_request();") if buffer.String() != "hello" { t.FailNow() }}实际的作用就是把output提前输出到 ResposneWriter 里去,让调用方知道结果。对于当前进程的执行其实是没有影响的,只是影响了output。
上述就是小编为大家分享的golang调用php7的方法是怎样的了,如果刚好有类似的疑惑,不妨参照上述分析进行理解。如果想知道更多相关知识,欢迎关注行业资讯频道。
内容
输出
全局
方法
变量
周期
就是
生命
分析
影响
特殊
专业
中小
事情
作用
内存
内容丰富
函数
功能
参数
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
互联网扶贫科技
重庆互联网络科技
深圳互联网络科技有限公司
沃里互联网科技
互联网科技网站
互联网金融监管科技
济南和联互联网科技有限公司
互联网科技博主是什么意思
中国互联网有什么科技含量
昭通云南众福互联网科技有限公司
武汉健翔互联网络科技有限公司
互联网科技扶贫时间
朱啸虎曾投资哪些互联网科技企业
图游互联网科技
南京一网一红互联网科技有限公司
互联网硬科技公司
北京互联网科技类企业分布
互联网科技的前景
深圳互联网科技园地址
互联网科技企业文化
互联网科技公司排名
广东万易互联网科技有限公司惠州分公司
广州淘业互联网络科技
互联网科技工作委员会毛军
上海互联网科技有限公司
奇酷互联网科技公司
善班互联网科技有限公司
互联网科技公司做什么
深圳国际航运科技和互联网
互联网科技公司营业执照怎么办理