【编者按】PHP到底是不是最好的语言这个梗已经人尽皆知了,有些人对PHP浅尝辄止,有些人与PHP共同成长。而Vimeo属于后者。

Vimeo是美国流行的原创高清视频播客网站,vimeo禁止用户上传任何非原创的视频内容。本文作者是Vimeo研发专家Matt Brown,他在文中分享了为何Vimeo从初创公司发展至今,一直对PHP不离不弃的原因。世界上没有最好的工具,只有和工具一同成长的人。本文共2065字,全文阅完共需3分钟。

原文标题:It's not legacy code-It's PHP

原文链接:https://medium.com/vimeo-engineering-blog/its-not-legacy-code-it-s-php-1f0ee0462580

编译 | PUXI

头图 | CSDN 下载自东方 IC

出品 | CSDN(ID:CSDNnews)

2019年,Vimeo已经使用多种语言共同进行开发建设,PHP、Go、Ruby、Node JS、Java、C、C++和一些Rust。而早在Vimeo刚成立的2004年,我们还只用PHP。对于初创公司来说,PHP真的是一个非常理想的语言。

但是我知道,现在有很多初创公司都不再选择使用PHP了,有一些公司认为PHP是公司限制发展的瓶颈(Facebook),便逐渐减少了对PHP的应用。

开发者离开PHP

我们先说说用户离开PHP的原因吧。归根有两大主要原因:PHP性能表现欠佳,以及PHP代码库维护很复杂。

确实。

2014年的PHP(PHP5.6)性能很低,数组所占用的内存越来越多,缺少好用的Bug规模查找分析工具,PHP大型代码库的维护也越来越难。

而对于Vimeo来说,Vimeo的业务从2004年起已经迭代增长了很多倍,我们的PHP代码库也在持续增长,但是我们还能够应对逐渐复杂的PHP代码库,PHP所存在的问题还没有真正阻碍我们发展。可是当Facebook公开宣布放弃PHP之后,一些开发者认为PHP会变成“祖传代码”——FORTRAN,所以在开发者中也兴起了一波从PHP转向Go开发的风潮。但是我们从没有放弃过PHP。

我们从未放弃PHP

重写一个全部的PHP代码库需要耗费很多资源,也很容易出错,但是这会让PHP变得更好。也许“PHP变得更好了”这个描述来评价PHP的变化也并不够客观,但是在过去的六年中,我司PHP的执行时间减少了一半,社区快速增长,也有了静态分析工具去完善PHP代码库。

在Vimeo,是花费了相当一段时间才看到对PHP改造所带来的效果的。

首先我们从PHP4.5迁移到了PHP7版本,PHP 4.5这版本已经非常陈旧了。迁移到PHP7之后,我们的后端明显响应速度更快,PHP7自身也改进了语法,例如在函数中可以指定返回值类型,函数的形参类型声明可以是标量等等,这些新语法可以让开发者去写更简洁的代码。要知道PHP没有停止创新。12月初,PHP 8 版本也发布了,带来了众多新功能:JIT编译器、联合类型等等,开发者能够更高效地进行开发,目前PHP 8 的开发很活跃,这让我们非常期待接下来一年PHP的更新。

改造PHP

我们知道,PHP开发入门很容易,但是这种开箱即用的特征没有为开发者提供足够的保护,很容易为开发者埋下隐患,正是因为有太多的开发者踩过PHP的坑,才慢慢地弃用了PHP。

我曾经也踩过PHP的坑,但是我没有放弃,而是决定去搭建一个能够帮助我完成我目标的工具,填上我的坑。而我搭建的工具就是Paslm,一个用来自动查找Bug的静态分析工具。

Psalm的核心功能和TypeScript的检查器很像,同时也从Facebook开发的Hack中借鉴了一些经验。当你的代码产生类型错误或者逻辑不成立时Psalm会提醒你。Psalm也会自动修复大部门它发现到的问题。最近Psalm便帮了我们一个大忙:帮助我们发现了大量我们代码库中的安全隐患,得以让我们在攻击者发现他们之间进行解决。

过去几年,Psalm帮助我们及时发现Bug,帮助开发者更容易地去集成代码,这对我司编写PHP产生了很好的正面影响,我们不必担心对原有的代码造成破坏,让我们有自信去做更大规模的优化改变。

PHP新版本的发布消除了它的那种陈旧感,PHP应该积极尝试去改变它的源码。我建造Psalm解决了我自己的问题,同时也将其开源,帮助其他人解决了更多的问题。顺便说一下,如果阅读这篇文章的你有PHP项目,项目有历史遗留的陈旧问题,但是又害怕破坏原有结构而带来更大问题,那么我强烈建议你使用Bug追踪工具。无论是Psalm还是其他工具都可以尽早地帮助你发现问题,让你提高代码质量。

不去攻克,困难便永远在那里

在Vimeo刚创立的那年(2004),PHP还没有成熟的ORM,但幸好PHP为制作简单的ActiveRecord样式的ORM提供了大量的构建块,如MySQL支持、查询参数绑定以及getter和setter。所以我们构建了自己的ORM。

而ORM上次更新是十年以前了,期间它也有一些微小的升级,像修复小bug,更新类型和特性等等,但是基本的主体架构这么多年一直没有变过。

很多人尝试过使用不同的ORM,但这些尝试很多都不是针对新的业务需求而提出的,而是出于对PHP ActiveRecord模式的不满,可是要知道,没有一个工具或者语言能完全满足你的要求。

如果旧的代码能做到高效,容易测试,便于追踪问题等等特性,旧代码也是很好的,很幸运通过我们的努力我们现在的ORM可以满足以上所有需求。

最后想说

许多开发人员在十年前只写了一点PHP,便转向了其他更受欢迎的语言。他们常常急于告诉别人PHP是多么的糟糕,以及不再编写PHP是多么的令人宽慰。在这里我告诉你,Vimeo使用PHP成功的案例,便可以证明即使是在2020年,PHP对于初创公司的仍一个很好的工具。

无论如何,PHP的复兴至少改变了一位曾经的反对者。

一天,我的一位同事和长期批评PHP的人把我拉到一边,非常真诚地感谢我向他展示了“使用PHP并不一定很糟糕”。

最“好”的编程语言 PHP 真的无药可救了吗?相关推荐

  1. 腹部肿瘤内科专家朱利明:化疗也能“订制”,晚期结直肠癌不再“无药可救”

    肠癌是发生在结肠和直肠的癌症,近二三十年来发病率快速上升.就在近期,"日本女大胃王菅原初代患肠癌病逝"的消息登上热搜,一时引发网友关注热议. "人生有哲学三问:我是谁?我 ...

  2. 与时俱进的治疗策略不断提高RA无药缓解机会[EULAR2015_SAT0058]

    随时代变迁而进化的治疗策略不断提高RA无药缓解机会 SAT0058 DMARD-FREE SUSTAINED REMISSION IN RHEUMATOID ARTHRITIS: AN OUTCOME ...

  3. 接连霸榜,这门国产编程语言是真的强!

    大家好,我是 阳哥,今天给大家推荐一个重磅的语言! 看到标题,不知道大家想到的是什么语言?没错,就是七牛云出品的 Go+. 2020 年 7 月 5 日,Go+ 作为一门为数据科学而生的语言,正式对外 ...

  4. C语言是不是世界上最好的编程语言?真的永远不会过时吗?

    这个问题,居然用到了"最好""永远",这个真的是任何人都不敢保证的. 只能这样说,就目前的发展来看,C语言还是非常受欢迎的,不仅仅成为计算机专业中的一门公开课, ...

  5. 原来脑残一词是李时珍发明的,本草纲目中就有”脑残者无药医也“

  6. 抽奖算法-指定概率的随机

    抽奖模型 普通概率模型 普通概率模型是最常用的一种模型,但是在游戏运营过程中的确发现很多小白玩家不能正确理解--他们认为中奖率 10% 的设定等同于抽 10 次肯定会中一次.这显然是错误的,普通概率模 ...

  7. CodeBlocks17.12+汉化包下载及用法

    1. 关键词 CodeBlocks最新版17.12云盘下载链接 CodeBlocks安装教程 如何设置cbp文件默认用CodeBlocks打开 Codeblocks汉化包下载和汉化包使用教程 Code ...

  8. 在网上请不要惹一个程序员

    在博客园看到的.. 背景:我是一名吊丝程序员,在小公司做事,平时做点私活,最近开了个淘宝店,月交易几千块钱而已,以调试.破解和出售网站模板类为主. 起因:4.2号来了一名顾客,要求为其提供的WEB程序 ...

  9. python概率随机抽奖源码_抽奖算法-指定概率的随机

    抽奖模型 普通概率模型 普通概率模型是最常用的一种模型,但是在游戏运营过程中的确发现很多小白玩家不能正确理解--他们认为中奖率 10% 的设定等同于抽 10 次肯定会中一次.这显然是错误的,普通概率模 ...

最新文章

  1. arraylist从大到小排序_JAVA零基础入门课程笔记----数组排序
  2. 计算机里多媒体的名词解释,多媒体技术中的常见名词解释 众德伟业
  3. Maven环境配置及IntelliJ IDEA中的Maven部署(亲自测试)
  4. 【Protocol Buffer】Protocol Buffer入门教程(六):枚举和包
  5. 地线与接地螺丝_电气接地规范与接地的各项参数
  6. grove 套件_如何通过使用Andy Grove的High Leverage Activities加快发展?
  7. 第十章 Linux   samba 共享软件
  8. 获取当前位置信息-ios
  9. 抓包工具Fiddler基本使用
  10. laravel实现发送邮件(腾讯企业邮箱)
  11. golang 数组随机排序
  12. UBUNTU内核升级后,如何更新 kernel headers
  13. 别让我们的幸福感受在别人眼中
  14. xxl子任务_XXL-JOB(1) 分布式任务系统选型和XXL-JOB介绍
  15. 路由器的两个端口接在同一个交换机上_什么是路由器交换机?路由器交换机介绍!...
  16. 【杂记】全栈开发中碰到的一些问题及解决方法
  17. 时延、时间带宽积、RTT、利用率
  18. ACM常见组合博弈游戏
  19. 金蝶K3WISE13.1销售发票不能删除
  20. reflect存在的意义和使用api

热门文章

  1. Java的互斥同步机制
  2. bootstrapTable 取消 “正在加载中...”
  3. 百度OCR文字识别API使用心得===com.baidu.ocr.sdk.exception.SDKError[283604]
  4. jsonp/ajax 自己的一些总结
  5. jQuery EasyUI教程之datagrid应用-1
  6. 如何在centos7上安装redis
  7. 解决页面textarea初始焦点显示位置不正确的问题
  8. [Ubuntu] 使用 fcitx 输入汉字
  9. pythontuple_python:tuple 真是鸡肋吗
  10. @mapper注解的使用_SpringBoot-Mybatis通用mapper使用