阿里云栖开发者沙龙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

相关文章
|
3月前
|
域名解析 关系型数据库 MySQL
基于PHPEnv的本地环境搭建—PHP第一个项目:HelloWorld(从安装到运行)
该文章指导如何使用PHPEnv搭建本地PHP开发环境,并通过一个简单的"Hello World"程序演示从安装到运行的全过程。
基于PHPEnv的本地环境搭建—PHP第一个项目:HelloWorld(从安装到运行)
|
3月前
|
设计模式 数据库连接 PHP
PHP中的设计模式:如何提高代码的可维护性与扩展性在软件开发领域,PHP 是一种广泛使用的服务器端脚本语言。随着项目规模的扩大和复杂性的增加,保持代码的可维护性和可扩展性变得越来越重要。本文将探讨 PHP 中的设计模式,并通过实例展示如何应用这些模式来提高代码质量。
设计模式是经过验证的解决软件设计问题的方法。它们不是具体的代码,而是一种编码和设计经验的总结。在PHP开发中,合理地使用设计模式可以显著提高代码的可维护性、复用性和扩展性。本文将介绍几种常见的设计模式,包括单例模式、工厂模式和观察者模式,并通过具体的例子展示如何在PHP项目中应用这些模式。
|
3月前
|
设计模式 数据管理 测试技术
PHP中的设计模式:单一职责原则在实战项目中的应用
在软件开发中,设计模式是解决问题的最佳实践。本文通过分析单一职责原则(SRP),探讨了如何运用这一原则来提升PHP项目的可维护性和扩展性。我们将从实际案例出发,展示单一职责原则在业务逻辑分离、代码解耦和提高测试效率方面的应用。无论是新手还是经验丰富的开发者,都能从中获益,进而编写出更健壮、更灵活的PHP代码。
45 5
|
4月前
|
关系型数据库 MySQL 应用服务中间件
win7系统搭建PHP+Mysql+Apache环境+部署ecshop项目
这篇文章介绍了如何在Windows 7系统上搭建PHP、MySQL和Apache环境,并部署ECShop项目,包括安装配置步骤、解决常见问题以及使用XAMPP集成环境的替代方案。
61 1
win7系统搭建PHP+Mysql+Apache环境+部署ecshop项目
|
3月前
|
开发框架 前端开发 中间件
开源PHP项目
【9月更文挑战第2天】开源PHP项目
64 4
|
4月前
|
存储 关系型数据库 Linux
【Azure 应用服务】App Service For Linux 部署PHP Laravel 项目,如何修改首页路径为 wwwroot\public\index.php
【Azure 应用服务】App Service For Linux 部署PHP Laravel 项目,如何修改首页路径为 wwwroot\public\index.php
|
4月前
|
关系型数据库 Linux 网络安全
"Linux系统实战:从零开始部署Apache+PHP Web项目,轻松搭建您的在线应用"
【8月更文挑战第9天】Linux作为服务器操作系统,凭借其稳定性和安全性成为部署Web项目的优选平台。本文以Apache Web服务器和PHP项目为例,介绍部署流程。首先,通过包管理器安装Apache与PHP;接着创建项目目录,并上传项目文件至该目录;根据需要配置Apache虚拟主机;最后重启Apache服务并测试项目。确保防火墙允许HTTP流量,正确配置数据库连接,并定期更新系统以维持安全。随着项目复杂度提升,进一步学习高级配置将变得必要。
396 0
|
1月前
|
前端开发 关系型数据库 MySQL
PHP与MySQL动态网站开发实战指南####
【10月更文挑战第21天】 本文将深入浅出地探讨如何使用PHP与MySQL构建一个动态网站,从环境搭建到项目部署,全程实战演示。无论你是编程新手还是希望巩固Web开发技能的老手,都能在这篇文章中找到实用的技巧和启发。我们将一起探索如何通过PHP处理用户请求,利用MySQL存储数据,并最终呈现动态内容给用户,打造属于自己的在线平台。 ####
44 0
|
25天前
|
存储 关系型数据库 MySQL
PHP与MySQL动态网站开发:从基础到实践####
本文将深入探讨PHP与MySQL的结合使用,展示如何构建一个动态网站。通过一系列实例和代码片段,我们将逐步了解数据库连接、数据操作、用户输入处理及安全防护等关键技术点。无论您是初学者还是有经验的开发者,都能从中获益匪浅。 ####
|
28天前
|
安全 关系型数据库 MySQL
PHP与MySQL动态网站开发实战指南####
——深入探索LAMP栈下的高效数据交互与处理技巧 ####