Maison > Article > développement back-end > Comment coopérer avec PHP et Golang
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.
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!