Maison  >  Article  >  développement back-end  >  Comment coopérer avec PHP et Golang

Comment coopérer avec PHP et Golang

(*-*)浩
(*-*)浩original
2019-10-17 13:39:055958parcourir

Un scénario que j'ai rencontré récemment au travail était qu'une fonction tierce devait être utilisée dans le projet PHP, et il se trouvait qu'il y avait une bibliothèque de classes écrite en Golang. La question devient alors : comment parvenir à la communication entre différentes langues ? Jetons un coup d'œil ci-dessous.

Comment coopérer avec PHP et Golang

Solution conventionnelle (Apprentissage recommandé : Tutoriel vidéo PHP)

1. écrit un service http/TCP et php communique avec Golang via http/TCP

2. Golang est encapsulé comme une extension php.

3. PHP appelle le fichier exécutable Golang via les commandes système

Problèmes existants

1. Requêtes HTTP et les E/S réseau prendront beaucoup de temps

2. Une grande quantité de code doit être encapsulée

3. Chaque fois que PHP appelle un programme Golang, il a besoin d'une initialisation unique qui prend beaucoup de temps

Objectifs d'optimisation

1. Le programme Golang n'est initialisé qu'une seule fois (car l'initialisation est prend du temps)

2. Toutes les demandes n'ont pas besoin de passer par le réseau

3. Essayez de ne pas trop modifier le code

Solution

1. Encapsulation Golang simple, compilez la bibliothèque de classes tierce dans un fichier exécutable

2. communiquer via un pipeline bidirectionnel

Avantages de l'utilisation de la communication par pipeline bidirectionnel

1 : Seule une encapsulation minimale de la bibliothèque de classes Golang d'origine est requise

2 : Meilleures performances (la communication IPC est le meilleur moyen de communiquer entre les processus)

3 : Pas besoin de faire de requêtes réseau, ce qui permet de gagner beaucoup de temps

4 : Le programme ne doit être initialisé qu'une seule fois, et toujours gardé en mémoire

Étapes spécifiques de mise en œuvre

1 : Original appelez la démo dans la bibliothèque de classes

package main
import (
 "fmt"
 "github.com/yanyiwu/gojieba"
 "strings"
)
 
func main() {
 x := gojieba.NewJieba()
 defer x.Free()
 
 s := "小明硕士毕业于中国科学院计算所,后在日本京都大学深造"
 words := x.CutForSearch(s, true)
 fmt.Println(strings.Join(words, "/"))
}

Enregistrez le fichier sous main .go, vous pouvez exécuter

2 : Le code ajusté est :

package main
import (
 "bufio"
 "fmt"
 "github.com/yanyiwu/gojieba"
 "io"
 "os"
 "strings"
)
 
func main() {
 
 x := gojieba.NewJieba(
  "/data/tmp/jiebaDict/jieba.dict.utf8", 
  "/data/tmp/jiebaDict/hmm_model.utf8", 
  "/data/tmp/jiebaDict/user.dict.utf8"
 )
 defer x.Free()
 
 inputReader := bufio.NewReader(os.Stdin)
 for {
  s, err := inputReader.ReadString('\n')
  if err != nil && err == io.EOF {
   break
  }
  s = strings.TrimSpace(s)
 
  if s != "" {
   words := x.CutForSearch(s, true)
   fmt.Println(strings.Join(words, " "))
  } else {
   fmt.Println("get empty \n")
  }
 }
}

Avec seulement quelques ajustements simples, vous pouvez réaliser : recevoir une chaîne depuis l'entrée standard, après segmentation des mots, sortie

Test :

# go build test
# ./test
# //等待用户输入,输入”这是一个测试“
# 这是 一个 测试 //程序

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!

Déclaration:
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