PHP与去语言之间的通信详解

  

  

最近工作中遇到的一个场景,php项目中需要使用一个第三方的功能,而恰好有一个用Golang写好的类库。那么问题就来了,要如何实现不同语言之间的通信呢?下面就来一起看看吧。

  

  

,,,, 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:类库中的原始调取演示

        主要包   导入(   “fmt”   "github.com/yanyiwu/gojieba”   “弦”   )      函数main () {   x:=gojieba.NewJieba ()   推迟x.Free ()      s:="小明硕士毕业于中国科学院计算所,后在日本京都大学深造”   字:=x。CutForSearch(年代,真的)   fmt.Println(字符串。加入(话说,"/"))   }      

保存文件为main.go,就可以运行

  

<强> 2:调整后代码为:

        主要包   导入(   “bufio”   “fmt”   "github.com/yanyiwu/gojieba”   “输入输出”   “操作系统”   “弦”   )      函数main () {      x:=gojieba.NewJieba (   “/数据/tmp/jiebaDict/jieba.dict.utf8”,   “/数据/tmp/jiebaDict/hmm_model.utf8”,   “/数据/tmp/jiebaDict/user.dict.utf8”   )   推迟x.Free ()      inputReader:=bufio.NewReader (os.Stdin)   为{   年代,犯错:=inputReader.ReadString (“\ n”)   如果犯错!=nil,,做错了==OF {   打破   }   s=strings.TrimSpace (s)      如果s !=" {   字:=x。CutForSearch(年代,真的)   fmt.Println(字符串。加入(话说," "))   其他}{   fmt。Println(“空\ n”)   }   }   }      

只需要简单的几行调整,即可实现:从标准输入接收字符串,经过分词再输出
  

  

<强>测试:

        #去构建测试   #/测试。   #//等待用户输入,输入”这是一个测试”   #这是一个测试//程序      

<强> 3:使用猫与Golang通信做简单测试

     //准备一个title.txt,每行是一句文本   #猫标题。txt |。/测试      

正常输出,表示猫已经可以和Golang正常交互了

  

<强> 4:PHP与Golang通信
  

  

以上所示的猫与Golang通信,使用的是单向管道。即:只能从猫向Golang传入数据,Golang输出的数据并没有传回给猫,而是直接输出到屏幕。但文中的需求的是:php与Golang通信。即php要传数据给Golang,同时Golang也必须把执行结果返回给php。因此,需要引入双向管道。
  

  

在PHP中管道的使用:<代码> popen(“/道路/测试”)>   

  

<强>双向管道:

        $ descriptorspec=阵列(   0=比;数组(“管”,“r”),   1=比;阵列(“管”,“w”)   );   处理=proc_open(美元   '/webroot/去/src/测试/测试”,   descriptorspec美元,   美元的管道   );   写入文件($管道(“0”),“这是一个测试文本\ n”);   回声fgets($管道[1]);      

<>强解释:使用<代码> proc_open> PHP与去语言之间的通信详解