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

相关文章
|
2月前
|
设计模式 数据库连接 PHP
PHP中的设计模式:提升代码的可维护性与扩展性在软件开发过程中,设计模式是开发者们经常用到的工具之一。它们提供了经过验证的解决方案,可以帮助我们解决常见的软件设计问题。本文将介绍PHP中常用的设计模式,以及如何利用这些模式来提高代码的可维护性和扩展性。我们将从基础的设计模式入手,逐步深入到更复杂的应用场景。通过实际案例分析,读者可以更好地理解如何在PHP开发中应用这些设计模式,从而写出更加高效、灵活和易于维护的代码。
本文探讨了PHP中常用的设计模式及其在实际项目中的应用。内容涵盖设计模式的基本概念、分类和具体使用场景,重点介绍了单例模式、工厂模式和观察者模式等常见模式。通过具体的代码示例,展示了如何在PHP项目中有效利用设计模式来提升代码的可维护性和扩展性。文章还讨论了设计模式的选择原则和注意事项,帮助开发者在不同情境下做出最佳决策。
|
2月前
|
设计模式 算法 数据库连接
PHP中的设计模式:提高代码的可维护性与扩展性本文旨在探讨PHP中常见的设计模式及其应用,帮助开发者编写出更加灵活、可维护和易于扩展的代码。通过深入浅出的解释和实例演示,我们将了解如何使用设计模式解决实际开发中的问题,并提升代码质量。
在软件开发过程中,设计模式是一套经过验证的解决方案模板,用于处理常见的软件设计问题。PHP作为流行的服务器端脚本语言,也有其特定的设计模式应用。本文将重点介绍几种PHP中常用的设计模式,包括单例模式、工厂模式和策略模式,并通过实际代码示例展示它们的具体用法。同时,我们还将讨论如何在实际项目中合理选择和应用这些设计模式,以提升代码的可维护性和扩展性。
56 4
|
2月前
|
设计模式 算法 PHP
PHP中的设计模式:策略模式的深入探索与实践在软件开发的广袤天地中,PHP以其独特的魅力和强大的功能,成为无数开发者手中的得力工具。而在这条充满挑战与机遇的征途上,设计模式犹如一盏明灯,指引着我们穿越代码的迷雾,编写出更加高效、灵活且易于维护的程序。今天,就让我们聚焦于设计模式中的璀璨明珠——策略模式,深入探讨其在PHP中的实现方法及其实际应用价值。
策略模式,这一设计模式的核心在于它为软件设计带来了一种全新的视角和方法。它允许我们在运行时根据不同情况选择最适合的解决方案,从而极大地提高了程序的灵活性和可扩展性。在PHP这门广泛应用的编程语言中,策略模式同样大放异彩,为开发者们提供了丰富的创作空间。本文将从策略模式的基本概念入手,逐步深入到PHP中的实现细节,并通过一个具体的实例来展示其在实际项目中的应用效果。我们还将探讨策略模式的优势以及在实际应用中可能遇到的挑战和解决方案,为PHP开发者提供一份宝贵的参考。
|
2月前
|
设计模式 SQL 安全
PHP中的设计模式:单例模式的深入探索与实践在PHP的编程实践中,设计模式是解决常见软件设计问题的最佳实践。单例模式作为设计模式中的一种,确保一个类只有一个实例,并提供全局访问点,广泛应用于配置管理、日志记录和测试框架等场景。本文将深入探讨单例模式的原理、实现方式及其在PHP中的应用,帮助开发者更好地理解和运用这一设计模式。
在PHP开发中,单例模式通过确保类仅有一个实例并提供一个全局访问点,有效管理和访问共享资源。本文详细介绍了单例模式的概念、PHP实现方式及应用场景,并通过具体代码示例展示如何在PHP中实现单例模式以及如何在实际项目中正确使用它来优化代码结构和性能。
43 2
|
2月前
|
缓存 程序员 PHP
为什么说 Swoole 是 PHP 程序员技术水平的分水岭?
【9月更文挑战第8天】Swoole 被视为 PHP 程序员技术水平的分水岭,因为它要求程序员深入理解底层原理(如网络编程、异步和并发模型),具备性能优化能力(如高效服务器开发、数据库连接池管理),拥有架构设计能力(如微服务架构、项目复杂度管理),并具备持续学习和自我提升意识。熟练掌握 Swoole 的程序员在技术能力和综合素质方面更具优势。
|
2月前
|
缓存 NoSQL PHP
使用PHP-redis实现键空间通知监听key失效事件的技术与代码示例
通过上述方法,你可以有效地在PHP中使用Redis来监听键空间通知,特别是针对键失效事件。这可以帮助你更好地管理缓存策略,及时响应键的变化。
91 3
|
2月前
|
设计模式 存储 算法
PHP中的设计模式:策略模式的深入解析与应用在软件开发的浩瀚海洋中,PHP以其独特的魅力和强大的功能吸引了无数开发者。作为一门历史悠久且广泛应用的编程语言,PHP不仅拥有丰富的内置函数和扩展库,还支持面向对象编程(OOP),为开发者提供了灵活而强大的工具集。在PHP的众多特性中,设计模式的应用尤为引人注目,它们如同精雕细琢的宝石,镶嵌在代码的肌理之中,让程序更加优雅、高效且易于维护。今天,我们就来深入探讨PHP中使用频率颇高的一种设计模式——策略模式。
本文旨在深入探讨PHP中的策略模式,从定义到实现,再到应用场景,全面剖析其在PHP编程中的应用价值。策略模式作为一种行为型设计模式,允许在运行时根据不同情况选择不同的算法或行为,极大地提高了代码的灵活性和可维护性。通过实例分析,本文将展示如何在PHP项目中有效利用策略模式来解决实际问题,并提升代码质量。
|
2月前
|
缓存 网络协议 程序员
为什么说 Swoole 是 PHP 程序员技术水平的分水岭?
【9月更文挑战第7天】Swoole 因其异步非阻塞编程模式、高性能服务器开发能力、性能优化工具及拓展技术视野等特点,被视为 PHP 程序员技术水平的分水岭。它要求程序员掌握异步编程、协程、网络协议等知识,并具备性能优化和系统管理能力,从而全面提升技术水平。
|
2月前
|
消息中间件 NoSQL Go
PHP转Go系列 | ThinkPHP与Gin框架之Redis延时消息队列技术实践
【9月更文挑战第7天】在从 PHP 的 ThinkPHP 框架迁移到 Go 的 Gin 框架时,涉及 Redis 延时消息队列的技术实践主要包括:理解延时消息队列概念,其能在特定时间处理消息,适用于定时任务等场景;在 ThinkPHP 中使用 Redis 实现延时队列;在 Gin 中结合 Go 的 Redis 客户端库实现类似功能;Go 具有更高性能和简洁性,适合处理大量消息。迁移过程中需考虑业务需求及系统稳定性。
|
3月前
|
安全 中间件 网络安全
深入浅出PHP框架之Laravel的优雅云计算与网络安全:探索云服务、网络安全和信息安全的技术领域
【8月更文挑战第29天】在编程的世界里,PHP以其灵活性和易用性广受欢迎。本文将深入探讨PHP的一个流行框架——Laravel,揭示它如何以简洁、高雅的解决方案满足复杂的开发需求。我们将一起走进Laravel的世界,探索其背后的哲学,以及它如何让代码变得更加动人和富有韵律。