国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 開發 > PHP > 正文

golang調用php7詳解及實例教程

2024-05-04 21:50:41
字體:
來源:轉載
供稿:網友

執行php文件:

  1. func Test_exec(t *testing.T) { 
  2.   engine.Initialize() 
  3.   ctx := &engine.Context{ 
  4.     Output: os.Stdout, 
  5.   } 
  6.   err := engine.RequestStartup(ctx) 
  7.   iferr != nil { 
  8.     fmt.Println(err) 
  9.   } 
  10.   defer engine.RequestShutdown(ctx) 
  11.   err = ctx.Exec("/tmp/index.php"
  12.   iferr != nil { 
  13.     fmt.Println(err) 
  14.   } 

其中 /tmp/index.php 的內容為:

  1. echo("hello/n"); 
  2. Eval,返回值 
  3.  
  4. func Test_eval(t *testing.T) { 
  5.   engine.Initialize() 
  6.   ctx := &engine.Context{} 
  7.   err := engine.RequestStartup(ctx) 
  8.   iferr != nil { 
  9.     fmt.Println(err) 
  10.   } 
  11.   defer engine.RequestShutdown(ctx) 
  12.   val, err := ctx.Eval("return 'hello';"
  13.   iferr != nil { 
  14.     fmt.Println(err) 
  15.   } 
  16.   defer engine.DestroyValue(val) 
  17.   ifengine.ToString(val) !="hello"
  18.     t.FailNow() 
  19.   } 

返回的value的生命周期所有權是golang程序,所以我們要負責DestroyValue

設置全局變量來傳參

  1. func Test_argument(t *testing.T) { 
  2.   engine.Initialize() 
  3.   ctx := &engine.Context{} 
  4.   err := engine.RequestStartup(ctx) 
  5.   iferr != nil { 
  6.     fmt.Println(err) 
  7.   } 
  8.   defer engine.RequestShutdown(ctx) 
  9.   err = ctx.Bind("greeting","hello"
  10.   iferr != nil { 
  11.     fmt.Println(err) 
  12.   } 
  13.   val, err := ctx.Eval("return $greeting;"
  14.   iferr != nil { 
  15.     fmt.Println(err) 
  16.   } 
  17.   defer engine.DestroyValue(val) 
  18.   ifengine.ToString(val) !="hello"
  19.     t.FailNow() 
  20.   } 

傳遞進去的參數的生命周期是php控制的,在request shutdown的時候內存會被釋放。

PHP 回調 Golang

  1. type greetingProvider struct { 
  2.   greeting string 
  3.  
  4. func (provider *greetingProvider) GetGreeting() string { 
  5.   returnprovider.greeting 
  6.  
  7. func newGreetingProvider(args []interface{})interface{} { 
  8.   return&greetingProvider{ 
  9.     greeting: args[0].(string), 
  10.   } 
  11.  
  12. func Test_callback(t *testing.T) { 
  13.   engine.Initialize() 
  14.   ctx := &engine.Context{} 
  15.   err := engine.RequestStartup(ctx) 
  16.   iferr != nil { 
  17.     fmt.Println(err) 
  18.   } 
  19.   defer engine.RequestShutdown(ctx) 
  20.   err = engine.Define("GreetingProvider", newGreetingProvider) 
  21.   iferr != nil { 
  22.     fmt.Println(err) 
  23.   } 
  24.   val, err := ctx.Eval(` 
  25.   $greetingProvider=newGreetingProvider('hello'); 
  26.   return$greetingProvider->GetGreeting();`) 
  27.   iferr != nil { 
  28.     fmt.Println(err) 
  29.   } 
  30.   defer engine.DestroyValue(val) 
  31.   ifengine.ToString(val) !="hello"
  32.     t.FailNow() 
  33.   } 

PHP 錯誤日志

  1. func Test_log(t *testing.T) { 
  2.   engine.PHP_INI_PATH_OVERRIDE ="/tmp/php.ini" 
  3.   engine.Initialize() 
  4.   ctx := &engine.Context{ 
  5.     Log: os.Stderr, 
  6.   } 
  7.   err := engine.RequestStartup(ctx) 
  8.   iferr != nil { 
  9.     fmt.Println(err) 
  10.   } 
  11.   defer engine.RequestShutdown(ctx) 
  12.   _, err = ctx.Eval("error_log('hello', 4); trigger_error('sent from golang', E_USER_ERROR);"
  13.   iferr != nil { 
  14.     fmt.Println(err) 
  15.   } 

其中 /tmp/php.ini 的內容為

error_reporting= E_ALL

error_log="/tmp/php-error.log"

錯誤會被輸出到 /tmp/php-error.log。直接調用error_log會同時再輸出一份到stderr

HTTP 輸入輸出

  1. func Test_http(t *testing.T) { 
  2.   engine.Initialize() 
  3.   recorder := httptest.NewRecorder() 
  4.   ctx := &engine.Context{ 
  5.     Request: httptest.NewRequest("GET","/hello", nil), 
  6.     ResponseWriter: recorder, 
  7.   } 
  8.   err := engine.RequestStartup(ctx) 
  9.   iferr != nil { 
  10.     fmt.Println(err) 
  11.   } 
  12.   defer engine.RequestShutdown(ctx) 
  13.   _, err = ctx.Eval("echo($_SERVER['REQUEST_URI']);"
  14.   iferr != nil { 
  15.     fmt.Println(err) 
  16.   } 
  17.   body, err := ioutil.ReadAll(recorder.Result().Body) 
  18.   iferr != nil { 
  19.     fmt.Println(err) 
  20.   } 
  21.   ifstring(body) !="/hello"
  22.     t.FailNow() 
  23.   } 

所有的PHP超級全局變量都會被初始化為傳遞進去的Request的值,包括:

  1. $_SERVER 
  2. $_GET 
  3. $_POST 
  4. $_FILE 
  5. $_COOKIE 
  6. $_ENV 

echo的內容,http code和http header會被寫回到傳入的ResponseWriter

fastcgi_finish_request

PHP-FPM 很常用的一個功能是 fastcgi_finish_request ,用于在php里做一些異步完成的事情。這個特殊的全局函數必須支持

  1. func Test_fastcgi_finish_reqeust(t *testing.T) { 
  2.   engine.Initialize() 
  3.   buffer := &bytes.Buffer{} 
  4.   ctx := &engine.Context{ 
  5.     Output: buffer, 
  6.   } 
  7.   err := engine.RequestStartup(ctx) 
  8.   iferr != nil { 
  9.     fmt.Println(err) 
  10.   } 
  11.   defer engine.RequestShutdown(ctx) 
  12.   ctx.Eval("ob_start(); echo ('hello');"
  13.   ifbuffer.String() !=""
  14.     t.FailNow() 
  15.   } 
  16.   ctx.Eval("fastcgi_finish_request();"
  17.   ifbuffer.String() !="hello"
  18.     t.FailNow() 
  19.   } 

實際的作用就是把output提前輸出到 ResposneWriter 里去,讓調用方知道結果。對于當前進程的執行其實是沒有影響的,只是影響了output。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 绵竹市| 手机| 临城县| 馆陶县| 河北区| 庆元县| 碌曲县| 商城县| 民和| 当涂县| 武安市| 蒙山县| 宁阳县| 赣州市| 台北市| 天气| 武鸣县| 桐乡市| 云龙县| 鹤岗市| 綦江县| 芜湖市| 德兴市| 黔西| 会同县| 尚志市| 海南省| 墨竹工卡县| 富平县| 富宁县| 望谟县| 拉孜县| 噶尔县| 鹿邑县| 孟连| 卓资县| 宁德市| 封丘县| 丽江市| 澄江县| 万山特区|