php7与golang,golang 调用 php7
执行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相关推荐
- golang直接调用ffmpeg预编译类库(windows)已更新
MinGW介绍 MINGW(Minimalist GNU on Windows)是一个可以在windows下编译Linux程序的仿真linux编译环境,他提供了linux下的C.C++头文件.系统库和 ...
- 【PHP7源码分析】PHP7到底有多快,基准测试与特性分析告诉你
顺风车运营研发团队 王坤 发表至21CTO公众号(https://mp.weixin.qq.com/s/ph...) PHP是一种跨平台开源语言,也是迄今为止最流行的Web开发语言,全球有超过80%的 ...
- php7协程通信使用,PHP7下的协程实现
原标题:PHP7下的协程实现 什么是协程 先搞清楚,什么是协程. 你可能已经听过『进程』和『线程』这两个概念. 进程就是二进制可执行文件在计算机内存里的一个运行实例,就好比你的.exe文件是个类,进程 ...
- ubuntu php7 memcache,linux上安装php7 memcache扩展
php7安装memcache扩展需要memcache php7的分支 否则安装会失败 php7的memcache扩展安装,真的很让人心碎! 下面则是php7的扩展memcache安装了. 用之前的 ...
- php7 apache mysql_Windows下安装php7+Apache2.4+MySQL
因为学习需要,所以在Windows下安装php7+Apache2.4+MySQL 1.安装Apache 到官网下载Apache2.4 ,选择Windows版本,这里本人下载2.4版本 下载之后解压 修 ...
- [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 ...
- PHP7+Swoole/Nginx/Golang性能对比
QPS对比 使用apache bench工具对Nginx静态页.Golang Http程序.PHP7+Swoole Http程序进行压力测试.在同一台机器上,进行并发100共100万次Http请求的基 ...
- golang 打印调用堆栈
这两天看Go的代码,呃,协程太多,无数个携程调用了一个方法,彻底看不清了,所以就想到是不是可以把调用堆栈打印出来. 查了一下,发现Go的 runtime/debug 库可以把调用堆栈打出来.下面看个例 ...
- go 调用c语言,golang之调用C语言代码
此篇教程只是简单的描述怎么使用以及遇到的一些错误 我写的实例,C语言与golang在同一个文件中,并没有分开. 我这里演示两个例子: ⑴ 调用C语言函数打印"Hello World" ...
最新文章
- java 装配_java – 无法自动装配方法
- Json对象与Json字符串互转(4种转换方式)
- loadrunner场景中按scenario和group执行的区别
- jax-rs jax-ws_Google App Engine JAX-RS REST服务
- winpe镜像文件iso下载_下载:微软正式发布Win10 2004版并即日起开始推送
- Scilab 求解线性方程组示例(linsolve)
- 计算机用户里dell占c盘太多,我的本是戴尔,用的是Win732位旗舰版系统,C盘里面的用户总是爆满是为什么,求解...
- Qt学习之路(10): Meta-Object系统
- Android上按钮解决快速点击问题
- 笑谈ArcToolbox (1) ArcToolbox 的发展方向
- 安装-apache skywalking (java 应用性能监控)
- iOS开发 语音合成支持后台和锁屏情况
- correspondence analysis of drug and genotype(spss)
- kuka机器人焊接飞溅大_关于KUKA 焊接机器人
- c盘python27文件夹可以删除嘛_请问C盘哪些文件夹可以删除?
- Xilinx 7系列FPGA架构之时钟资源(一)
- 微信小程序中使用video组件
- Win10 出现恢复,无法加载操作系统,关键系统驱动程序丢失或错误 蓝屏错误代码0xc000007b
- 手把手教你实现Android真机远程截屏
- LeetCode.黑白方格画
热门文章
- centos7 zookeeper3.5.6单机伪集群部署
- C# Repeater绑定显示数组
- openfeign调用 HttpServletRequest作为参数 报错..
- java验证码限流_Java实现系统限流
- 【OS学习笔记】二十九 保护模式八:任务切换对应的汇编代码之用户程序代码
- BUUOJ reverse 不一样的flag
- 国际经管学院举办计量经济学术前沿研讨会
- Spring Aop——给Advice传递参数
- win10安装mudbox失败,怎么强力卸载删除注册表并重新安装
- ★★★常用的【兼容IE和火狐FF】等浏览器的js方法★★★★★★★★