golang调用php7的方法是怎样的
发表于:2025-02-04 作者:千家信息网编辑
千家信息网最后更新 2025年02月04日,这期内容当中小编将会给大家带来有关golang调用php7的方法是怎样的,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。golang 调用 php7使用 https:
千家信息网最后更新 2025年02月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安全错误
数据库的锁怎样保障安全
中国平安汽车网络安全
4g网络安全
海南希米互联网科技公司
数据库系统概论下载
如何手动输入数据库
天津盛世友联网络技术开发
我的世界进入服务器无响应
什么是服务器安全狗
奔流电力软件开发
网络安全的征文800
SQL数据库为什么初始化失败
天津的软件开发薪资
三级网络技术靠什么
安全会议记录软件开发
企业服务器安全防护
杭州市网络安全报警中心
2021最新软件开发技术
网络安全犯法案例
三十几岁软件开发
闵行区品牌软件开发平均价格
网络安全宣传片的拍摄方法
网络安全手抄报素材初一
服务器桌面登入
中信银行软件开发 加班
数据库索引的存在会导致删除效率
数据库还原被使用的概率
烽火网络安全
拿到新华为服务器之后首先做什么
金点子软件开发
绍兴高防御服务器124.