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

相关文章
|
9天前
|
缓存 程序员 PHP
为什么说 Swoole 是 PHP 程序员技术水平的分水岭?
【9月更文挑战第8天】Swoole 被视为 PHP 程序员技术水平的分水岭,因为它要求程序员深入理解底层原理(如网络编程、异步和并发模型),具备性能优化能力(如高效服务器开发、数据库连接池管理),拥有架构设计能力(如微服务架构、项目复杂度管理),并具备持续学习和自我提升意识。熟练掌握 Swoole 的程序员在技术能力和综合素质方面更具优势。
|
5天前
|
缓存 NoSQL PHP
使用PHP-redis实现键空间通知监听key失效事件的技术与代码示例
通过上述方法,你可以有效地在PHP中使用Redis来监听键空间通知,特别是针对键失效事件。这可以帮助你更好地管理缓存策略,及时响应键的变化。
22 3
|
28天前
|
关系型数据库 MySQL 应用服务中间件
win7系统搭建PHP+Mysql+Apache环境+部署ecshop项目
这篇文章介绍了如何在Windows 7系统上搭建PHP、MySQL和Apache环境,并部署ECShop项目,包括安装配置步骤、解决常见问题以及使用XAMPP集成环境的替代方案。
37 1
win7系统搭建PHP+Mysql+Apache环境+部署ecshop项目
|
17天前
|
开发框架 前端开发 中间件
开源PHP项目
【9月更文挑战第2天】开源PHP项目
27 4
|
22天前
|
机器学习/深度学习 人工智能 自然语言处理
PHP编程中的面向对象基础利用AI技术提升文本分类效率
【8月更文挑战第28天】在PHP的编程世界中,面向对象编程(OOP)是一块基石,它不仅塑造了代码的结构,也影响了开发者的思考方式。本文将深入探讨PHP中面向对象的基础概念,通过浅显易懂的语言和生动的比喻,带领初学者步入这个充满魅力的世界。我们将一起探索类与对象的秘密,理解构造函数和析构函数的重要性,以及继承和多态性的魔法。准备好了吗?让我们开始这段激动人心的旅程!
|
11天前
|
缓存 网络协议 程序员
为什么说 Swoole 是 PHP 程序员技术水平的分水岭?
【9月更文挑战第7天】Swoole 因其异步非阻塞编程模式、高性能服务器开发能力、性能优化工具及拓展技术视野等特点,被视为 PHP 程序员技术水平的分水岭。它要求程序员掌握异步编程、协程、网络协议等知识,并具备性能优化和系统管理能力,从而全面提升技术水平。
|
11天前
|
消息中间件 NoSQL Go
PHP转Go系列 | ThinkPHP与Gin框架之Redis延时消息队列技术实践
【9月更文挑战第7天】在从 PHP 的 ThinkPHP 框架迁移到 Go 的 Gin 框架时,涉及 Redis 延时消息队列的技术实践主要包括:理解延时消息队列概念,其能在特定时间处理消息,适用于定时任务等场景;在 ThinkPHP 中使用 Redis 实现延时队列;在 Gin 中结合 Go 的 Redis 客户端库实现类似功能;Go 具有更高性能和简洁性,适合处理大量消息。迁移过程中需考虑业务需求及系统稳定性。
|
21天前
|
安全 中间件 网络安全
深入浅出PHP框架之Laravel的优雅云计算与网络安全:探索云服务、网络安全和信息安全的技术领域
【8月更文挑战第29天】在编程的世界里,PHP以其灵活性和易用性广受欢迎。本文将深入探讨PHP的一个流行框架——Laravel,揭示它如何以简洁、高雅的解决方案满足复杂的开发需求。我们将一起走进Laravel的世界,探索其背后的哲学,以及它如何让代码变得更加动人和富有韵律。
|
26天前
|
存储 关系型数据库 Linux
【Azure 应用服务】App Service For Linux 部署PHP Laravel 项目,如何修改首页路径为 wwwroot\public\index.php
【Azure 应用服务】App Service For Linux 部署PHP Laravel 项目,如何修改首页路径为 wwwroot\public\index.php
|
27天前
|
安全 网络安全 PHP
云计算与网络安全:技术融合下的新挑战PHP 在现代Web开发中的角色和挑战
【8月更文挑战第23天】随着云计算技术的飞速发展,企业和个人越来越依赖云服务来处理和存储数据。然而,这种便利性也带来了前所未有的网络安全风险。本文将探讨云计算环境中的网络安全挑战,分析信息安全的关键问题,并提出相应的防护措施。我们将深入讨论如何通过策略和技术的结合来增强云安全,确保数据的安全和隐私保护。