Heim  >  Artikel  >  Backend-Entwicklung  >  Werfen wir einen Blick auf die detaillierte Erklärung und Beispiele für Golang-Aufrufe von PHP7

Werfen wir einen Blick auf die detaillierte Erklärung und Beispiele für Golang-Aufrufe von PHP7

coldplay.xixi
coldplay.xixinach vorne
2020-07-18 17:32:593699Durchsuche

Werfen wir einen Blick auf die detaillierte Erklärung und Beispiele für Golang-Aufrufe von PHP7

PHP-Datei ausführen

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

Der Inhalt von /tmp/index.php ist

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

Eval, Rückgabewert

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

Der Lebenszyklus-Eigentümer des zurückgegebenen Werts ist das Golang-Programm, daher sind wir für DestroyValue verantwortlich

Einrichten globaler Variablen zur Übergabe von Parametern

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

Der Lebenszyklus der übergebenen Parameter wird von PHP gesteuert und der Speicher wird freigegeben, wenn die Anforderung beendet wird.

PHP-Rückruf 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()
  }
}

PHP-Fehlerprotokoll

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(&#39;hello&#39;, 4); trigger_error(&#39;sent from golang&#39;, E_USER_ERROR);")
  if err != nil {
    fmt.Println(err)
  }
}

Der Inhalt von /tmp/php.ini ist

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

Fehler werden nach /tmp/php-error.log ausgegeben. Beim direkten Aufruf von error_log wird auch eine weitere Kopie an stderr ausgegeben

HTTP-Eingabe und -Ausgabe

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[&#39;REQUEST_URI&#39;]);")
  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()
  }
}

Alle superglobalen PHP-Variablen werden mit dem Wert der übergebenen Anforderung initialisiert. Einschließlich des Inhalts von

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

echo werden HTTP-Code und http-Header an den eingehenden ResponseWriter zurückgeschrieben

fastcgi_finish_request

PHP- Eine sehr häufig verwendete Funktion von FPM ist fastcgi_finish_request, mit der einige asynchrone Dinge in PHP ausgeführt werden. Diese spezielle globale Funktion muss

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 (&#39;hello&#39;);")
  if buffer.String() != "" {
    t.FailNow()
  }
  ctx.Eval("fastcgi_finish_request();")
  if buffer.String() != "hello" {
    t.FailNow()
  }
}

unterstützen. Ihre eigentliche Funktion besteht darin, die Ausgabe im Voraus an ResposneWriter auszugeben, um den Aufrufer über das Ergebnis zu informieren. Es hat eigentlich keinen Einfluss auf die Ausführung des aktuellen Prozesses, sondern nur auf die Ausgabe.

Verwandte Lernempfehlungen: PHP7-Tutorial

Das obige ist der detaillierte Inhalt vonWerfen wir einen Blick auf die detaillierte Erklärung und Beispiele für Golang-Aufrufe von PHP7. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Dieser Artikel ist reproduziert unter:jb51.net. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen