最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

golang 調(diào)用 php7詳解及實例

 更新時間:2017年01月04日 17:14:18   投稿:lqh  
這篇文章主要介紹了golang 調(diào)用 php7詳解及實例的相關(guān)資料,需要的朋友可以參考下

執(zhí)行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 的內(nèi)容為

<?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的生命周期所有權(quán)是golang程序,所以我們要負(fù)責(zé)DestroyValue

設(shè)置全局變量來傳參

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()
  }
}

傳遞進(jìn)去的參數(shù)的生命周期是php控制的,在request shutdown的時候內(nèi)存會被釋放。

PHP 回調(diào) 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 的內(nèi)容為

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

錯誤會被輸出到 /tmp/php-error.log。直接調(diào)用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超級全局變量都會被初始化為傳遞進(jìn)去的Request的值,包括

$_SERVER
$_GET
$_POST
$_FILE
$_COOKIE
$_ENV

echo的內(nèi)容,http code和http header會被寫回到傳入的ResponseWriter

fastcgi_finish_request

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

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 里去,讓調(diào)用方知道結(jié)果。對于當(dāng)前進(jìn)程的執(zhí)行其實是沒有影響的,只是影響了output。

 感謝閱讀,希望能幫助到大家,謝謝大家對本站的支持!

相關(guān)文章

  • php面向?qū)ο蟪绦蛟O(shè)計中self與static的區(qū)別分析

    php面向?qū)ο蟪绦蛟O(shè)計中self與static的區(qū)別分析

    這篇文章主要介紹了php面向?qū)ο蟪绦蛟O(shè)計中self與static的區(qū)別,結(jié)合實例形式分析了php面向?qū)ο蟪绦蛟O(shè)計中self與static的功能、以及在繼承過程中實現(xiàn)多態(tài)的區(qū)別,并總結(jié)了static靜態(tài)延遲綁定的原理,需要的朋友可以參考下
    2019-05-05
  • 詳解PHP偽靜態(tài)的實現(xiàn)方法

    詳解PHP偽靜態(tài)的實現(xiàn)方法

    偽靜態(tài)技術(shù)通過將動態(tài)URL轉(zhuǎn)換為靜態(tài)樣式,不僅提高了用戶體驗,也增強了搜索引擎的抓取效率,本文將詳細(xì)介紹什么是偽靜態(tài),以及如何在?PHP中實現(xiàn)偽靜態(tài),需要的可以了解下
    2024-11-11
  • php實現(xiàn)Mysql簡易操作類

    php實現(xiàn)Mysql簡易操作類

    這個PHP實現(xiàn)的mysql的操作類完整版已經(jīng)使用過了,而這個簡化版是經(jīng)過修改完整版后的簡化版,適用在一般的 PHP 應(yīng)用中,功能上可以實現(xiàn)基本的增刪改查的操作,以及打印 MYSQL 錯誤,自我感覺不錯,如果網(wǎng)站應(yīng)用不是很強大,應(yīng)用這個 MYSQL 的操作類已經(jīng)足夠了,
    2015-10-10
  • php模擬post提交數(shù)據(jù)的方法

    php模擬post提交數(shù)據(jù)的方法

    這篇文章主要介紹了php模擬post提交數(shù)據(jù)的方法,實例分析了socket方法模擬post提交數(shù)據(jù)的技巧,具有一定參考借鑒價值,需要的朋友可以參考下
    2015-02-02
  • Smarty模板學(xué)習(xí)筆記之Smarty簡介

    Smarty模板學(xué)習(xí)筆記之Smarty簡介

    Smarty是一個使用PHP寫出來的模板PHP模板引擎,是目前業(yè)界最著名的PHP模板引擎之一。它分離了邏輯代碼和外在的內(nèi)容,提供了一種易于管理和使用的方法,用來將原本與HTML代碼混雜在一起PHP代碼邏輯分離。
    2014-05-05
  • PHP定界符的使用及注意事項

    PHP定界符的使用及注意事項

    這篇文章主要給大家介紹了關(guān)于PHP定界符的使用及注意事項的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-01-01
  • php+redis實現(xiàn)注冊、刪除、編輯、分頁、登錄、關(guān)注等功能示例

    php+redis實現(xiàn)注冊、刪除、編輯、分頁、登錄、關(guān)注等功能示例

    這篇文章主要介紹了php+redis實現(xiàn)注冊、刪除、編輯、分頁、登錄、關(guān)注等功能,結(jié)合實例形式分析了php+redis項目開發(fā)中常用的注冊,刪除,編輯,分頁,登錄,關(guān)注功能相關(guān)實現(xiàn)技巧,需要的朋友可以參考下
    2017-02-02
  • JSON在PHP中的應(yīng)用介紹

    JSON在PHP中的應(yīng)用介紹

    目前,JSON已經(jīng)成為最流行的數(shù)據(jù)交換格式之一,各大網(wǎng)站的API幾乎都支持它。故整理一下PHP語言對它的支持,這是開發(fā)互聯(lián)網(wǎng)應(yīng)用程序(特別是編寫API)必須了解的知識
    2012-09-09
  • php實現(xiàn)統(tǒng)計目錄文件大小的函數(shù)

    php實現(xiàn)統(tǒng)計目錄文件大小的函數(shù)

    本文給大家介紹了使用php實現(xiàn)統(tǒng)計目錄文件大小的函數(shù),其主要的思路是通過遞歸遍歷目錄中的所有文件從而計算出文件總大小的,有需要的小伙伴可以參考下
    2015-12-12
  • 簡單談?wù)刾hp中ob_flush和flush的區(qū)別

    簡單談?wù)刾hp中ob_flush和flush的區(qū)別

    本文簡單的對php中ob_flush和flush進(jìn)行了對比分析,得出了他們之間的區(qū)別,給需要的小伙伴參考下。
    2014-11-11

最新評論

黔江区| 梨树县| 汶川县| 平乡县| 阳朔县| 竹山县| 长阳| 会昌县| 清水河县| 梁平县| 盐池县| 锡林浩特市| 阿瓦提县| 莒南县| 灵丘县| 新蔡县| 武强县| 漳浦县| 无为县| 南漳县| 南投市| 修水县| 霍邱县| 江都市| 肥西县| 铁力市| 扎兰屯市| 锡林郭勒盟| 永泰县| 林口县| 清徐县| 大埔区| 博客| 革吉县| 汕头市| 宜良县| 宜阳县| 吉首市| 谢通门县| 大冶市| 锦州市|