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

2019-11-10 10:49:08刘景俊

测试:

 # go build test
 # ./test
 # //等待用户输入,输入”这是一个测试“
 # 这是 一个 测试 //程序

3:使用cat与Golang通信做简单测试

 //准备一个title.txt,每行是一句文本
 # cat title.txt | ./test

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

4:PHP与Golang通信

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

  在PHP中管道的使用:popen("/path/test") ,具体就不展开说了,因为此方法解决不了文中的问题。

双向管道:

  $descriptorspec = array( 
   0 => array("pipe", "r"), 
   1 => array("pipe", "w")
  );
  $handle = proc_open(
   '/webroot/go/src/test/test', 
   $descriptorspec, 
   $pipes
  );
  fwrite($pipes['0'], "这是一个测试文本n");
  echo fgets($pipes[1]);

解释:使用proc_open打开一个进程,调用Golang程序。同时返回一个双向管道pipes数组,php向$pipe['0']中写数据,从$pipe['1']中读数据。

好吧,也许你已经发现,我是标题档,这里重点要讲的并不只是PHP与Golang如何通信。而是在介绍一种方法: 通过双向管道让任意语言通信。(所有语言都会实现管道相关内容)

测试:

通过对比测试,计算出各个流程占用的时间。下面提到的title.txt文件,包含100万行文本,每行文本是从b2b平台取的商品标题

1: 整体流程耗时

time cat title.txt | ./test > /dev/null

耗时:14.819秒,消耗时间包含:

     进程cat读出文本

     通过管道将数据传入Golang

     Golang处理数据,将结果返回到屏幕

2:计算分词函数耗时。方案:去除分词函数的调取,即:注释掉Golang源代码中的调取分词那行的代码

time cat title.txt | ./test > /dev/null

耗时:1.817秒时间,消耗时间包含:

     进程cat读出文本

     通过管道将数据传入Golang

     Golang处理数据,将结果返回到屏幕

分词耗时 = (第一步耗时) - (以上命令所耗时)

分词耗时 : 14.819 - 1.817 = 13.002秒

3:测试cat进程与Golang进程之间通信所占时间

time cat title.txt > /dev/null