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

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

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

     进程cat读出文本

     通过管道将数据传入Golang

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

管道通信耗时:(第二步耗时) - (第三步耗时)

管道通信耗时: 1.817 - 0.015 = 1.802秒

4:PHP与Golang通信的时间消耗

编写简单的php文件:

  <?php
   $descriptorspec = array( 
    0 => array("pipe", "r"), 
    1 => array("pipe", "w")
   );

   $handle = proc_open(
    '/webroot/go/src/test/test', 
    $descriptorspec, 
    $pipes
   );

   $fp = fopen("title.txt", "rb");

   while (!feof($fp)) {
    fwrite($pipes['0'], trim(fgets($fp))."n");
    echo fgets($pipes[1]);
   }

   fclose($pipes['0']);
   fclose($pipes['1']);
   proc_close($handle);

流程与上面基本一致,读出title.txt内容,通过双向管道传入Golang进程分词后,再返回给php (比上面的测试多一步:数据再通过管道返回)

time php popen.php > /dev/null

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

     进程PHP读出文本

     通过管道将数据传入Golang

     Golang处理数据

     Golang将返回结果再写入管道,PHP通过管道接收数据

     将结果返回到屏幕

结论:

1 :整个分词过程中的耗时分布

    使用cat控制逻辑耗时:        14.819 秒

    使用PHP控制逻辑耗时:         24.037 秒(比cat多一次管道通信)

    单向管道通信耗时:           1.8    秒

    Golang中的分词函数耗时:     13.002 秒

2:分词函数的性能: 单进程,100万商品标题分词,耗时13秒

    以上时间只包括分词时间,不包括词典载入时间。但在本方案中,词典只载入一次,所以载入词典时间可以忽略(1秒左右)

3:PHP比cat慢 (这结论有点多余了,呵呵)

    语言层面慢: (24.037 - 1.8 - 14.819) / 14.819 = 50%

单进程对比测试的话,应该不会有哪个语言比cat更快。

相关问题:

1:以上Golang源码中写的是一个循环,也就是会一直从管道中读数据。那么存在一个问题:是不是php进程结束后,Golang的进程还会一直存在?

管道机制自身可解决此问题。管道提供两个接口:读、写。当写进程结束或者意外挂掉时,读进程也会报错,以上Golang源代码中的err逻辑就会执行,Golang进程结束。