最近工作中遇到的一個場景,php專案中需要使用一個第三方的功能,而剛好有一個用Golang寫好的類別庫。那麼問題就來了,要如何實現不同語言之間的溝通呢?下面就來一起看看吧。
常規的方案 (建議學習:PHP影片教學)
1、用Golang寫一個http/TCP服務,php透過http/TCP與Golang通訊
2、將Golang經過較多封裝,做為php擴充。
3、PHP透過系統指令,調取Golang的可執行檔
存在的問題
1.http請求,網路I/O將會消耗大量時間
2、需要封裝大量程式碼
3、PHP每調取一次Golang程序,就需要一次初始化,時間消耗很多
優化目標
#1、Golang程式只初始化一次(因為初始化很耗時)
2、所有請求不需要走網路
3、盡量不大量修改程式碼
解決方案
#1、簡單的Golang封裝,將第三方類別庫編譯產生為一個可執行檔
2、PHP與Golang透過雙向管道通訊
使用雙向管道通訊優勢
1:只需要對原有Golang類別庫進行很少的封裝
2:效能最佳(IPC通訊是進程間通訊的最佳途徑)
3:不需要走網路請求,節省大量時間
4:程式只需初始化一次,並一直保持在記憶體中
具體實作步驟
1:類別庫中的原始調取demo
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中文網其他相關文章!