阿里云栖开发者沙龙PHP技术专场-静态扫描为你的PHP项目上线保驾护航

简介: 摘要:在4月20日的阿里云栖开发者沙龙PHP技术专场上,阿里云资深研发工程师周梦康(楚松)为大家分享了如何借助静态扫描来为我们的PHP项目上线保驾护航,他从Why、How和What三个角度为大家分享了静态扫描的落地实践和最终成果。

摘要:在4月20日的阿里云栖开发者沙龙PHP技术专场上,阿里云资深研发工程师周梦康(楚松)为大家分享了如何借助静态扫描来为我们的PHP项目上线保驾护航,他从Why、How和What三个角度为大家分享了静态扫描的落地实践和最终成果。

本次直播视频精彩回顾,戳这里!
直播回顾:https://yq.aliyun.com/live/965
PPT分享:https://yq.aliyun.com/download/3531
以下内容根据演讲视频以及PPT整理而成。

演讲专家简介:

周梦康(花名:楚松),阿里云资深研发工程师,《深入PHP内核》作者之一,多个开源项⽬目 tipi、yar-java、doc-php的作者与参与者

本次的分享主要围绕以下三个方面:

  1. 为什么要代码静态扫描
  2. 怎么去做代码静态扫描
  3. 发布与集成测试的成果

为什么要代码静态扫描

什么是静态扫描
如下图所示,其实静态扫描的名称非常多,这里统一称之为静态扫描。静态扫描是指在不运行代码的方式下,通过词法分析、语法分析、抽象语法树分析等技术对程序代码进行扫描,验证代码是否满⾜规范性、安全性、可靠性、可维护性等指标的一种代码分析技术。

1
PHP项目为什么需要做静态扫描
这里主要有三点原因:
1)弱类型与无类型声明,PHP7引入了类型声明;
2)解释性语言实时编译;
3)丰富的包、递归依赖。
2
例子:弱类型(泛型返回值)错把数组当对象
3
例子:返回值⽆无类型声明 错把对象当数组
4
例子:类继承成员变量量访问级别覆盖
5
版本兼容性问题
6
还有一些版本兼容性问题也需要通过静态扫描来解决,对于一些“历史悠久”的公司而言,一定会有一些“老”代码,虽然这些项目都是使用PHP进行开发,但是有的可能使用了老的版本,而一些工程师在进行开发的时候可能将一些新版本语法的语法糖写到了老的版本,可能在本地运行没有任何问题,但是一旦到了线上就会出故障了。还有比如老项目使用的PHP版本中一些函数不存在或者有一些语法不支持等,这些都是兼容性的问题。

PHP的运行时编译优势与隐患
7
一些特别小的PHP项目修改完之后直接上传上去覆盖即可,其他语言的项目可能无法这样做,必须要整体打包,因此这既是PHP的一个优势,但也是一个隐患。

PHP可以说是一个“风一样的美男子”,代码写的快,但是类型约束差、风险高,数组使用比较多就可能因为模糊KV多而影响语义,并且整体代码缺失面向对象的思想;PHP编译快并且部署快,因此也导致上下文解析存在一些隐患。

8
PHP 7新特性参数类型、返回值类型声明
PHP也在不断地发展和改进,比如PHP 7就提供了参数类型、返回值类型声明等新特性。
9
PHP 7.4类成员变量类型声明
10
PHP解析小互动
如下图所示的三段代码中,为什么a.php看不到错误b.php却可以?大家可以仔细思考下这部分问题。
11
PHP包管理工具的发展
PHP项目的管理越来越复杂,到了2012年之后,Composer变得非常流行,成为了主流的包管理工具。
12
PHP项⽬发展背后的潜在风险
使用laravel来新建一个博客,其生成的PHP文件数是5927个,代码行数达到了47万行,很难保证其没有错误。因此必须要有自动的语法检测、类型推断等,仅依靠人工检查肯定是心有余而力不足的。
13

怎么去做代码静态扫描

工具选择-PHPStan
14
PHPStan是一种PHP代码静态扫描的工具,并且有VS Code的插件,但是似乎有点卡顿。

工具选择-PHPSA
15
PHPSA与PHPStan比较类似,Fork数和Follow都比较多。

工具选择-Phan
16
Phan的Follow数量最多,并且也有VS Code的插件。其原理在于解析AST,也就是在分析PHP在执行词法分析和语法分析之后生成的抽象语法树AST。

依托PHP-Parser自己造轮子
17
Phan的作者也写了一个PHP-Parser,其主要就是将PHP语法树以数组的方式生成出来。

18
使用Phan
19
首先,Phan是基于抽象语法树的,其需要依赖于php-ast扩展,安装完扩展之后就可以安装工具。

使用Phan简单扫描
如下图所示的就是使用Phan进行简单PHP项目扫描脚本。
20
21
使用Phan扫描项目
如今,大家的项目都是基于Composer进行自动加载或者包依赖的。前面的例子只是测试几个脚本,如果想要将其应用到生产中,前面的方式肯定不足够,因此Phan也支持项目级别的扫描,使用下面的命令就可以扫描和分析出一些错误并形成错误报告。
22
23
项目发布实践——AoneFlow分支管理
24
阿里巴巴的AoneFlow在这一点上或许比GitFlow使用起来更加灵活一些,也方便一些。AoneFlow发布的时候使用的是release包,最后上线也是release包,发布完成之后会合并到master主干分支上去,

项目发布实践
25
项目发布的流程可以主要分为两个方面,包含了预发和正式发布。预发部分包含了项目构建、预发准入、预发部署、集成测试以及预发验证五个部分,在预发准入部分严格上会有一些审批进行拦截,静态扫描就放在集成测试这部分中。在正式发布部分,也包含了项目构建、正式准入、正式部署、合并到master以及线上测试等五个部分。
26
集成测试主要包含了单元测试、接口测试、代码静态扫描、安全测试以及性能测试等。在将代码同步到预发服务器的同时,可以将代码同步到专门做静态扫描服务器的集群上去,这是因为如果公司项目较少,那么预发服务器可以作为静态扫描服务器,不然同步两次也会浪费时间,但是如果公司有很多类似项目都需要扫描,那么就无法在每个预发服务器上都将静态扫描的扩展都安装一遍,也无法让每个预发服务器都来汇报整个编译流程是否OK,应该是与预发部署服务器隔离开的,预发服务器只汇报是否发布成功。这样的好处就是静态代码扫描的扩展只安装在集群里面,所有人的项目都是可以共用的,而且与整个构建系统相关,通过整体流程保证项目稳定性。

PHP是一门艺术
27
其实,PHP在我们的项目里面更像是一门艺术,在早期,PHP较为简单易用,但是与此同时,因为其不稳定性以及一些潜在隐患问题,也被很多人所诟病。可能在很多人眼里,PHP还是十几年前的一个玩具,但是玩具也可以不断升级,正如乐高也可以做一个真正能够跑起来的跑车。因此,如果能够让PHP发挥更大的作用,更是一门艺术。

技术交流

欢迎同学入群与专家实时技术交流

点击链接入群 https://c.tb.cn/F3.ZR58nS

或扫码入群

php

相关文章
|
16天前
|
缓存 前端开发 API
PHP 适合做什么类型的项目
【8月更文挑战第4天】PHP 适合做什么类型的项目
32 4
|
1月前
|
设计模式 安全 关系型数据库
PHP开发涉及一系列步骤和技术
【7月更文挑战第2天】PHP开发涉及一系列步骤和技术
128 57
|
18天前
|
SQL 安全 PHP
探寻PHP的现代演进之路:从Web开发到框架创新——揭秘PHP语言如何引领技术潮流
【8月更文挑战第2天】探索PHP的现代演进:从Web开发到框架创新
26 1
|
20天前
|
人工智能 API 语音技术
PHP对接百度语音识别技术
PHP对接百度语音识别技术
66 1
|
11天前
|
关系型数据库 Linux 网络安全
"Linux系统实战:从零开始部署Apache+PHP Web项目,轻松搭建您的在线应用"
【8月更文挑战第9天】Linux作为服务器操作系统,凭借其稳定性和安全性成为部署Web项目的优选平台。本文以Apache Web服务器和PHP项目为例,介绍部署流程。首先,通过包管理器安装Apache与PHP;接着创建项目目录,并上传项目文件至该目录;根据需要配置Apache虚拟主机;最后重启Apache服务并测试项目。确保防火墙允许HTTP流量,正确配置数据库连接,并定期更新系统以维持安全。随着项目复杂度提升,进一步学习高级配置将变得必要。
26 0
|
1月前
|
前端开发 API PHP
PHP中的异步编程:提升性能和响应速度的关键技术
在Web开发中,性能和响应速度是至关重要的。PHP作为一种流行的服务器端脚本语言,传统上以同步方式处理请求。然而,随着互联网应用复杂性的增加,异步编程成为了优化性能的关键技术之一。本文将探讨PHP中异步编程的实现方式及其在提升性能和响应速度方面的重要作用。
44 0
|
1月前
|
PHP 开发者
如何用Composer管理PHP项目的第三方扩展包
【7月更文挑战第2天】**Composer 是PHP开发的关键工具,用于管理项目依赖。安装需PHP 5.6.4+,通过官网脚本安装。在项目根目录创建 `composer.json` 文件定义依赖,使用 `composer require` 命令安装扩展包,如Guzzle。`composer.lock` 保证版本一致。`require_once 'vendor/autoload.php';` 实现自动加载。更新依赖用 `composer update`,管理依赖提升效率和项目维护性。深入学习可发掘更多高级功能。**
82 0
|
2月前
|
算法 PHP 数据安全/隐私保护
PHP中的数据加密技术及应用
在Web开发中,数据安全始终是一个至关重要的问题。本文将介绍PHP中常用的数据加密技术,包括对称加密算法、非对称加密算法和哈希算法的原理和应用。通过深入了解这些加密技术,开发人员可以更好地保护用户数据和提高系统的安全性。
22 0
|
3月前
|
Cloud Native 持续交付 PHP
构建未来:云原生技术在企业数字化转型中的关键作用深入理解PHP中的命名空间
【5月更文挑战第31天】 随着企业加速其数字化转型的步伐,云计算已经成为支撑现代业务的一个不可或缺的基础设施。特别是云原生技术,以其独特的灵活性、可扩展性和敏捷性,正在改变我们构建和管理应用程序的方式。本文将深入探讨云原生技术的核心概念,包括容器化、微服务架构、持续集成与持续部署(CI/CD)、以及无服务器计算等,并讨论这些技术如何帮助企业实现更高效、更可靠的软件交付过程,从而推动业务增长和创新。
|
1月前
|
数据库
基于PHP+MYSQL开发制作的趣味测试网站源码
基于PHP+MYSQL开发制作的趣味测试网站源码。可在后台提前设置好缘分, 自己手动在数据库里修改数据,数据库里有就会优先查询数据库的信息, 没设置的话第一次查询缘分都是非常好的 95-99,第二次查就比较差 , 所以如果要你女朋友查询你的名字觉得很好 那就得是她第一反应是查和你的缘分, 如果查的是别人,那不好意思,第二个可能是你。
41 3