ホームページ  >  記事  >  バックエンド開発  >  phpとgolangを連携させる方法

phpとgolangを連携させる方法

(*-*)浩
(*-*)浩オリジナル
2019-10-17 13:39:056004ブラウズ

私が最近仕事で遭遇したシナリオは、PHP プロジェクトでサードパーティ関数を使用する必要があり、たまたま Golang で書かれたクラス ライブラリがあったというものでした。そこで問題となるのは、異なる言語間のコミュニケーションをどのように実現するかということです。以下を見てみましょう。

phpとgolangを連携させる方法

従来のソリューション (推奨学習: PHP ビデオ チュートリアル)

1. Golang を使用するhttp/TCP サービスを書き込み、php は http/TCP

2 を介して Golang と通信します。Golang は php 拡張機能としてカプセル化されます。

3. PHP はシステム コマンドを通じて Golang 実行可能ファイルを呼び出します

既存の問題

1. HTTP リクエスト

#2. 大量のコードをカプセル化する必要がある


#3. PHP が Golang プログラムを呼び出すたびに、必要です 1 回の初期化には多くの時間がかかります


最適化の目標


1. Golang プログラムは 1 回だけ初期化されます (初期化には時間がかかるため、消費)


2. すべてのリクエストはネットワークを経由する必要はありません

#3. コードをあまり変更しないようにしてください

#解決策

1. シンプルな Golang カプセル化、サードパーティのクラス ライブラリを実行可能ファイルにコンパイルします

2. PHP と Golang は次の方法で通信します。双方向パイプライン


双方向パイプライン通信を使用する利点

#1: 元の Golang クラス ライブラリの最小限のカプセル化のみが必要です

2: 最高のパフォーマンス (プロセス間の通信には IPC 通信が最適です)


3: ネットワーク要求を行う必要がないため、時間を大幅に節約できます


4: プログラムを初期化する必要があるのは 1 回のみで、常にメモリに保持されます。


具体的な実装手順

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, "/"))
}

ファイルを main .go として保存し、実行できます。

2: 調整されたコードは次のとおりです:

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 サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。