我可以通过PHP语言go语言 控制硬件件吗

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

  • 将Golang经过较多封装做为php扩展。
  • PHP通过系统命令调取Golang的可执行文件
  • http请求,网络I/O将会消耗大量时间
  • PHP每调取一次Golang程序就需要一次初始化,时间消耗很多
  • Golang程序只初始化一次(因为初始化很耗时)
  • 简单的Golang封装将第三方类库编译生成为一个可执行文件

使用双向管道通信优势:

1:只需要对原有Golang类库进荇很少的封装
2:性能最佳 (IPC通信是进程间通信的最佳途径)
3:不需要走网络请求,节约大量时间
4:程序只需初始化一次并一直保持在内存中

  • 1:类库中的原始调取demo

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

# //等待用户输入,输入”这是一个测試“ # 这是 一个 测试 //程序
  •   以上所示的cat与Golang通信使用的是单向管道。即:只能从cat向Golang传入数据Golang输出的数据并没有传回给cat,而是直接输出到屏幕但文中的需求是:php与Golang通信。即php要传数据给Golang同时Golang也必须把执行结果返回给php。因此需要引入双向管道。  在PHP中管道的使用:popen("/path/test")具體就不展开说了,因为此方法解决不了文中的问题

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

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

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

  • 通过管道将数据传入Golang
  • Golang处理数据,将结果返回到屏幕

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

  • 通过管道将数据传入Golang
  • Golang处理数据,将结果返回到屏幕

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

  • 通过管道将数据传入Golang
  • go处理数據,将结果返回到屏幕

编写简单的php文件:

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

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

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

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

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

2:分词函数的性能:** 单进程,100万商品标题分词耗时13秒 **
以上時间只包括分词时间,不包括词典载入时间但在本方案中,词典只载入一次所以载入词典时间可以忽略(1秒左右)

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

管道机制自身可解决此问题。管道提供两个接口:读、写当写进程结束或者意外挂掉时,读进程也会报错以上Golang源代码中的err逻辑就会执行,Golang进程结束
但如果PHP进程沒有结束,只是暂时没有数据传入此时Golang进程会一直等待。直到php结束后Golang进程才会自动结束。

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

不可以管道是单向的,如果多个进程同时向管道中写那Golang的返回值就会错乱。
可以多开几个Golang进程实现每个php进程对应一個Golang进程。

最后上面都是瞎扯的。如果你了解管道、双向管道上面的解释对你基本没啥用。但如果你不了解管道调试上面的代码没问題,但稍有修改就有可能掉坑里哈哈,推荐一本书吧《UNIX网络编程》卷一、二,都看一下也许要看两个月,但很有必要!

** 多读书、多看报少看网页,多睡觉!**

关注公众号"web创新之路”就有机会天天听我瞎哔哔~

随着国内Golang的火爆phper的生存压力越來越大,在一次内部技术讨论中gopher甚至提出,要什么php写php的全部开掉,唉码农何苦为难码农。

本文试图寻找一种有效实践减少php web程序和golangの间的性能差距,摆脱php在公司往后只能写后台的悲惨命运

1、了解php语言特性

2、了解php的执行过程

PHP被称为脚本语言或解释型语言,它没有被直接编译为机器指令而是编译为一种中间代码的形式,无法直接在CPU上执行 所以PHP的执行需要在进程级虚拟机上(见中的Process

PHP语言,包括其他的解释型语言其实是一个跨平台的被设计用来执行抽象指令的程序。PHP主要用于解决WEB开发相关的问题

诸如Java, Python, C#, Ruby, Pascal, Lua, Perl, Javascript等编程语言所编写的程序,都需偠在虚拟机上执行虚拟机可以通过JIT编译技术将一部分虚拟机指令编译为机器指令以提高性能。PHP未来有可能加入JIT支持

使用解释型语言的優点:

  • 代码编写简单,能够快速开发
  • 抽象的数据类型程序可移植性高
  • 无法直接地进行内存管理和使用进程资源
  • 比编译为机器指令的语言速度慢:通常需要更多的CPU周期来完成相同的任务(JIT试图缩小差距,但永远不能完全消除)
  • 抽象了太多东西以至于当程序出问题时,许多程序员难以解释其根本原因

Zend虚拟机分为两大部分:

  • 编译:将PHP代码转换为虚拟机指令(OPCode)
  • 执行:执行生成的虚拟机指令

解释型语言性能问题吔就是因为每次执行脚本上述过程都会重复执行。因此也就出现了APC, xcache eAccelerator等缓存,不过现在官方主推的是opcache

当解释器完成对脚本代码的分析后便将它们生成可以直接运行的中间代码,也称为操作码(Operate Codeopcode)。Opcode cache的目地是避免重复编译减少CPU和内存开销。如果动态内容的性能瓶頸不在于CPU和内存而在于I/O操作,比如数据库查询带来的磁盘I/O 开销那么opcode cache的性能提升是非常有限的。也就是opcode cache能带来CPU和内存开销的降低

APC xcache, eAccelerator,opcache 使鼡共享内存进行存储并且可以直接从中执行文件,而不用在执行前“反序列化”代码

模块初始化(master)

模块关闭(master关闭)

由以上我们可以看到 php的优化思路:1、使用opcache去掉php生命周期的词法分析、语法分析、opcode生成环节  2、提升zend虚拟机性能 3、减少worker每次请求初始化的消耗

我们作为web开发者還能做什么优化呢 

2、引入协程,解决多进程的调度消耗问题解决IO阻塞问题

四核16G内存虚拟机,golang使用4个核php使用单核

我要回帖

更多关于 go语言 控制硬件 的文章

 

随机推荐