热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

[转]为什么PHPer应当学习Golang.

熟悉我的朋友应当知道,近些年的大部分时间我的工作都会多少和PHP相关。随着PHP有着越来越深入的了解,以及遇到越来越多的不同业务时,使用PHP总会让我有一种莫名的无力感
熟悉我的朋友应当知道,近些年的大部分时间我的工作都会多少和 PHP 相关。随着 PHP 有着越来越深入的了解,以及遇到越来越多的不同业务时,使用 PHP 总会让我有一种莫名的无力感。当然,并不是我一个人在使用 PHP 的时候遇到了问题。事实上,每个略微有一些经验,接触过一些需求的人都会有同样的困惑。各种配合 LAMP(或者LNMP?)架构的后端技术也因此被发明或被发现,进而整合到 PHP 的开发的技术体系中。从简单的 Memcached作为数据中转,cron 后端定时处理;到 Gearman、RabbitMQ 这些队列神器;最近 Laruence 甚至封装了利用 libcurl 的异步特性实现并发 RPC 调用的 yar 扩展。几乎整个社区都在寻找 PHP 的摩西之路。

好吧,说了一大堆,回归主题。之前我写了一篇英文练笔《Why you PHP guys should learn Golang》,获得不少国际友人的关注。排除拼写和语法被他们诟病外,主要是有许多朋友觉得我没把事情说清楚。所以这里我用母语重新聊聊这个事情,只是这些国际友人什么时候能学会阅读中文呢?;)

Go 或者 Golang,是由 Google 支持的快速、一致、稳定的,有活跃的社区支持的开源编程语言。越来越多的应用选择使用 Golang 进行构建。虽然 Rob Pike 说“… 我们希望 C++ 程序员来了解 Go 并作为一个可选的语言 …”,不过我真得认为:PHPer 应当学习 Golang! 接下来我们就来谈谈原因。


容易学习

PHP 相当容易学习。Golang 也是!

在这点上,一群大老外对我的观点进行了猛烈的抨击。他们认为我羞辱了 PHPer,说得好像只有简单的东西 PHPer 才能学会一样。但是,这难道不是事实吗?或者换个说法:像我一样的喜欢 PHP 的人,或多或少都会更喜欢简单的东西。

PHP 的语法接近 C 族编程语言(C/C++/Java等等)。如果有这些语言的经验,在第一次遇到 PHP 的时候立刻就能开始上手编写代码。在我看来,编写 PHP 代码或许更加考验程序员的记忆力,而不是智力(当你面对各种不同风格的函数定义、各种扩展的特殊约定时,你一定会相当认同我的观点)。

Golang 同样是一个 C 族编程语言。呃,或者有一些不同吧。例如关键字 “for”,功能上和 PHP 的接近,但是没有括号。条件语句 “if” 同样无需括号。可以阅读 Effective Go 了解更多内容。

Golang 只有 3025 个关键字和 47 个操作符号、分隔符号或其他特殊标记。记住这些标记确实不需要什么特别的努力。精巧的类型系统相当容易使用。实用的,具有方法的结构体类型代替了笨重的对象系统。接口的设计是 Golang 中我最喜欢的部分。当完成了《Go 指南》的学习之后,利用 PHP 积累的经验,立刻就可以开始使用 Golang 处理一些简单的任务。

容易使用

PHP 脚本是由 SAPI 组件进行解析执行的,如 Web 服务器模块、PHP-FPM 或者 CLI。部署 PHP 所需要的全部东西就是一个 SAPI 环境。配置这个环境对于新手来说可能是学习 PHP 过程中最为困难的部分。

所有的 Golang 代码会编译和链接为本地码。所以除了编译环境,执行时无需再为其进行任何特别的部署。对比 PHP 环境的配置,这要简单很多。你真得认为配置 PHP 环境很复杂吗?我不觉得,真的!而配置 Golang 编译环境比那还要简单点。

我确信已经有大量的 Golang 相关的书籍、文章介绍过如何进行编译环境的配置了。为了更加清晰,我这里梳理一下思路。
有三个步骤需要处理:

  • 下载 Golang 的源代码;
  • 根据《[翻译]Go 环境设置》的提示设置环境变量;
  • 运行源代码 src 目录中的 all.bash。

或者一步到位:使用二进制包进行安装。

然后就会得到一个叫做“go”的工具集合。使用“go”工具和使用 PHP 的 CLI 工具一样简单。《[翻译]go 工具》对此进行了详细的解释。

PHP 的迷思

如果一个编程语言容易学习和使用,我们是不是就应当学习它呢?有许多容易学习和使用的编程语言。难道要把它们都学一遍?答案是显然的:NO!

但是为什么 PHPer 应当学习 Golang 呢?只是因为它很酷!是的,我在开玩笑,但是这是真的。无论如何先从 PHP 自身谈起吧。

PHP “原本是为了开发动态的 Web 页面而设计的服务器端通用语言(Wikipedia)”。PHP 一个重要的特性就是可以嵌入到 HMTL 中。代码编写在“”标签内;HTML 写在标签外。它有一个强大的扩展系统。扩展使用 C 调用 Zend API 编写。数据的处理实际上要利用这些扩展完成。在我看来,PHP 是世界上最好的模板语言。

但是当积累了一些 PHP 的经验,并且开始面对一些更加复杂的 Web 应用时,你一定会对 PHP 产生一种无力的感觉。它没有内建的并行机制,没有线程、进程(你真得认为那个简陋的进程控制可以不加改造的用在高并发的生产环境?),或者其他某“程”。一个慢数据源可以阻塞整个页面的处理。消息队列、缓存、代理……系统开始不仅仅是 PHP 这么单纯,还包括了许多服务和系统组件。这时,PHP 只处理很少的业务逻辑,成为真正的模板语言了。

PHPer 们总是在寻找解决这一问题的办法,如“PHP multithread”或者PHP RPC 并发框架。我很难说哪种会更好一些。不过我肯定你会需要选择一些编程语言用于后端工作的开发。就我自己的经验,我尝试过 C(一直在和 malloc/free 进行搏斗)/Java(陷入到了 jar 地狱中)/Python(从来没能做到 Pythonic 不说,还总是在错误的类型中打转)……如果想要获得性能,就得同内存管理进行搏斗;如果用 GC,就得部署和调优 VM;当获得便利性的时候,同时也是走在刀尖上,一个小错误就引起巨大的灾难……每个都有优势,同样每个都有问题。

好吧!现在回到 Golang!

Golang 有 GC,无需关心内存管理(或者可以用较少的精力去关注它)。代码被编译为本地码,因此“cp”和“mv”就是部署 Golang 编写的应用所需要的全部工具。噢,我刚才已经说过了,Golang 是一个具有静态类型系统的编译语言。所以你没有机会弄乱变量的类型。当然,PHPer 应该学习 Golang 的一个重要原因是“转到 Go 是因为他们并未放弃太多的表达能力,但是获得了性能,并且与并发共舞(Rob Pike)”。《Why Not Go?(英文)》对此进行了深入的分析。

我可以分享一些我的经验:有一个 Gearman 的 worker 用于处理后端数据。PHP 通过其 API 连接到 Gearman 的 Job Server 向 worker 发起请求。最初 worker 是使用 python 编写的(还有更加原始的版本,PHP 的,但是你能想像它工作起来……唉,不说了……)。这个版本有许多的问题(是我们自己的问题,不关 Python 的事),但是至少它能工作。后来用 Golang 重写了这个 worker。为此我开发了 Golang 的 Gearman API,并使用 Zend API 编写了一个在 Golang 中执行 PHP 脚本的包。然后将它们放在一起:一个可以执行 PHP 的 Gearman worker。它已经工作了一段时间了,看起来还不错!哦,受到 Yar 的启发,这里还有一个 Golang 编写的 RPC 合并器,用来合并 PHP 脚本中的 RPC 调用。现在还是个玩具,不过或许日后能用得着。这其实是将 Golang 的 channel 当作消息队列来用。我在《Golang:有趣的 channel 应用》中对此有一些说明。

世界真美好啊。谢谢 Golang!

无论如何,大多数 PHPer 在进行后端开发的时候都会需要学习一些其他语言。如果你正在寻找,或者已经尝试了一些其他语言。为什么不来试试 Golang?它真得可以让你的生活更加轻松和快乐。让你可以有更多的时间陪伴你的家人和朋友,吃你爱吃的东西,去你想去的地方。

貌似我还是没说清楚啊?好吧,没关系,在下个月的中国软件开发者大会上再跟大家就这个话题做一个探讨吧。




熟悉我的朋友应当知道,近些年的大部分时间我的工作都会多少和 PHP 相关。随着 PHP 有着越来越深入的了解,以及遇到越来越多的不同业务时,使用 PHP 总会让我有一种莫名的无力感。当然,并不是我一个人在使用 PHP 的时候遇到了问题。事实上,每个略微有一些经验,接触过一些需求的人都会有同样的困惑。各种配合 LAMP(或者LNMP?)架构的后端技术也因此被发明或被发现,进而整合到 PHP 的开发的技术体系中。从简单的 Memcached作为数据中转,cron 后端定时处理;到 Gearman、RabbitMQ 这些队列神器;最近 Laruence 甚至封装了利用 libcurl 的异步特性实现并发 RPC 调用的 yar 扩展。几乎整个社区都在寻找 PHP 的摩西之路。

好吧,说了一大堆,回归主题。之前我写了一篇英文练笔《Why you PHP guys should learn Golang》,获得不少国际友人的关注。排除拼写和语法被他们诟病外,主要是有许多朋友觉得我没把事情说清楚。所以这里我用母语重新聊聊这个事情,只是这些国际友人什么时候能学会阅读中文呢?;)

Go 或者 Golang,是由 Google 支持的快速、一致、稳定的,有活跃的社区支持的开源编程语言。越来越多的应用选择使用 Golang 进行构建。虽然 Rob Pike 说“… 我们希望 C++ 程序员来了解 Go 并作为一个可选的语言 …”,不过我真得认为:PHPer 应当学习 Golang! 接下来我们就来谈谈原因。


容易学习

PHP 相当容易学习。Golang 也是!

在这点上,一群大老外对我的观点进行了猛烈的抨击。他们认为我羞辱了 PHPer,说得好像只有简单的东西 PHPer 才能学会一样。但是,这难道不是事实吗?或者换个说法:像我一样的喜欢 PHP 的人,或多或少都会更喜欢简单的东西。

PHP 的语法接近 C 族编程语言(C/C++/Java等等)。如果有这些语言的经验,在第一次遇到 PHP 的时候立刻就能开始上手编写代码。在我看来,编写 PHP 代码或许更加考验程序员的记忆力,而不是智力(当你面对各种不同风格的函数定义、各种扩展的特殊约定时,你一定会相当认同我的观点)。

Golang 同样是一个 C 族编程语言。呃,或者有一些不同吧。例如关键字 “for”,功能上和 PHP 的接近,但是没有括号。条件语句 “if” 同样无需括号。可以阅读 Effective Go 了解更多内容。

Golang 只有 3025 个关键字和 47 个操作符号、分隔符号或其他特殊标记。记住这些标记确实不需要什么特别的努力。精巧的类型系统相当容易使用。实用的,具有方法的结构体类型代替了笨重的对象系统。接口的设计是 Golang 中我最喜欢的部分。当完成了《Go 指南》的学习之后,利用 PHP 积累的经验,立刻就可以开始使用 Golang 处理一些简单的任务。

容易使用

PHP 脚本是由 SAPI 组件进行解析执行的,如 Web 服务器模块、PHP-FPM 或者 CLI。部署 PHP 所需要的全部东西就是一个 SAPI 环境。配置这个环境对于新手来说可能是学习 PHP 过程中最为困难的部分。

所有的 Golang 代码会编译和链接为本地码。所以除了编译环境,执行时无需再为其进行任何特别的部署。对比 PHP 环境的配置,这要简单很多。你真得认为配置 PHP 环境很复杂吗?我不觉得,真的!而配置 Golang 编译环境比那还要简单点。

我确信已经有大量的 Golang 相关的书籍、文章介绍过如何进行编译环境的配置了。为了更加清晰,我这里梳理一下思路。
有三个步骤需要处理:

  • 下载 Golang 的源代码;
  • 根据《[翻译]Go 环境设置》的提示设置环境变量;
  • 运行源代码 src 目录中的 all.bash。

或者一步到位:使用二进制包进行安装。

然后就会得到一个叫做“go”的工具集合。使用“go”工具和使用 PHP 的 CLI 工具一样简单。《[翻译]go 工具》对此进行了详细的解释。

PHP 的迷思

如果一个编程语言容易学习和使用,我们是不是就应当学习它呢?有许多容易学习和使用的编程语言。难道要把它们都学一遍?答案是显然的:NO!

但是为什么 PHPer 应当学习 Golang 呢?只是因为它很酷!是的,我在开玩笑,但是这是真的。无论如何先从 PHP 自身谈起吧。

PHP “原本是为了开发动态的 Web 页面而设计的服务器端通用语言(Wikipedia)”。PHP 一个重要的特性就是可以嵌入到 HMTL 中。代码编写在“”标签内;HTML 写在标签外。它有一个强大的扩展系统。扩展使用 C 调用 Zend API 编写。数据的处理实际上要利用这些扩展完成。在我看来,PHP 是世界上最好的模板语言。

但是当积累了一些 PHP 的经验,并且开始面对一些更加复杂的 Web 应用时,你一定会对 PHP 产生一种无力的感觉。它没有内建的并行机制,没有线程、进程(你真得认为那个简陋的进程控制可以不加改造的用在高并发的生产环境?),或者其他某“程”。一个慢数据源可以阻塞整个页面的处理。消息队列、缓存、代理……系统开始不仅仅是 PHP 这么单纯,还包括了许多服务和系统组件。这时,PHP 只处理很少的业务逻辑,成为真正的模板语言了。

PHPer 们总是在寻找解决这一问题的办法,如“PHP multithread”或者PHP RPC 并发框架。我很难说哪种会更好一些。不过我肯定你会需要选择一些编程语言用于后端工作的开发。就我自己的经验,我尝试过 C(一直在和 malloc/free 进行搏斗)/Java(陷入到了 jar 地狱中)/Python(从来没能做到 Pythonic 不说,还总是在错误的类型中打转)……如果想要获得性能,就得同内存管理进行搏斗;如果用 GC,就得部署和调优 VM;当获得便利性的时候,同时也是走在刀尖上,一个小错误就引起巨大的灾难……每个都有优势,同样每个都有问题。

好吧!现在回到 Golang!

Golang 有 GC,无需关心内存管理(或者可以用较少的精力去关注它)。代码被编译为本地码,因此“cp”和“mv”就是部署 Golang 编写的应用所需要的全部工具。噢,我刚才已经说过了,Golang 是一个具有静态类型系统的编译语言。所以你没有机会弄乱变量的类型。当然,PHPer 应该学习 Golang 的一个重要原因是“转到 Go 是因为他们并未放弃太多的表达能力,但是获得了性能,并且与并发共舞(Rob Pike)”。《Why Not Go?(英文)》对此进行了深入的分析。

我可以分享一些我的经验:有一个 Gearman 的 worker 用于处理后端数据。PHP 通过其 API 连接到 Gearman 的 Job Server 向 worker 发起请求。最初 worker 是使用 python 编写的(还有更加原始的版本,PHP 的,但是你能想像它工作起来……唉,不说了……)。这个版本有许多的问题(是我们自己的问题,不关 Python 的事),但是至少它能工作。后来用 Golang 重写了这个 worker。为此我开发了 Golang 的 Gearman API,并使用 Zend API 编写了一个在 Golang 中执行 PHP 脚本的包。然后将它们放在一起:一个可以执行 PHP 的 Gearman worker。它已经工作了一段时间了,看起来还不错!哦,受到 Yar 的启发,这里还有一个 Golang 编写的 RPC 合并器,用来合并 PHP 脚本中的 RPC 调用。现在还是个玩具,不过或许日后能用得着。这其实是将 Golang 的 channel 当作消息队列来用。我在《Golang:有趣的 channel 应用》中对此有一些说明。

世界真美好啊。谢谢 Golang!

无论如何,大多数 PHPer 在进行后端开发的时候都会需要学习一些其他语言。如果你正在寻找,或者已经尝试了一些其他语言。为什么不来试试 Golang?它真得可以让你的生活更加轻松和快乐。让你可以有更多的时间陪伴你的家人和朋友,吃你爱吃的东西,去你想去的地方。

貌似我还是没说清楚啊?好吧,没关系,在下个月的中国软件开发者大会上再跟大家就这个话题做一个探讨吧。


推荐阅读
  • 2018年人工智能大数据的爆发,学Java还是Python?
    本文介绍了2018年人工智能大数据的爆发以及学习Java和Python的相关知识。在人工智能和大数据时代,Java和Python这两门编程语言都很优秀且火爆。选择学习哪门语言要根据个人兴趣爱好来决定。Python是一门拥有简洁语法的高级编程语言,容易上手。其特色之一是强制使用空白符作为语句缩进,使得新手可以快速上手。目前,Python在人工智能领域有着广泛的应用。如果对Java、Python或大数据感兴趣,欢迎加入qq群458345782。 ... [详细]
  • 如何实现织梦DedeCms全站伪静态
    本文介绍了如何通过修改织梦DedeCms源代码来实现全站伪静态,以提高管理和SEO效果。全站伪静态可以避免重复URL的问题,同时通过使用mod_rewrite伪静态模块和.htaccess正则表达式,可以更好地适应搜索引擎的需求。文章还提到了一些相关的技术和工具,如Ubuntu、qt编程、tomcat端口、爬虫、php request根目录等。 ... [详细]
  • 项目需要将音视频文件上传服务器,考虑并发要求高,通过七牛来实现。直接上代码usingQiniu.IO;usingQiniu.IO.Resumable;usingQiniu.RPC; ... [详细]
  • 1、DashAPI文档Dash是一个API文档浏览器,使用户可以使用离线功能即时搜索无数API。程序员使用Dash可访问iOS,MacOS, ... [详细]
  • Python字典推导式及循环列表生成字典方法
    本文介绍了Python中使用字典推导式和循环列表生成字典的方法,包括通过循环列表生成相应的字典,并给出了执行结果。详细讲解了代码实现过程。 ... [详细]
  • 本文讨论了Alink回归预测的不完善问题,指出目前主要针对Python做案例,对其他语言支持不足。同时介绍了pom.xml文件的基本结构和使用方法,以及Maven的相关知识。最后,对Alink回归预测的未来发展提出了期待。 ... [详细]
  • 本文介绍了OC学习笔记中的@property和@synthesize,包括属性的定义和合成的使用方法。通过示例代码详细讲解了@property和@synthesize的作用和用法。 ... [详细]
  • 知识图谱——机器大脑中的知识库
    本文介绍了知识图谱在机器大脑中的应用,以及搜索引擎在知识图谱方面的发展。以谷歌知识图谱为例,说明了知识图谱的智能化特点。通过搜索引擎用户可以获取更加智能化的答案,如搜索关键词"Marie Curie",会得到居里夫人的详细信息以及与之相关的历史人物。知识图谱的出现引起了搜索引擎行业的变革,不仅美国的微软必应,中国的百度、搜狗等搜索引擎公司也纷纷推出了自己的知识图谱。 ... [详细]
  • 如何提高PHP编程技能及推荐高级教程
    本文介绍了如何提高PHP编程技能的方法,推荐了一些高级教程。学习任何一种编程语言都需要长期的坚持和不懈的努力,本文提醒读者要有足够的耐心和时间投入。通过实践操作学习,可以更好地理解和掌握PHP语言的特异性,特别是单引号和双引号的用法。同时,本文也指出了只走马观花看整体而不深入学习的学习方式无法真正掌握这门语言,建议读者要从整体来考虑局部,培养大局观。最后,本文提醒读者完成一个像模像样的网站需要付出更多的努力和实践。 ... [详细]
  • MySQL中的MVVC多版本并发控制机制的应用及实现
    本文介绍了MySQL中MVCC的应用及实现机制。MVCC是一种提高并发性能的技术,通过对事务内读取的内存进行处理,避免写操作堵塞读操作的并发问题。与其他数据库系统的MVCC实现机制不尽相同,MySQL的MVCC是在undolog中实现的。通过undolog可以找回数据的历史版本,提供给用户读取或在回滚时覆盖数据页上的数据。MySQL的大多数事务型存储引擎都实现了MVCC,但各自的实现机制有所不同。 ... [详细]
  • svnWebUI:一款现代化的svn服务端管理软件
    svnWebUI是一款图形化管理服务端Subversion的配置工具,适用于非程序员使用。它解决了svn用户和权限配置繁琐且不便的问题,提供了现代化的web界面,让svn服务端管理变得轻松。演示地址:http://svn.nginxwebui.cn:6060。 ... [详细]
  • Java和JavaScript是什么关系?java跟javaScript都是编程语言,只是java跟javaScript没有什么太大关系,一个是脚本语言(前端语言),一个是面向对象 ... [详细]
  • 恶意软件分析的最佳编程语言及其应用
    本文介绍了学习恶意软件分析和逆向工程领域时最适合的编程语言,并重点讨论了Python的优点。Python是一种解释型、多用途的语言,具有可读性高、可快速开发、易于学习的特点。作者分享了在本地恶意软件分析中使用Python的经验,包括快速复制恶意软件组件以更好地理解其工作。此外,作者还提到了Python的跨平台优势,使得在不同操作系统上运行代码变得更加方便。 ... [详细]
  • 本文介绍了Java集合库的使用方法,包括如何方便地重复使用集合以及下溯造型的应用。通过使用集合库,可以方便地取用各种集合,并将其插入到自己的程序中。为了使集合能够重复使用,Java提供了一种通用类型,即Object类型。通过添加指向集合的对象句柄,可以实现对集合的重复使用。然而,由于集合只能容纳Object类型,当向集合中添加对象句柄时,会丢失其身份或标识信息。为了恢复其本来面貌,可以使用下溯造型。本文还介绍了Java 1.2集合库的特点和优势。 ... [详细]
  • windows平台使用NSP拦截具体进程的域名解析过程(xFsRedir的代理功能之域名代理)
    byfanxiushu2022-10-17转载或引用请注明原始作者。xFsRedir软件其中之一的功能就是实现了全方位的网络代理,从主机代理,到本地代理 ... [详细]
author-avatar
mobiledu2502930997
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有