首页
关于
Search
1
给你10个市场数据调研报告的免费下载网站!以后竞品数据就从这里找!
185 阅读
2
php接口优化 使用curl_multi_init批量请求
144 阅读
3
《从菜鸟到大师之路 ElasticSearch 篇》
107 阅读
4
2024年备考系统架构设计师
104 阅读
5
PHP 文件I/O
92 阅读
php
thinkphp
laravel
工具
开源
mysql
数据结构
总结
思维逻辑
令人感动的创富故事
读书笔记
前端
vue
js
css
书籍
开源之旅
架构
消息队列
docker
教程
代码片段
redis
服务器
nginx
linux
科普
java
c
ElasticSearch
测试
php进阶
php基础
登录
Search
标签搜索
php函数
php语法
性能优化
安全
错误和异常处理
问题
vue
Composer
Session
缓存
框架
Swoole
api
并发
异步
正则表达式
php-fpm
mysql 索引
开发规范
协程
dafenqi
累计撰写
786
篇文章
累计收到
33
条评论
首页
栏目
php
thinkphp
laravel
工具
开源
mysql
数据结构
总结
思维逻辑
令人感动的创富故事
读书笔记
前端
vue
js
css
书籍
开源之旅
架构
消息队列
docker
教程
代码片段
副业
redis
服务器
nginx
linux
科普
java
c
ElasticSearch
测试
php进阶
php基础
页面
关于
搜索到
560
篇与
的结果
2023-08-11
PHP框架最新性能压力测试比较
PHP框架最新性能压力测试比较有人说PHP性能低?go语言性能高?到底谁高谁低数据说话!我们就来实际对比一下各PHP框架及一款go语言框架的性能是怎样的。硬件: CPU:Intel(R) Xeon(R) CPU E5-2689 0 @ 2.60GHz 16核心。内存:16GB。操作系统:Ubuntu 18.04PHP版本:7.4压力测试命令: ab -n 100000 -c 1000 -k $urlPHP框架最新输出hello world压力测试结果:框架 版本 方式 web服务器 RPS 最高日/PVlaravel 8.x web nginx 1000 8640wsymfony 4.4 web nginx 2300 1.98亿symfony 4.4 api nginx 4800 4.14亿CI 4.0 web nginx 4800 4.14亿thinkphp 6.0 web nginx 2400 2.0亿lumen 7.2 api nginx 5500 4.75亿ubiquity 2.3 web nginx 6400 5.52亿phalcon 3.4.4 nginx webman 1.0 web php-cli 30000 25.9亿mixphp 2.2 web php-cli 44000 38亿go-zero 1.1.1 api go语言 25000 21.6亿*mixphp为基于swoole 4.5的框架,开启多核与端口复用(并不是核心越多性能越高,以上开了4核)PHP框架最新模板渲染输出hello world压力测试结果:框架 版本 方式 web服务器 RPS 最高日/PVlaravel 8.x web nginx 1000 8640wsymfony 4.4 web nginx 2200 1.9亿CI 4.0 web nginx 4700 4亿thinkphp 6.0 web nginx 2300 1.98亿lumen 7.2 api nginx 4600 3.9亿ubiquity 2.3 web nginx 6400 5.52亿phalcon 3.4.4 nginx webman 1.0 web php-cli 31000 26.7亿mixphp 2.2 web php-cli 25000 21.6亿PHP框架最新读取mysql 5.7数据库压力测试结果:框架 版本 方式 web服务器 RPS 最高日/PV 说明laravel 8.x web nginx 700 6048w DB::table()->get()symfony 4.4 web nginx 1300 1.1亿 symfony 5.2 api nginx 1900 1.64亿 CI 4.0 web nginx 2900 2.5亿 thinkphp 6.0 web nginx 1500 1.29亿 lumen 7.2 api nginx 2500 2.16亿 ubiquity 2.3 web nginx 5600 4.8亿 phalcon 3.4.4 nginx webman 1.0 web php-cli 31000 26.7亿 mixphp 2.2 web php-cli 25000 21.6亿 *从mysql数据库的用户表,读取约10个用户名后,循环输出(不经过模板渲染)。*ubiquity:如果用了php7.4 preloading 有性能高达50-60%的性能提升.*laravel 8.x 优化后测试达到1200RPS。附图:说明:0.以上各框架都为下载框架后,按各框架默认安装方式安装好,同时关闭debug模式,无其它性能优化情况下进行测试,同时关闭nginx的 access log。1.为了测试准确,laravel 的SESSION_DRIVER不要设置为file,这里设置为array,否则会由于大量磁盘IO会造成结果比较低。2.Mysql的连接数要设置足够大,不然会出错完不成压力测试。3.如果由于高并发出现php-fpm错误:connect() to unix:/var/run/php-fpm.sock failed (11: Resource temporarily unavailable),请修改参数:1)内核修改sudo vim /etc/sysctl.confnet.ipv4.tcp_max_syn_backlog = 4096net.core.netdev_max_backlog = 4096sudo sysctl -p生效2)php-fpm配置修改修改 /etc/php/7.4/fpm/pool.d/www.conflisten.backlog = 4096sudo service php-fpm7.4 restart4.日最高PV,为RPSx86400(一天的秒数),为可能达到的日最高页面浏览量.当然由于网民一般在夜里的浏览量比较低,实际的PV,是小于这个数的,根据百度统计的用户上网时间分布,得出的实际PV应该是日最高PVx0.72,当然百度统计是全网网站的平均值,根据网站类型不同,有些网站的实际日PV可能是日最高PV/2或日最高PV/3。5.此测试结果保证严谨,此压力测试前前后后大约一年内时间经历了好几轮测试,此为2021最新版本结果。每个框架的结果误差大约在100以内。2021.2.18更新:因为ap工具只支持http/1.0,不支持http/1.1,所以 如果响应头中有Transfer-Encoding: chunked 的,则ab不会启用keep-alive 连接,所以会造成测试数据比较低。如上图中的,没有keep-alilve数据的,可能不准确。而用Content-Length头,则可以以keep-alive连接。可以换为wrk测试工具进行测试。待以后数据更新。结论:go的框架没有比过php框架。ubiquity:(https://ubiquity.kobject.net/) ,做为一个纯PHP框架,目前是传统PHP框架中性能最高的。webman(https://www.workerman.net/doc/webman),mixphp(swoole)框架为cli模式,因为是长驻内存,所以性能最高,并在hello world测试中超过了go语言的go-zero框架。如果你用的是laravel技术栈,那么在做接口时,强烈建议用laravel的微框架lumen,除具有非常高的性能外,还具有laravel的大部分功能,并且可以极容易升级到laravel框架。ps:https://github.com/lizhichao/one (此框架性能也很高。)
2023年08月11日
30 阅读
0 评论
0 点赞
2023-08-11
PHP 7.4中的箭头函数
PHP 7.4中的箭头函数短闭包(也称为箭头函数)是用PHP编写短函数的一种方式。当将闭包传递给类似array_map或array_filter的函数时,此符号很有用。这是他们的样子:// A collection of Post objects$posts = [/ … /];$ids = array_map(fn($post) => $post->id, $posts);以前,您必须编写以下代码:$ids = array_map(function ($post) {return $post->id;}, $posts);让我们总结一下如何使用短闭包。自PHP 7.4起可用他们以fn关键字开头它们只能有一个表达式,即return语句不允许return关键字参数和返回类型可以类型提示上面示例的更严格类型的编写方式可能是:$ids = array_map(fn(Post $post): int => $post->id, $posts);还有两件事要提到:还可以使用展开运算符允许引用,这两个参数都作为返回值如果要通过引用返回值,则应使用以下语法:fn&($x) => $x简而言之,除了仅允许一个表达式之外,短闭包还具有与普通闭包相同的功能。没有多行您没看错:短闭包只能有一个表达式。这意味着您不能包含多行。理由如下:短闭包的目标是减少冗长。 fn当然比function所有情况都短。RFC的创建者Nikita Popov辩称,如果您要处理多行功能,则使用短闭包将带来的好处更少。毕竟,按照定义,多行闭包已经更加冗长;因此能够跳过两个关键字(function和return)不会有太大的区别。您是否同意这种观点取决于您。虽然我可以在项目中想到许多单行闭包,但也有很多多行闭包,在这些情况下,我个人会错过简短的语法。不过还是有希望的:将来有可能添加多行短闭包,但这只是一个RFC。来自外部范围的值短闭包和普通闭包之间的另一个显着区别是,短闭包不需要use关键字能够从外部范围访问数据。$modifier = 5;array_map(fn($x) => $x * $modifier, $numbers);请务必注意,不允许从外部作用域修改变量。值由值绑定,而不是由引用约束。这意味着您可以在短闭包内更改$modifier,尽管它不会对外部作用域中的$modifier变量产生影响当然有一个例外是$this关键字,它的作用与普通的闭包完全相同:array_map(fn($x) => $x * $this->modifier, $numbers);未来的可能性我已经提到了多行短关闭,这仍然是未来的可能性。浮动的另一个想法是允许在类中使用短闭包语法,例如,用于getter和setterclass Post {private $title; fn getTitle() => $this->title;}总而言之,短闭包是一个受欢迎的功能,尽管仍有改进的空间。最大的一个可能是多行短闭包。
2023年08月11日
20 阅读
0 评论
0 点赞
2023-08-11
100 个最常用的 PHP 函数
100 个最常用的 PHP 函数下面的列表是最常用的前 100 个 PHP 函数:它们是最常用的 PHP 中自带的函数。这些函数被命名使用,并从 1 到 100 进行排序。 其他的 4500 个函数现在还没在排名中。 下面频率列表表示在 PHP 代码中使用此函数的频率:参考资料来自于 1900 个 PHP 开源项目。 他们使用了 Exakat static analysis engine 静态分析引擎的 1.2.5 版本进行了审核。平均值是在一个项目中调用此函数的次数。有些函数是被封装使用的,而另一些则是主要函数。比如说,5 个项目里面有 4 个用到了 count 函数,函数被调用大概 150 次。说明它很流行且被大量使用。单击函数名跳转到 PHP 文档。在 Top 100 文章的底部有一些总结见解。排行 函数 频率 平均值1 count 81.41 % 147.672 is_array 77.32 % 117.863 substr 74.62 % 142.924 in_array 74.16 % 79.555 explode 73.19 % 71.516 str_replace 72.32 % 101.057 implode 72.27 % 66.598 strlen 70.07 % 98.329 array_merge 69.46 % 64.0110 strpos 67.98 % 78.1811 preg_match 67.31 % 76.6012 sprintf 67.16 % 119.4613 trim 66.75 % 81.2814 strtolower 65.99 % 59.6215 file_exists 65.12 % 45.1316 is_string 61.39 % 45.1017 preg_replace 60.27 % 54.2818 file_get_contents 59.96 % 20.7119 array_key_exists 59.70 % 57.5020 array_keys 59.35 % 39.5921 dirname 56.44 % 54.8422 function_exists 53.58 % 42.6223 array_map 53.22 % 19.4524 get_class 53.12 % 33.0725 class_exists 52.50 % 23.1326 is_object 51.94 % 35.3527 time 51.79 % 41.4228 json_encode 51.48 % 24.8129 date 50.72 % 52.1830 is_null 49.69 % 60.5231 is_numeric 49.49 % 40.6932 array_shift 49.49 % 23.2833 defined 48.72 % 86.8234 is_dir 48.57 % 22.8635 json_decode 48.42 % 17.3936 header 48.16 % 59.7137 strtoupper 47.80 % 30.9538 array_values 47.24 % 17.2739 md5 46.88 % 23.7440 method_exists 46.73 % 19.0541 file_put_contents 46.68 % 12.4942 rtrim 45.91 % 18.0843 array_pop 45.51 % 20.6044 unlink 44.59 % 23.5545 basename 44.59 % 27.2346 realpath 44.08 % 15.9047 call_user_func 43.97 % 16.4148 call_user_func_array 43.92 % 18.4049 fopen 43.77 % 25.6150 microtime 43.46 % 14.4151 fclose 42.85 % 28.3652 is_int 42.75 % 15.7853 is_file 42.08 % 20.5254 array_slice 41.83 % 13.2055 preg_match_all 40.55 % 14.6656 ucfirst 40.25 % 17.0257 intval 40.19 % 88.1358 str_repeat 40.14 % 19.5159 serialize 40.14 % 22.0560 array_filter 39.99 % 13.8761 mkdir 39.79 % 11.1762 is_callable 39.43 % 11.9463 ltrim 39.17 % 10.9064 ob_start 39.12 % 13.2665 round 39.07 % 28.5666 fwrite 38.97 % 23.3967 array_unique 38.87 % 15.9668 array_search 38.82 % 14.1969 reset 38.71 % 20.7970 array_unshift 38.10 % 10.3271 parse_url 37.90 % 9.6172 func_get_args 37.79 % 28.3373 end 37.49 % 12.7074 base64_encode 37.39 % 14.1575 unserialize 37.18 % 18.3576 max 36.98 % 22.8877 preg_split 36.98 % 13.2778 gettype 36.93 % 16.1679 strrpos 36.67 % 11.9580 version_compare 36.67 % 14.8781 array_push 36.67 % 26.1882 floor 36.11 % 18.7883 strtotime 36.01 % 27.9484 htmlspecialchars 35.96 % 51.0885 ini_get 35.85 % 19.2586 ini_set 35.60 % 14.4987 chr 35.34 % 186.9788 extension_loaded 35.29 % 14.1789 is_bool 35.24 % 11.4490 ksort 34.98 % 10.8291 array_reverse 34.93 % 8.2792 ord 34.73 % 53.1793 uniqid 34.68 % 9.8394 strtr 34.47 % 12.9095 array_diff 34.32 % 11.1396 error_reporting 34.17 % 8.9997 ceil 33.35 % 11.9998 urlencode 33.30 % 29.6399 min 32.69 % 18.31100 print_r 32.64 % 14.12前 100 分析最常用的 PHP 函数是字符串函数,然后是数组函数,接着是文件函数。 (运算函数不在此列主要是因为他们通常基于运算符)每个函数的链接都指向其对应的文档,事实上许多函数经过发展以及获得了许多新特性,例如:count() 的第二个参数,dirname() 的第二个参数以及 preg_match() 和 str_replace() 接受数组作为参数等。有很多彩蛋。以上 100 个函数没有近期要废弃的计划。在非内置库中,mbstring 排名第一、curl 第二,然后是 gd、filter 和 iconv。md5 是最常用的加密函数,其次是 Sha1 (#147)。print_r 出现在 1/3 的项目代码里面的某处,任何地方 ...由于 dirname(dirname(dirname())) 的调用,dirname 的使用频率非常高。array、echo、print、empty、isset 这些没有纳入此排名,它们的使用度肯定是非常高的。如下几个函数应该用运算符替代 : array_push, is_object, func_get_arg, chr, call_user_func。相当多的调用是为了知道值的类型。数据库函数没有在这里排名:他们经常使用类,但功能仍然很频繁。可能是另一个前 100 名?相比写入文件 PHP 更多的应用于读取文件。它还解码 base64。使用键排序比使用值或使用键更频繁。通常使用 file_get_contents 读取文件,使用 fwrite 写入文件。后记如果你正在学习 PHP,最好回顾一下这里排名的 100 个功能。它们是你加入一个编码团队后最常找到的功能。它们不是唯一的,但遇到它们时你会不那么惊讶。PHP 函数
2023年08月11日
13 阅读
0 评论
0 点赞
2023-08-11
PHP 中使用 TUS 协议来实现大文件的断点续传
PHP 中使用 TUS 协议来实现大文件的断点续传你是否曾经为大文件上传而苦恼?如果文件上传的过程中,因为某种原因中断了,是否可以从中断的位置继续上传,而不用重新上传整个文件?如果你有这样的困惑,那么请继续阅读下面的内容。在现代网站应用中,上传文件是非常常见的。在任何语言中,通过使用一些工具,都可以实现文件上传的功能。但是,如果处理大文件上传的需求,还是有点麻烦的。假如你此时正在上传一个很大的文件,大约一个小时过去了,进度是 90%。突然断网了或者浏览器崩溃了,上传的程序退出,你要再全部重新来过。真的很不爽,对不对?还有更让人郁闷的是,如果你的网速很慢,那么,无论你重来多少次,你都不可能上传成功。在 PHP 中,我们可以尝试利用 tus 协议的断点续传功能来解决这个问题。什么是 tus?Tus 是一个基于 HTTP 的 文件断点续传开放协议。 断点续传的意思是不管是用户自行中断,还是由于网络等原因的意外中断,都可以从中断的地方继续上传,而不用重新开始。Tus 协议是在 2017 年5月被 Vimeo 采用的。为什么用 tus?引用 Vimeo 的博客:我们之所以决定用 tus,是因为它能以简洁开放的形式,将文件上传的过程标准化。这种标准化有利于 API 的开发者更加专注于应用本身的逻辑,而非文件上传的过程。使用这种方式上传的另一个好处是,你可以在笔记本上开始上传文件,然后又转到手机或者其他设备继续上传同一个文件,这可以极大地提升用户体验。图片: Tus 大致的工作流程开始第一步,加载依赖。$ composer require ankitpokhrel/tus-phptus-php 是用于 tus 断点续传协议 v1.0.0 的一个的纯 PHP 框架,完美实现了 服务端与客户端的交互 。更新: 现在 Vimeo 官方 PHP 库 的 v3 用的是 TusPHP。创建一个处理请求的服务端你可以像下面这样创建一个服务端.// server.php$server = new \TusPhp\Tus\Server('redis');$response = $server->serve();$response->send();exit(0); // 退出当前 PHP 进程你需要配置你的服务器以便能对特定的终端进行响应。如果使用 Nginx 的话你可以像下面这样配置:nginx.conflocation /files {try_files $uri $uri/ /path/to/server.php?$query_string;}假设我们服务端的 URL 是 http://server.tus.local. 因此,基于我们上面的 Nginx 配置,我们可以通过 http://server.tus.local/files. 来访问到我们的 tus 终端.基于 RESTful 风格的端点配置:获取有关服务器目前配置的信息\OPTIONS /files检查上传的文件是否合法\HEAD /files/{upload-key}创建\POST /files修改\PATCH /files/{upload-key}删除\DELETE /files/{upload-key}查看 协议细则 获取更多关于路由的信息。如果你是用类似于 Laravel 的框架,那么你就不需要在配置文件里定义这些了, 可以直接定义路由来访问 tus 的基础端点。我们会在另外的教程里介绍相关细节。使用 tus-php 客户端处理上传服务器到位后,客户端可以块的形式上传文件。 让我们首先创建一个简单的 HTML 表单来获取用户的输入。 提交表单后,我们需要按照几个步骤来处理上传。创建一个 tus-php 客户端对象// Tus client$client = new \TusPhp\Tus\Client('http://server.tus.local');上面代码中的第一个参数是你的 tus 服务器地址。2. 使用文件元数据初始化客户端为了确保上传文件的唯一性,我们需要给每个上传的文件以唯一标识。这样在文件中断后续传的时候,服务器就可以很清晰地辨识出,哪几个片段是属于同一个文件得。这个标识码可以自己指定,也可以由系统生成。// 设置标识码和文件元数据$client->setKey($uploadKey)->file($_FILES['tus_file']['tmp_name'], 'your file name');如果不想指定标识码,可以这样写,由系统会自动生成:$client->file($_FILES'tus_file', 'your file name');$uploadKey = $client->getKey(); // Unique upload key3. 分块上传文件// $chunkSize 是以字节为单位的,例如 5000000 等于 5 MB$bytesUploaded = $client->upload($chunkSize);当你想要续传下一块的时候,就可以带上同样的标识码参数来续传。// 在下一个请求中续传文件$bytesUploaded = $client->setKey($uploadKey)->upload($chunkSize);文件全部上传完成后,默认情况下,服务器会使用 sha256 来校验文件总和,以确保不会有丢失的文件。使用 tus-js-client 客户端处理文件上传tus 协议的团队还开发了一个模块化的文件上传插件 Uppy。这个插件可以在官方 tus-js-client 和 tus-php 服务器之间建立连接。也就是说我们可以使用 php 配合 js 来实现文件上传了。uppy.use(Tus, { endpoint: 'https://server.tus.local/files/', // 你的 tus 服务器 resume: true, autoRetry: true, retryDelays: [0, 1000, 3000, 5000]})更多细节可以查看 uppy 的文档, 这里 还有些例子可以供你参考。分块上传tus-php 服务器支持 concatenation 扩展,可以把多次上传的文件合为一个文件。因此,我们可以在客户端支持并行上传以及非连续的分块文件上传。使用 tus-php 实现分块上传tus-partial-upload.php<?php// 文件唯一标识码$uploadKey = uniqid();$client->setKey($uploadKey)->file('/path/to/file', 'chunk_a.ext');// 从第 1000 个字节开始上传 10000 字节$bytesUploaded = $client->seek(1000)->upload(10000);$chunkAkey = $client->getKey();// 从 第 0 个字节开始上传 10000 字节$bytesUploaded = $client->setFileName('chunk_b.ext')->seek(0)->upload(1000);$chunkBkey = $client->getKey();// 从第 11000 个字节 (10000 + 1000) 开始上传剩余的字节$bytesUploaded = $client->setFileName('chunk_c.ext')->seek(11000)->upload();$chunkCkey = $client->getKey();// 把分块上传的文件组合起来$client->setFileName('actual_file.ext')->concat($uploadKey, $chunkAkey, $chunkBkey, $chunkCkey);分块上传的完整例子 在这里.总结由于 tus-php 项目 本身还出于初级阶段,后面可能还会有一些改动。在 example 文件夹里,有三个不同的例子供你参考。如果任何问题或者建议,欢迎留言交流。Happy Coding!
2023年08月11日
17 阅读
0 评论
0 点赞
2023-08-11
用于检查和改进代码的PHP代码质量工具
用于检查和改进代码的PHP代码质量工具它们由您的同事开发人员Dave编写。这些类充满了格式错误,较差的缩进和奇怪的单字母变量。有很多依赖项需要向下滚动几分钟才能逃脱膨胀的构造函数。Shacking,你打开单元测试以了解它应该如何工作......但它们不存在。恐怖和不幸!你可以让Dave来到你的办公桌前,对他大喊大叫,你从未见过如此蹩脚的代码,诅咒他和他的家人。但是,既然你是一个尊敬的人,你知道这不是一个好的解决方案。教学而不是责备总能带来更好的结果。有了一个禅宗僧人的平静,你首先修复了在戴夫的帮助下驾驶你的老板疯狂的错误。然后,您决定向您的团队介绍一些代码质量工具。亲爱的读者,您已经拥有了良好的方法:代码质量工具对于编写可靠且无错误的PHP代码至关重要。它可以帮助您的同事检测代码库中的缺陷并向他们传授一些关键概念。但是,不要忘记它们提供的建议和数据并不适用于所有地方。您的经验和分析技能是您首先应该信任的。如果您已经对本文感到厌倦并且只想查看一个简单的PHP工具列表,则可以直接跳转到引用列表。在潜入之前的最后一件事:本文中介绍的工具分析或格式化您的代码,我不会谈论测试。安装代码质量工具安装此处描述的工具总是有多种方法。我个人的偏好是使用cgr来使用composer的全局包安装来避免全局范围的依赖性问题。在大多数情况下,您也可以使用PHAR格式。您可以参考每个工具的文档,以获得安装它们的所有可能方法。如何使用这些工具在你的终端所有工具都可以在终端中使用。大多数情况下,您只需将代码库的路径作为参数传递即可!我将为本文中的每个工具描述此过程。我建议你从项目的主文件夹中调用这些工具。每个示例都假设您的代码库位于该文件夹中src。在Vim / Neovim您可以在Vim中轻松配置所需的每个工具,并让它们解析打开的文件。使用插件neomake,您可以轻松地将PHPMD,PHPSTAN和PHPCS插入 Vim。它将显示在阴沟警告和错误中。非常便利!您甚至可以创建自己的制造商来使用您想要的每个PHP代码质量工具。作为参考,您可以参考我的neomake配置文件。在PHPStorm中由于我不再使用PhpStorm,我不会解释如何在IDE中安装这些工具。不过,这里有一些手册链接到Jetbrain的文档:PHPMDPHPCSPHP质量工具:必不可少的没有以下插件我不会写任何代码行。他们会正确格式化您的代码,并为您提供宝贵的建议。PHP-CS-Fixer(PHP编码标准修复程序)Github上文档让我们从长期会议,仇恨行为和谋杀冲动的原因开始:代码格式规则。帕金森琐碎定律的一个很好的例子。我个人对代码格式没有任何偏好。我关心的是拥有一致的:它更容易阅读它让你的思想更加重要PHP-CS-fixer是一个简单的工具,允许您自动格式化代码。默认情况下,使用PSR-1和PSR-2规则,但您可以定义自己的格式规则。使用以下命令,您可以格式化整个代码库:$ php-cs-fixer fix src/您也可以在不应用它们的情况下预览修改(--diff选项),或者您可以精确--rules选择要使用的规则(选项)。PHPCS(PHP CodeSniffer)Github上文档PHP CodeSniffer是一个非常好的工具,用于输出代码库中的编码标准违规。可以使用两个命令行脚本:phpcs输出实际的编码标准缺陷和phpcbf,它可以为您修复一些错误。您可以输入例如:$ phpcs src/输出看起来像这样:FILE: /home/superCoolUser/mySuperProject/src/Model/SuperModel.phpFOUND 6 ERRORS AND 1 WARNINGS AFFECTING 7 LINES2 | ERROR | [ ] Missing file doc comment 14 | ERROR | [ ] Missing @category tag in class comment 20 | ERROR | [ ] Missing doc comment for function __construct() 34 | WARNING | [ ] Line exceeds 85 characters; contains 93 characters 57 | ERROR | [x] Opening parenthesis of a multi-line function call must be the last content on the line 60 | ERROR | [ ] Expected "if (...) {\n"; found "if(...) {\n"63 | ERROR | [x] Closing parenthesis of a multi-line function call must be on a line by itselfPHPCBF CAN FIX THE 2 MARKED SNIFF VIOLATIONS AUTOMATICALLY正如您所看到的,phpcbf可以通过键入以下内容自动修复两个错误:$ phpcbf src/Model/SuperModel.php您可以使用PHP Code Sniffer附带的默认编码标准,也可以轻松实现自己的编码标准。PHPMD(PHP Mess Detector)官方网站文档PHPMD将在您的应用程序中显示该语言可能存在的错误和误用。这里怎么做的魔术:$ phpmd src/ text cleancodePHPMD将扫描项目的目录和子目录,并以纯文本形式输出发现的错误。您也可以通过替换上面命令行中的选项来创建html或xml输出text。在此示例中,我们使用cleancode规则集,但您显然可以更改它或创建自己的规则集。您想要在文件中输出错误吗?简单:$ phpmd src/ html cleancode --reportfile ~/phpmd.html如果选择xml输出,您将获得有关规则集的更多信息,如下所示:<violation beginline="61" endline="61" rule="BooleanArgumentFlag" ruleset="Clean Code Rules" externalInfoUrl="http://phpmd.org/rules/cleancode.html#booleanargumentflag" priority="1"> The method notThatCoolMethod has a boolean flag argument $badBoolean, which is a certain sign of a Single Responsibility Principle violation. </violation> <violation beginline="102" endline="104" rule="ElseExpression" ruleset="Clean Code Rules" externalInfoUrl="http://phpmd.org/rules/cleancode.html#elseexpression" priority="1"> The method superMethod uses an else expression. Else is never necessary and you can simplify the code to work without else. </violation>您可以看到例如违反规则的优先级。然后,您可以使用--minimumpriority选项优化结果。简而言之:PHPMD是一个很棒的工具,我真的很乐意使用它。它将检测代码中的许多潜在问题,并为您节省数小时的调试时间。你的老板会很高兴他会把你的工资提高200%。保证。PHPStan(PHP静态分析工具)Github上PHPStan是您工具箱中的另一个工具。它的目标是?编译时会显示编译语言等输出错误。它是PHPMD的一个很好的补充。您可以按以下方式运行它:$ phpstan analyse src/ --level=7您可以使用级别选项精确地确定PHPStan的严格性。最小值是level 0最大值level 7。这里给出一个输出示例:------ ----------------------------------------------------------------------- Line src/MySuperModels/RandomModel ------ ----------------------------------------------------------------------- 78 Instantiated class App\Service\Api\InvalidArgumentException not found. 82 Instantiated class App\Service\Api\InvalidArgumentException not found. 93 Method App\Service\Api\Client\ClientInterface::post() invoked with 3 parameters, 4 required. 103 Casting to string something that's already string. ------ -----------------------------------------------------------------------与其他工具一样,您可以创建自己的规则。PHPUnit和CRAP指标Github上文档本文不涉及单元测试。我假设您知道测试代码的单元远比本文中的任何内容更重要。PHPUnit也可以显示一个非常有趣的信息:CRAP指标。CRAP使用圈复杂度和代码的代码覆盖率来显示应用程序中难以更改的代码。更多CRAP索引很高,你的代码将被视为“糟糕”。实际上,如果您的代码具有很高的复杂性但代码覆盖率很低,那么每次更改它时都会导致它出现不幸的错误。直到你的老板对你大喊大叫,你才会注意到。期待你的同事开发人员戴夫试图让你更加努力,让他在你的耻辱阴影中闪耀。要显示CRAP指标,您需要生成代码覆盖率报告:$ phpunit phpunit --coverage-html ./tempFolder这将在tempFolder目录中创建HTML文件。您可以index.html在那里打开并单击仪表板链接以最终考虑CRAP指标。垃圾量度前往CRAP中心的旅程但请记住:代码覆盖率并不意味着您的代码经过了充分测试。这是我将为另一篇文章保留的完全不同的主题。更深入地检查您的PHP代码我使用以下工具来确保我工作的项目朝着正确的方向发展。他们可以帮助您了解全局。当您需要处理未知(遗留)应用程序时,它们也可以成为真正的生命救星。它们可以为重构提供很大帮助。PhpLocGithub上PhpLoc是一个非常好的工具,可以了解项目的大小。您可以在您的代码库上执行:$ phploc src这将输出类似的东西:Size Lines of Code (LOC) 61 Comment Lines of Code (CLOC) 0 (0.00%) Non-Comment Lines of Code (NCLOC) 61 (100.00%) Logical Lines of Code (LLOC) 23 (37.70%)Classes 17 (73.91%) Average Class Length 17 Minimum Class Length 17 Maximum Class Length 17 Average Method Length 3 Minimum Method Length 1 Maximum Method Length 7 Functions 0 (0.00%) Average Function Length 0 Not in classes or functions 6 (26.09%) Cyclomatic Complexity Average Complexity per LLOC 0.26 Average Complexity per Class 7.00Minimum Class Complexity 7.00 Maximum Class Complexity 7.00Average Complexity per Method 2.20Minimum Method Complexity 1.00 Maximum Method Complexity 4.00 Dependencies Global Accesses 0Global Constants 0 (0.00%) Global Variables 0 (0.00%) Super-Global Variables 0 (0.00%)Attribute Accesses 7Non-Static 7 (100.00%) Static 0 (0.00%)Method Calls 14Non-Static 14 (100.00%) Static 0 (0.00%) Structure Namespaces 1 Interfaces 0 Traits 0 Classes 1Abstract Classes 0 (0.00%) Concrete Classes 1 (100.00%)Methods 5Scope Non-Static Methods 5 (100.00%) Static Methods 0 (0.00%) Visibility Public Methods 3 (60.00%) Non-Public Methods 2 (40.00%)Functions 0Named Functions 0 (0.00%) Anonymous Functions 0 (0.00%)Constants 1Global Constants 0 (0.00%) Class Constants 1 (100.00%) 这些数据可以为您提供有关该项目的一些线索:Comment lines of code永远不会好。不加思索地摆脱它。太高Average Class length通常也不好。拆分神班。太高Average Method length也不好。为了解雇你的同事,分开他们。Cyclomatic complexity可以指出一切和任何东西。信任CRAP之类的东西可能更明智。避免不必要Dependencies。简而言之:一个非常简单而有价值的工具。PHPCPD(PHP复制过去检测器)Github上PHPCPD将扫描您的代码库并输出重复的代码。您可以输入以下命令来使用它:$ phpcpd src/PHPCPD将产生这种输出:phpcpd 4.0.0 by Sebastian Bergmann.Found 1 clones with 44 duplicated lines in 2 files:/home/superUser/src/superFile.php:11-55/home/superUser/src/superFolder/superFile.php:11-555.04% duplicated lines out of 873 total lines of code.Time: 29 ms, Memory: 4.00MB您可以包含多个文件而不是整个目录,排除某些文件(或路径),甚至可以将结果输出到XML文件中。但请记住:如果您在代码库中使用DRY原则违规,请记住,代码重复并不一定意味着DRY违规。PHPMND(PHP魔数检测器)Github上文档这个工具非常具体:它可以帮助您在代码中找到魔术数字。最简单的使用方法:$ phpmnd src/这里输出:httpClient/myHttpClient.php:98. Magic number: 20098| if ($response->getStatusCode() != 200) {service/superClass.php:47. Magic number: 847| for ($i = 0; $i < 8; $i++) {你可以玩很多选项,比如可以忽略数字,排除文件/路径/扩展......dePHPendGithub上文档你有没有在一个充满不必要的依赖项目上工作,想知道如何理解这个噩梦?你想验证你的精彩项目是否没有变成一个复杂的泥球大球吗?dePHPend可以帮助您在这件事上隆重。您可以按如下方式使用它:$ dephpend metrics src/然后这个输出将神奇地出现:示例减去输出如您所见,dePHPend将输出传入耦合的数量,传出耦合的数量并显示基于它们的不稳定性指标。明确:没有班级依赖于班级 App\Kernel该课程App\Kernel取决于其他五个班级这里的不稳定性评分很高:这个班级将其他课程结合在一起但从未使用过!您也可以输出纯文本或UML。流失的PHPGithub上churn-php将根据圈复杂度和类的提交次数显示你应该重构的类。这是一个非常有趣的方法。经常被修改的非常复杂的类确实很有可能引入错误。作为其他工具,使用起来非常简单:$ churn run src/结果如下FileTimes ChangedComplexityScoresrc/Service/classToRefactor.php1280.441src/Service/anotherClass.php3150.185分数越高,重构的需求就越大。PhpCodeFixerGithub上文档不推荐的功能很糟糕。他们可以创建非常奇怪的错误,难以调试。此工具可以帮助您在闪亮的应用程序中检测它们。您可以精确地使用PHP的版本和主代码库目录,如下所示:$ phpcf --target 7.1 src这里通常可能的输出:phpcf输出PhpMetricsGithub上文档最后但同样重要的是:如果您是度量标准爱好者,PhpMetrics将是您的日常修复。它将输出大量有关您项目的指标。你需要输入类似的东西:$ phpmetrics --report-html=myreport.html src/HTML输出将充满图表和数字。现在请记住,指标不一定是绝对真理,它实际上取决于您的项目。我不会解释这个工具可以在这里输出的所有内容,也许在将来的文章中?我们真的需要这些工具来检查我们的PHP代码吗?我的经验告诉我,软件熵是真实的。您将修改更多应用程序,应用程序有更多机会破解。您的申请将不可避免地变得更加复杂。这些PHP代码质量工具绝对可以帮助您解决这个问题。由于您的代码库将越来越多,因此重构是必需的,这些工具可以向您展示从哪里开始。每天,他们可以为您提供所需的所有这些小事,以保持您的代码库健康。请记住:它们是一个很好的补充,但不是一个可靠的测试套件的替代品,从良好的单元测试开始。你使用的工具不是这里描述的工具吗?你用不同的方式吗?不要犹豫,通过分享您的经验来帮助社区。快速参考PHP-CS-定影液文档Github上PHPCS文档Github上PHPMDDocumenation官方网站PHPStanGithub上PHPUnit的文档Github上PHPLocGithub上PHPCPDGithub上PHPMND文档Github上流失的PHPGithub上dePHPend官方网站Github上PhpCodeFixer文档Github上PhpMetrics官方网站Github上via https://thevaluable.dev/code-quality-check-tools-php/
2023年08月11日
11 阅读
0 评论
0 点赞
1
...
53
54
55
...
112