首頁  >  文章  >  後端開發  >  php和golang怎麼配合

php和golang怎麼配合

(*-*)浩
(*-*)浩原創
2019-10-17 13:39:056021瀏覽

最近工作中遇到的一個場景,php專案中需要使用一個第三方的功能,而剛好有一個用Golang寫好的類別庫。那麼問題就來了,要如何實現不同語言之間的溝通呢?下面就來一起看看吧。

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中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn