问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

php和go语言哪个好

发布网友 发布时间:2022-04-22 19:29

我来回答

2个回答

懂视网 时间:2022-04-28 13:03

// Go
package main
import (
 "fmt"
 "runtime"
)
func main() {
 fmt.Print("Go runs on ")

 os := runtime.GOOS;

 switch os {
 case "darwin":
 fmt.Println("OS X.")
 case "linux":
 fmt.Println("Linux.")
 default:
 fmt.Printf("%s.
", os)
 }
}
// PHP
echo "PHP runs on ";

switch (PHP_OS) {
 case "darwin":
 echo "OS X.";
 break;
 case "linux":
 echo "Linux.";
 break;
 default:
 echo PHP_OS;
}

For 循环

// Go
package main
import "fmt"
func main() {
 sum := 0

 for i := 0; i < 10; i++ {
 sum += i
 }

 fmt.Println(sum)
}
// PHP
$sum = 0;

for ($i = 0; $i < 10; $i++) {
 $sum += $i;
}
echo $sum;

While 循环

Go自身没有while循环的语法。相应的,Go使用 for 循环代替实现while循环.

// Go
package main
import "fmt"
func main() {
 sum := 1

 for sum < 100 {
 sum += sum
 }

 fmt.Println(sum)
}
// PHP
$sum = 1;
while ($sum < 100) {
 $sum += $sum;
}
echo $sum;

Foreach/Range

PHP使用 foreach 迭代数组和对象。与之对应, Go使用 range 迭代 slice 或 map。

// Go
package main
import "fmt"
func main() {
 colours := []string{"Maroon", "Red", "Green", "Blue"}

 for index, colour := range colours {
 fmt.Printf("index: %d, colour: %s
", index, colour)
 }
}
// PHP
$colours = ["Maroon", "Red", "Green", "Blue"];

foreach($colours as $index => $colour) {
 echo "index: {$index}, colour: {$colour}
";
}

今天的内容就是这些。我尽量使文章篇幅较小且简洁。作为PHP开发人员, 我尝试在练习Go时分享我的知识。也请随意分享你的想法。希望你们喜欢阅读本篇文章。

热心网友 时间:2022-04-28 10:11

  前言
  最近工作中遇到的一个场景,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进程。
  最后,上面都是瞎扯的。如果你了解管道、双向管道,上面的解释对你基本没啥用。但如果你不了解管道,调试上面的代码没问题,但稍有修改就有可能掉坑里。
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
苹果电脑电池充不进电苹果电脑充不进去电是怎么回事 苹果电脑不充电没反应苹果电脑充电指示灯不亮充不了电怎么办 狗狗更加忠诚护家、善解人意,养一只宠物陪伴自己,泰迪能长多大... 描写泰迪狗的外形和特点的句子 国外留学有用吗 花钱出国留学有用吗 !这叫什么号 百万医疗赔付后是否可以续保 前一年理赔过医疗险还能续保吗? 医疗住院险理赔后还能购买吗? oppopbbmoo是什么型号 pdpm00是oppo什么型号 长款旗袍秋冬怎么搭配 谁能告诉我冬天穿夏天的旗袍怎么穿即保暖又好看啊! 冬天旗袍外面穿什么外套 冬天了,旗袍怎么穿不冷?拜托各位大神 冬天九分袖旗袍怎么搭配 冬季如何穿出旗袍的韵味,谢 冬季穿旗袍配什么鞋合适 冬天穿旗袍穿什么鞋子好看 冬天旗袍怎么搭配鞋子 冬天半袖的旗袍怎么搭配? 冬天穿旗袍怎么搭配图 冬天旗袍怎么搭配外套 冬天旗袍外面搭什么外套好看 冬季旗袍怎么搭配鞋子 冬天的旗袍应怎么搭配 冬天旗袍怎么搭配小外套和短外套 微博极速版和微博有什么区别呐? 微博国际版可以充会员吗 PHP 和 GO语言在处理数据计算时,哪个性能更 PBBT00-11-4.C14 OPPO这软件更新有微信美颜视频吗? PHP 和 GO语言在处理数据计算时,哪个性能更快 你好,我买的手机型号是A7xPBBT00怎么电信卡插入上网不好上啊? golang会取代php成为后端语言吗 编程语言推荐 世界上最好的编程语言 转角书桌尺寸及设计风格 找张书桌的图片 书桌的图片 哪个家具网的书桌图片好看? *戳进* 求一张书桌书架可以放图标的桌面壁纸 办公室如何摆放办公桌?有图求真相。风水大师赐教。 卧室比较小,书桌位置的摆放问题,有平面图 电脑桌图片 电脑桌价格 ? 书桌距地面多高合适? 电脑桌和书桌能不能组合在一起,有哪些方案吗? 上面是床,下面是写字台的那种装修叫什么? 9平米的小卧室做电脑桌书桌,我简单的画了个示意图,希望大家帮忙建议! 一个男人这样,我到底怎么是好?