私が最近仕事で遭遇したシナリオは、PHP プロジェクトでサードパーティ関数を使用する必要があり、たまたま Golang で書かれたクラス ライブラリがあったというものでした。そこで問題となるのは、異なる言語間のコミュニケーションをどのように実現するかということです。以下を見てみましょう。
従来のソリューション (推奨学習: PHP ビデオ チュートリアル)
1. Golang を使用するhttp/TCP サービスを書き込み、php は http/TCP
2 を介して Golang と通信します。Golang は php 拡張機能としてカプセル化されます。
3. PHP はシステム コマンドを通じて Golang 実行可能ファイルを呼び出します
既存の問題
1. HTTP リクエスト
#3. PHP が Golang プログラムを呼び出すたびに、必要です 1 回の初期化には多くの時間がかかります
1. Golang プログラムは 1 回だけ初期化されます (初期化には時間がかかるため、消費)
2. すべてのリクエストはネットワークを経由する必要はありません
#3. コードをあまり変更しないようにしてください
#解決策
1. シンプルな Golang カプセル化、サードパーティのクラス ライブラリを実行可能ファイルにコンパイルします
双方向パイプライン通信を使用する利点
#1: 元の Golang クラス ライブラリの最小限のカプセル化のみが必要です
1: オリジナルクラス ライブラリのデモを呼び出します。
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, "/")) }
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") } } }
簡単な調整をいくつか行うだけで実現できます。標準入力から文字列を受け取り、単語を分割した後、出力します。
テスト:
# go build test # ./test # //等待用户输入,输入”这是一个测试“ # 这是 一个 测试 //程序
以上がphpとgolangを連携させる方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。