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

Mari kita bincangkan tentang cara golang memanggil php7

藏色散人
Lepaskan: 2021-09-20 16:32:47
ke hadapan
2408 orang telah melayarinya

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)
    }
}
Salin selepas log masuk

Kandungan /tmp/index.php ialah

<?php
echo("hello\n");
Salin selepas log masuk

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()
    }
}
Salin selepas log masuk

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()
    }
}
Salin selepas log masuk

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()
    }
}
Salin selepas log masuk

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)
    }
}
Salin selepas log masuk

Kandungan /tmp/php.ini ialah

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

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()
    }
}
Salin selepas log masuk

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

$_SERVER
$_GET
$_POST
$_FILE
$_COOKIE
$_ENV
Salin selepas log masuk

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()
    }
}
Salin selepas log masuk

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!

Label berkaitan:
sumber:segmentfault.com
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan