类别:PHP问题 / 日期:2019-12-02 / 浏览:67 / 评论:0

近来工作中碰到的一个场景,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怎样合营的细致内容,更多请关注ki4网别的相干文章!

打赏

感谢您的赞助~

打开支付宝扫一扫,即可进行扫码打赏哦~

版权声明 : 本文未使用任何知识共享协议授权,您可以任何形式自由转载或使用。

 可能感兴趣的文章

评论区

发表评论 / 取消回复

必填

选填

选填

◎欢迎讨论,请在这里发表您的看法及观点。