执行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 的内容为

echo("hello\n");

复制代码

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_ALL

error_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

$_ENV

复制代码

echo的内容,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。

php7与golang,golang 调用 php7相关推荐

  1. golang直接调用ffmpeg预编译类库(windows)已更新

    MinGW介绍 MINGW(Minimalist GNU on Windows)是一个可以在windows下编译Linux程序的仿真linux编译环境,他提供了linux下的C.C++头文件.系统库和 ...

  2. 【PHP7源码分析】PHP7到底有多快,基准测试与特性分析告诉你

    顺风车运营研发团队 王坤 发表至21CTO公众号(https://mp.weixin.qq.com/s/ph...) PHP是一种跨平台开源语言,也是迄今为止最流行的Web开发语言,全球有超过80%的 ...

  3. php7协程通信使用,PHP7下的协程实现

    原标题:PHP7下的协程实现 什么是协程 先搞清楚,什么是协程. 你可能已经听过『进程』和『线程』这两个概念. 进程就是二进制可执行文件在计算机内存里的一个运行实例,就好比你的.exe文件是个类,进程 ...

  4. ubuntu php7 memcache,linux上安装php7 memcache扩展

    php7安装memcache扩展需要memcache  php7的分支  否则安装会失败 php7的memcache扩展安装,真的很让人心碎! 下面则是php7的扩展memcache安装了. 用之前的 ...

  5. php7 apache mysql_Windows下安装php7+Apache2.4+MySQL

    因为学习需要,所以在Windows下安装php7+Apache2.4+MySQL 1.安装Apache 到官网下载Apache2.4 ,选择Windows版本,这里本人下载2.4版本 下载之后解压 修 ...

  6. [golang] golang文件读写 os.OpenFile(fileName,os.O_APPEND|os.O_WRONLY,os.ModeAppend)

    [golang] golang文件读写 os.OpenFile(fileName,os.O_APPEND|os.O_WRONLY,os.ModeAppend) 读写文件要用到的OS包 func Ope ...

  7. PHP7+Swoole/Nginx/Golang性能对比

    QPS对比 使用apache bench工具对Nginx静态页.Golang Http程序.PHP7+Swoole Http程序进行压力测试.在同一台机器上,进行并发100共100万次Http请求的基 ...

  8. golang 打印调用堆栈

    这两天看Go的代码,呃,协程太多,无数个携程调用了一个方法,彻底看不清了,所以就想到是不是可以把调用堆栈打印出来. 查了一下,发现Go的 runtime/debug 库可以把调用堆栈打出来.下面看个例 ...

  9. go 调用c语言,golang之调用C语言代码

    此篇教程只是简单的描述怎么使用以及遇到的一些错误 我写的实例,C语言与golang在同一个文件中,并没有分开. 我这里演示两个例子: ⑴ 调用C语言函数打印"Hello World" ...

最新文章

  1. java 装配_java – 无法自动装配方法
  2. Json对象与Json字符串互转(4种转换方式)
  3. loadrunner场景中按scenario和group执行的区别
  4. jax-rs jax-ws_Google App Engine JAX-RS REST服务
  5. winpe镜像文件iso下载_下载:微软正式发布Win10 2004版并即日起开始推送
  6. Scilab 求解线性方程组示例(linsolve)
  7. 计算机用户里dell占c盘太多,我的本是戴尔,用的是Win732位旗舰版系统,C盘里面的用户总是爆满是为什么,求解...
  8. Qt学习之路(10): Meta-Object系统
  9. Android上按钮解决快速点击问题
  10. 笑谈ArcToolbox (1) ArcToolbox 的发展方向
  11. 安装-apache skywalking (java 应用性能监控)
  12. iOS开发 语音合成支持后台和锁屏情况
  13. correspondence analysis of drug and genotype(spss)
  14. kuka机器人焊接飞溅大_关于KUKA 焊接机器人
  15. c盘python27文件夹可以删除嘛_请问C盘哪些文件夹可以删除?
  16. Xilinx 7系列FPGA架构之时钟资源(一)
  17. 微信小程序中使用video组件
  18. Win10 出现恢复,无法加载操作系统,关键系统驱动程序丢失或错误 蓝屏错误代码0xc000007b
  19. 手把手教你实现Android真机远程截屏
  20. LeetCode.黑白方格画

热门文章

  1. centos7 zookeeper3.5.6单机伪集群部署
  2. C# Repeater绑定显示数组
  3. openfeign调用 HttpServletRequest作为参数 报错..
  4. java验证码限流_Java实现系统限流
  5. 【OS学习笔记】二十九 保护模式八:任务切换对应的汇编代码之用户程序代码
  6. BUUOJ reverse 不一样的flag
  7. 国际经管学院举办计量经济学术前沿研讨会
  8. Spring Aop——给Advice传递参数
  9. win10安装mudbox失败,怎么强力卸载删除注册表并重新安装
  10. ★★★常用的【兼容IE和火狐FF】等浏览器的js方法★★★★★★★★