Maison > développement back-end > PHP7 > Jetons un coup d'œil à l'explication détaillée et aux exemples de Golang appelant php7

Jetons un coup d'œil à l'explication détaillée et aux exemples de Golang appelant php7

coldplay.xixi
Libérer: 2023-02-17 17:04:02
avant
3896 Les gens l'ont consulté

Jetons un coup d'œil à l'explication détaillée et aux exemples de Golang appelant php7

Exécuter le fichier 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)
  }
}
Copier après la connexion

Le contenu de /tmp/index.php est

<?php
echo("hello\n");
Copier après la connexion

Eval, valeur de retour

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()
  }
}
Copier après la connexion

La propriété du cycle de vie de la valeur renvoyée est le programme golang, nous sommes donc responsables de DestroyValue

configuration des variables globales pour transmettre les paramètres

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()
  }
}
Copier après la connexion

Le cycle de vie des paramètres transmis est contrôlé par PHP, et la mémoire sera libérée à l'arrêt de la requête.

Rappel 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()
  }
}
Copier après la connexion

Journal des erreurs 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(&#39;hello&#39;, 4); trigger_error(&#39;sent from golang&#39;, E_USER_ERROR);")
  if err != nil {
    fmt.Println(err)
  }
}
Copier après la connexion

Le contenu de /tmp/php.ini est

error_reporting = E_ALL
error_log = "/tmp/php-error.log"
Copier après la connexion

Les erreurs seront affichées dans /tmp/php-error.log. L'appel direct de error_log produira également une autre copie vers stderr

Entrée et sortie 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[&#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()
  }
}
Copier après la connexion

Toutes les variables super globales PHP seront initialisées à la valeur de la requête transmise. Y compris le contenu de

$_SERVER
$_GET
$_POST
$_FILE
$_COOKIE
$_ENV
Copier après la connexion

echo, le code http et l'en-tête http seront réécrits dans le ResponseWriter entrant

fastcgi_finish_request

PHP- Une fonction très couramment utilisée de FPM est fastcgi_finish_request, qui est utilisée pour effectuer certaines tâches asynchrones en PHP. Cette fonction globale spéciale doit prendre en charge

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()
  }
}
Copier après la connexion

. Sa fonction réelle est de transmettre la sortie à ResposneWriter à l'avance pour informer l'appelant du résultat. Cela n’a en réalité aucun impact sur l’exécution du processus en cours, mais affecte uniquement le résultat.

Recommandations d'apprentissage associées : Tutoriel PHP7

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Étiquettes associées:
source:jb51.net
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal