Heim > Backend-Entwicklung > PHP-Problem > Wie man mit PHP und Golang zusammenarbeitet

Wie man mit PHP und Golang zusammenarbeitet

(*-*)浩
Freigeben: 2023-02-27 07:20:02
Original
6032 Leute haben es durchsucht

Ein Szenario, auf das ich kürzlich bei der Arbeit gestoßen bin, war, dass eine Funktion eines Drittanbieters im PHP-Projekt verwendet werden musste und es zufällig eine in Golang geschriebene Klassenbibliothek gab. Es stellt sich also die Frage, wie eine Kommunikation zwischen verschiedenen Sprachen erreicht werden kann. Schauen wir uns unten um.

Wie man mit PHP und Golang zusammenarbeitet

Konventionelle Lösung (Empfohlenes Lernen: PHP-Video-Tutorial)

1 schreibt einen http/TCP-Dienst und PHP kommuniziert mit Golang über http/TCP

2. Golang ist als PHP-Erweiterung gekapselt.

3. PHP ruft die ausführbare Golang-Datei über Systembefehle auf

Vorhandene Probleme

1. HTTP-Anfragen und Netzwerk-E/A werden viel Zeit in Anspruch nehmen

2. Eine große Menge Code muss gekapselt werden

3. Jedes Mal, wenn PHP ein Golang-Programm aufruft, Es braucht eine einmalige Initialisierung, die viel Zeit in Anspruch nimmt zeitaufwendig)

2. Alle Anfragen müssen nicht über das Netzwerk gehen
3. Versuchen Sie, den Code nicht stark zu ändern


Lösung


1. Einfache Golang-Kapselung, kompilieren Sie die Klassenbibliothek eines Drittanbieters in eine ausführbare Datei

2 Kommunikation über eine Zwei-Wege-Pipeline

Vorteile der Verwendung bidirektionaler Pipeline-Kommunikation


1: Es ist nur eine minimale Kapselung der ursprünglichen Golang-Klassenbibliothek erforderlich

2: Beste Leistung (IPC-Kommunikation ist die beste Möglichkeit, zwischen Prozessen zu kommunizieren)
3: Keine Notwendigkeit, Netzwerkanfragen zu stellen, was viel Zeit spart


4: Das Programm muss nur einmal initialisiert werden und bleibt immer im Speicher


Spezifische Implementierungsschritte


1: Original Demo in der Klassenbibliothek aufrufen

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

Speichern Sie die Datei als main .go, Sie können

2 ausführen: Der angepasste Code lautet:

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

Mit nur ein paar einfachen Anpassungen können Sie Folgendes erreichen: Empfangen einer Zeichenfolge von der Standardeingabe, nach der Wortsegmentierung Ausgabe

Test:

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

Das obige ist der detaillierte Inhalt vonWie man mit PHP und Golang zusammenarbeitet. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Verwandte Etiketten:
php
Quelle:php.cn
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