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。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/431823.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

u 20ubuntu 安装 postfix_极力推荐和田咨询问题U型钢托盘厂家

12极力推荐和田咨询问题U型钢托盘厂家泊头市毅伽属制品有限公司坐落于河北省泊头市龙华街北4公里,濒临京沪、石黄高速公路以及104、307国道,另有廊泊路贯穿南北交通十分便利。本公司设计生产各种冷弯型钢,产品包括C型钢、Z型钢、U型钢、M型钢…

HTML5中lineCap端点样式遇到closePath()

定义和用法 lineCap 属性设置或返回线条末端线帽的样式。 注释:"round" 和 "square" 会使线条略微变长。 默认值:buttJavaScript 语法:context.lineCap"butt|round|square";属性值 值描述butt默认。向线条的每…

php鼠标悬停显示图片,鼠标滑过出现预览的大图提示效果

当鼠标滑过图片时,图片会出现预览的大图,大图下面还会有介绍文字。.aa{width:88px;height :100px;}$(function () {var x 10;var y 20;$("a.tooltip").mouseover(function (e) {this.myTitle this.title;this.title "";var imgT…

405 not allowed什么意思_二驴质问散打:为什么不救天道!面临一个亿赔款?次惑小仙女宣布与可乐分手!...

次惑小仙女发作品表示:对不起让你们失望了,慢慢也学着长大了,懂得了很多,以前每天就知道天真傻笑的玩,后来懂得了努力和加油,但是很多东西并不是大家看到的那样背后的事情谁又能知道。都认为他对我很好,只有自己知道,呵呵。有些时…

阿里面试

阿里面试 转载于:https://www.cnblogs.com/chen310/p/4492243.html

matlab提示output,强制Matlab输出到命令行(Force Matlab output to command line)

强制Matlab输出到命令行(Force Matlab output to command line)我正在从Windows命令提示符运行MATLAB脚本:"C:\Program Files\MATLAB\R2014B\bin\matlab" -nodisplay -nosplash -nodesktop -wait -r "test.m"test.m很简单:function …

hdu.1254.推箱子(bfs + 优先队列)

推箱子 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 6021 Accepted Submission(s): 1718 Problem Description推箱子是一个很经典的游戏.今天我们来玩一个简单版本.在一个M*N的房间里有一个箱子和一个搬运…

ae合成设置快捷键_怎么在ae中剪切视频?怎么在ae里裁剪视频?

ae剪切裁剪视频教程:零基础学AE软件影视后期必修课程-AE新建合成-羽兔网​www.yutu.cn1、启动After Effects并导入视频第一个任务是打开一个新项目,并将视频加载到其中。首先从主菜单中选择新的构图。然后打开构图菜单,选择所需的分辨率等&am…

php js获取元素id,javascript通过中文id和class获取元素的方法

以前以为html元素中的id和class等只能通过字母数字或者下划线等特殊字符命名,如果单存使用中文浏览器不会报错,但是js是获取不到的,但是今天逛论坛的时候发现不是这样的。代码如下:运行结果:论坛来源是这个&#xff1a…

java漂亮界面编程_计算机二级之JAVA篇

JavaJava是一门面向对象编程语言,不仅吸收了C语言的各种优点,还摒弃了C里难以理解的多继承、指针等概念,因此Java语言具有功能强大和简单易用两个特征。深受程序员们的追捧,据TIBOE2020年最新统计:Java使用人数大涨&am…

idea 设置java栈空间,如何为Intellij编译器提供更多堆空间?

当我创建一个Intellij项目时,我不断收到以下内存错误。我已经在idea.vmoptions中增加了我的堆大小:-Xms128m-Xmx2048m-XX:MaxPermSize1024m-XX:ReservedCodeCacheSize64m-ea但我仍然得到这个错误:Information:The system is out of resources…

Java for LeetCode 042 Trapping Rain Water

Given n non-negative integers representing an elevation map where the width of each bar is 1, compute how much water it is able to trap after raining. For example, Given [0,1,0,2,1,0,1,3,2,1,2,1], return 6. 解题思路: 先找到第一块最高的木板&…

delphi random 六位_《蒙面唱将猜猜猜》第五季将播,六位唱将率先登场

原标题:《蒙面唱将猜猜猜》第五季将播,六位唱将率先登场新京报讯(记者 刘玮)《蒙面唱将猜猜猜》第五季将于11月1日21:10在江苏卫视首播,优酷视频全网独播。第五季中,猜评团不仅“觊觎”各路唱将的真实身份,…

自梦php,PHP菜狗自学之路 云之梦php php之窗 php脚本之

第一讲 开启PHP学习之路 2016/5/2 20:29PHP可以做什么? www网站 管理系统; websever wap网站第二讲 PHP的数据类型 源码调试 2016/5/2 20:30PHP和htm混编 句子以 ; 英文半角分号结束~!!在PHP中 以 开始 以?>结束;e…

鸡啄米vc++2010系列2(项目文件分析)

用应用程序向导生成框架程序后,我们可以在之前设置的Location下看到以解决方案名命名的文件夹,此文件夹中包含了几个文件和一个以工程名命名的子文件夹,这个子文件夹中又包含了若干个文件和一个res文件夹,创建工程时的选项不同&am…

python代做在哪找靠谱_比较靠谱的资产评估师考试去哪找

比较靠谱的资产评估师考试去哪找二我们一起来看看考研辅导员们哪些为优质的学习资源。考研辅导员们怎么说您好,我想作为有识之士,在现阶段大多数考研辅导员的学习水平都不行,甚至都不具备这些资源的才华。因此,我认为做好大家的准…

java中sql之count,SQL COUNT() 函数--编程学习网

COUNT() 函数返回匹配指定条件的行数。SQL COUNT(column_name) 语法COUNT(column_name) 函数返回指定列的值的数目(NULL 不计入):SELECT COUNT(column_name) FROM table_name;SQL COUNT(*) 语法COUNT(*) 函数返回表中的记录数:SELECT COUNT(*) FROM tabl…

序列

ORACLE创建序列语句CREATE SEQUENCE 序列名 increment by (序列步长) start with (序列起始值) maxvalue (序列最大值) 删除序列DROP SEQUENCE 序列名 得到序列的下一个值序列名.nextval 创建和使用序列的例子CREATE SEQUENCE seq…

苹果笔记本双系统怎么切换_2020年你该怎么选择苹果笔记本,资深用户带你讲透MacBook Air MacBook Pro...

作为一名曾经的苹果生态开发者我2012年10月份购入自己的第一台苹果笔记本:MacBook Pro 13寸,那时候还很厚重,机械硬盘的配置,为了省钱,在官网翻新机渠道购买的,记得当初新机的原价是8000多,翻新…

html5 支持php标签吗,HTML5新增标签使用方法

HTML5提供了一些新的元素和属性,例如nav(网站导航块)和footer。这种标签将有利于搜索引擎的索引整理,同时更好的帮助小屏幕装置和视障人士使用,除此之外,还为其他浏览要素提供了新的功能,如audio和video标记。下面我们…