Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Mari kita bincangkan tentang cara golang memanggil php7

Mari kita bincangkan tentang cara golang memanggil php7

藏色散人
藏色散人ke hadapan
2021-09-20 16:30:172400semak imbas

Artikel ini diperkenalkan oleh ruangan tutorial go language untuk memperkenalkan cara memanggil php7 dalam golang semoga dapat membantu rakan-rakan yang memerlukan.

Gunakan https://github.com/taowen/go-php7
Diubah suai berdasarkan https://github.com/deuill/go-php, fork Reason (https://github.com/deuill/go-php/issues/32)

Laksanakan fail 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)
    }
}

Kandungan /tmp/index.php ialah

<?php
echo("hello\n");

Eval, nilai pulangan

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 &#39;hello&#39;;")
    if err != nil {
        fmt.Println(err)
    }
    defer engine.DestroyValue(val)
    if engine.ToString(val) != "hello" {
        t.FailNow()
    }
}

Pemilikan kitaran hayat nilai yang dikembalikan ialah program golang, jadi kami bertanggungjawab untuk DestroyValue

Tetapkan pembolehubah global untuk lulus parameter

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

Kitaran hayat parameter yang dihantar dikawal oleh PHP dan memori akan dikeluarkan apabila permintaan dimatikan.

Panggil balik 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(&#39;hello&#39;);
    return $greetingProvider->GetGreeting();`)
    if err != nil {
        fmt.Println(err)
    }
    defer engine.DestroyValue(val)
    if engine.ToString(val) != "hello" {
        t.FailNow()
    }
}

Log ralat 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)
    }
}

Kandungan /tmp/php.ini ialah

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

Ralat akan menjadi output ke /tmp/php-error.log. Memanggil error_log secara langsung juga akan mengeluarkan salinan lain kepada stderr

input dan output 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()
    }
}

Semua pembolehubah super global PHP akan dimulakan kepada nilai Permintaan yang diluluskan, termasuk

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

Kandungan gema, kod http dan pengepala http akan ditulis kembali ke ResponseWriter yang masuk

fastcgi_finish_request

PHP-FPM Fungsi yang sangat biasa digunakan ialah fastcgi_finish_request, Digunakan untuk melakukan beberapa perkara tak segerak dalam php. Fungsi global khas ini mesti menyokong

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

Fungsi sebenar adalah untuk mengeluarkan output kepada ResposneWriter terlebih dahulu supaya pemanggil mengetahui hasilnya. Ia sebenarnya tidak mempunyai kesan ke atas pelaksanaan proses semasa, tetapi hanya menjejaskan output.

Pembelajaran yang disyorkan: "tutorial golang"

Atas ialah kandungan terperinci Mari kita bincangkan tentang cara golang memanggil php7. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Artikel ini dikembalikan pada:segmentfault.com. Jika ada pelanggaran, sila hubungi admin@php.cn Padam