php和go语言哪个好

Python020

php和go语言哪个好,第1张

前言

最近工作中遇到的一个场景,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:类库中的原始调取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

# //等待用户输入,输入”这是一个测试“

# 这是 一个 测试 //程序

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

耗时: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进程结束。

但如果PHP进程没有结束,只是暂时没有数据传入,此时Golang进程会一直等待。直到php结束后,Golang进程才会自动结束。

2:能否多个php进程并行读写同一个管道,Golang进程同时为其服务?

不可以。管道是单向的,如果多个进程同时向管道中写,那Golang的返回值就会错乱。

可以多开几个Golang进程实现,每个php进程对应一个Golang进程。

最后,上面都是瞎扯的。如果你了解管道、双向管道,上面的解释对你基本没啥用。但如果你不了解管道,调试上面的代码没问题,但稍有修改就有可能掉坑里。

大家在 英语学习 的时候经常会对while的用法感到疑惑,那你知道while是怎么用的吗?下面我给大家做了while的用法 总结 ,希望可以帮助到大家!

▼▼目录▼▼

while用法总结

when,while,as用法区分

while的用法双语例句

●  while用法总结

while用法1

While作为并列连词,意思为“而,然而”,表前后意义上的对比或转折。

例如:There’s plenty of rain in the southeast,while there's little in the northeast.东南部雨量充足,而西北部则很少下雨。

Some people waste food while others haven't enough.有些人浪费粮食,然而有些人却吃不饱。

while用法2

另外while还有别的用法,while引导状语从句,有以下两种含义:

1.表示某个动作正在进行的同时,另一动作也在进行之中,这时主从句都用进行时态,有对同类的两个动作进行对比的意味.如:

While I was playing the piano,she was dancing.我在弹钢琴,她在跳舞.

While Jim is picking apples,Kate is carrying apples to the truck.吉姆正在摘苹果,凯特正在把苹果搬到卡车上去.

    2.表示某个动作正在进行时,又发生了另一动作(该动作用一般过去时).如:

While I was reading,I fell asleep.我读着读着就睡着了.

While we were swimming in the river,we saw a fish jump out of the water.我们正在河中 游泳 时,看见一条鱼跃出了水面.

while用法3

1.只要(=as long as)

There will be life while there is water and air.只要有空气和水,就会有生命.

   2.而;然而〔表示对比〕

He is a driver while I'm a teacher.他是司机,而我是老师.

   3.虽然(=although);尽管〔表示让步〕

While I see what you say,I can't agree with you.虽然我能理解你说的话,但是我不能同意你.

   4.用作名词,表示“一会儿或一段时间”,常与a,the或this等连用.如:

Just wait a while and then I will help you.等一下,我会来帮你的.

Where have you been all this while?这一阵子你一直都在哪儿?

while用法4

while所引导的时间状语从句中的谓语动词只能是延续性动词。

例如:I met with an old friend of mine while(when) I was walking along the street.

while用法5

while 引导状语从句时,应注意以下几点:

1.while 引导的时间状语从句既可放在句首,也可放在句末而 while 引导的让步状语从句一般放在句首,不放在句末.另外,也可以从意义上加以区分.

例如:While he was tired, he went on working.(虽然他累了,但他还是继续工作.)(while 引导让步状语从句)While he was tired, he would have a rest.(他累了就休息一会儿.)(while 引导时间状语从句)

2. while 引导让步状语从句时,如果从句的主语和主句的主语相同,那么从句的主语和谓语动词 be 都可以省略.

例如:While he was ill, he went there. (= While ill, he went there.)(虽然他有病,但他还是去那里了.)

3. while 和 when 都可以引导时间状语从句,但应注意: while 引导的时间状语从句中的谓语动词必须是延续性的动词而 when 引导的时间状语从句中的谓语动词既可以是延续性动词,也可以是非延续性动词.当时间状语从句中的谓语动词是延续性动词时, while 和 when 可以互相替换.

例如:While we were talking, the teacher came in.(我们正在谈话时,老师进来了.)

The bus had left when we arrived at the bus stop.(当我们到达车站时,公共汽车已经开走了.)(arrive 是非延续性动词,因此,此句中的 when 不能用 while 替换.)When / While we were having a meeting, our teacher came in.(我们正在开会时,老师走了进来.)(have 是延续性动词,因此,句中的 when 可以用 while 替换.)

4. while 引导的状语从句还可以表示“某个动作正在进行的同时,另一个动作也在进行之中”.

例如:While the teacher was speaking, the students were listening.(老师讲课时,学生们在听.)

>>>

●  when, while, as用法区分

when, while, as都可作"当……的时候"解,但它们之间也有差别。

1. 若主句表示的是一个短暂性动作,从句表示的是一个持续性动作,三者都可用。

He fell asleep when/while/as he was reading. 他看书时睡着了。

2. when只表示一般的时间关系,它既可指时间的一点,也可指一段时间。用when时,从句的动作可与主句的动作同时发生,也可先于主句的动作,因此when用得最多。如:

He was playing basketball when I saw him. 当我看见他的时候,他正在打 篮球 。

Don't forget to return this book for me, when you go to the library. 你去图书馆时,不要忘记替我还这本书。

3. while只能指一段时间,而不能指时间的一点。用while时,从句的动作或者与主句的动作同时发生,或者主句的动作是在从句的动作的进展过程中发生的。因此,从句中的谓语必须是表示延续性动作或状态的动词。这是while与when的主要差别。       

如:

When we arrived in Beijing, it was raining. (arrive不是延续性的动词)我们到达北京时,天正在下雨。

Please do not trouble me while I am writing my homework. 我写作业时请不要打扰我。

4. 在用when和while连接的从句中,常省略与主句相同的主语和相应的be,而在as连接的从句中一般则不省略。

如:

He fell asleep while(he was)studying his grammar book.他在阅读语法书的时候睡着了。

While in London,he studied music.他在伦敦的时候,研究音乐。

5. when 可用作并列连词,表示“这时(突然)”;while 也可以用作并列连词,表示“而”、“却”(表示对比);但 as 则没有类似用法:

We were about to start when it began to rain. 我们正要出发,这时天开始下雨了。

He likes coffee, while she likes tea. 他喜欢咖啡,而她却喜欢茶。

>>>

●  while的用法双语例句

1、The effects of global warming, while not immediate, are potentially catastrophic.

全球气温上升的后果虽然并非即时发生,但可能潜伏着大灾难。

2、While her observations may be true about some men, they could hardly apply to the entire gender.

虽然她的评论就某些男人而言可能是正确的,但绝不适用于所有男性。

《柯林斯高阶英汉双解学习词典》

3、It will take a while for the drug to work out of your system.

这药得需要一段时间才能排出你的体外。

4、I'll be back in a little while.

我一会儿就回来。

5、You'll water the plants while I'm away, won't you?

我外出的时候请你给花草浇浇水,行不行?

6、Her parents died while she was still at school.

她还在读书时父母就去世了。

7、He'll do the job if you make it worth his while.

你要是给他的报酬丰厚,他会做这份工作的。

8、Give me your hand while we cross the road.

过马路时拉着我的手。

9、We spent a good while looking for the house.

我们花了好长时间找这房子。

10、I'll keep you company while you're waiting.

你等待时我会陪伴你。

>>>

while的用法总结大全相关 文章 :

★ 有关while的几种用法

★ c语言中while的用法

★ c语言里while的用法

★ while 和 as在英语中的用法详解

★ 英语语法大全总结

★ 2020高考生必看的英语语法大汇总

★ worthwhile的意思用法总结大全

★ 考研英语学习总结范文

★ 高中英语语法总结大全

var _hmt = _hmt || [](function() { var hm = document.createElement("script") hm.src = "https://hm.baidu.com/hm.js?fff14745aca9358ff875ff9aca1296b3" var s = document.getElementsByTagName("script")[0] s.parentNode.insertBefore(hm, s)})()