Heim > Backend-Entwicklung > PHP7 > 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
Freigeben: 2023-02-17 17:04:02
nach vorne
3895 Leute haben es durchsucht

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)
  }
}
Nach dem Login kopieren

Der Inhalt von /tmp/index.php ist

<?php
echo("hello\n");
Nach dem Login kopieren

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()
  }
}
Nach dem Login kopieren

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()
  }
}
Nach dem Login kopieren

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()
  }
}
Nach dem Login kopieren

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)
  }
}
Nach dem Login kopieren

Der Inhalt von /tmp/php.ini ist

error_reporting = E_ALL
error_log = "/tmp/php-error.log"
Nach dem Login kopieren

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()
  }
}
Nach dem Login kopieren

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

$_SERVER
$_GET
$_POST
$_FILE
$_COOKIE
$_ENV
Nach dem Login kopieren

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()
  }
}
Nach dem Login kopieren

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!

Verwandte Etiketten:
Quelle:jb51.net
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage