1. 概述
本文次要是对于 PHP7 函数数据类型限定设定与否对性能的影响,为此,做了个简略的压测
另外,分享下本人两个工作中遇到的小问题及其应答,如有谬误,恳请斧正
2. PHP7 函数类型限定
(1) 介绍
- 函数参数类型限定 (包含返回值、成员属性) 从 PHP5 开始反对的,然而反对的类型不多,PHP7 做了扩大:int/string/bool/object 等
-
作用
- 防止谬误调用,表明类型,只能传递同类型的参数,尤其多人协同开发时
- 如果不是能够主动转换数据类型,如下,当然前提是待转化类型能够失常转化
- 而本文正是测试类型限定对性能的影响水平
function testInt(int $intNum){var_dump($intNum); } testInt("123"); // int(123)
- 留神 参数、返回值如果跟设定的类型不统一时会报错,不是百分百确认的须要手动转化下
(2) 压测
-
运行环境
- PHP 7.2.34
- Laravel 5.8
- AB 2.3
-
单机配置
- 型号名称 MacBook Pro
- 处理器名称 Quad-Core Intel Core i7
- 内存 8 GB
- 核总数 4
-
AB
- 应用 AB (Apache Benchmark) 进行压测,因为不是正式的压测,所以此处只关怀综合指标:Requests per second (均匀每秒申请数)
-
主要参数
- -n 压测申请数
- -c 并发数
- -p POST 申请时指定所需携带参数的文件
- -r 遇到谬误响应不退出,操作系统有防高并发攻打保护措施 (apr_socket_recv: Connection reset by peer)
- 设置我的项目 设置两个 POST 接口,没有业务逻辑、中间件操作等,如下
/***** 1 一般接口 *****/
// CommonUserController
public function createUser(Request $request)
{
$this->validate($request, [
'name' => 'required|string',
'age' => 'required|integer',
'sex' => ['required', Rule::in([1, 2])],
]);
(new CommonUserModel())->createUser($request['age'], $request['name'], $request['sex'], $request['address'] ?? '');
return response()->json(['status' => 200, 'msg' => 'ok']);
}
// CommonUserModel
public function createUser($sex, $age, $name, $address)
{if(empty($sex) || empty($age) || empty($name)) return false;
// 省略 DB 操作
return true;
}
/***** 2 类型限定接口 *****/
// TypeUserController
public function createUser(Request $request): JsonResponse
{
$this->validate($request, [
'name' => 'required|string',
'age' => 'required|integer',
'sex' => ['required', Rule::in([1, 2])],
]);
(new TypeUserModel())->createUser($request['age'], $request['name'], $request['sex'], $request['address'] ?? '');
return response()->json(['status' => 200, 'msg' => 'ok']);
}
// TypeUserModel
public function createUser(int $age, string $name, int $sex, string $address): bool
{if(empty($sex) || empty($age) || empty($name)){return false;}
// 省略 DB 操作
return true;
}
(3) 施行
- 共进行五次压测,配置及后果展现如下 (对立删除:| grep ‘Requests per second’)
/***** 第一次 *****/
// 类型限定接口 rps=456.16
ab -n 100 -c 10 -p '/tmp/ab_post_data.json' -T 'application:json' http://www.laravel_type_test.com/api/type/create_user
// 一般接口 rps=450.12
ab -n 100 -c 10 -p '/tmp/ab_post_data.json' -T 'application:json' http://www.laravel_type_test.com/api/common/create_user
/***** 第二次 *****/
// 类型限定接口 rps=506.74
ab -n 1000 -c 100 -p '/tmp/ab_post_data.json' -T 'application:json' http://www.laravel_type_test.com/api/type/create_user
// 一般接口 rps=491.24
ab -n 1000 -c 100 -p '/tmp/ab_post_data.json' -T 'application:json' http://www.laravel_type_test.com/api/common/create_user
/***** 第三次 *****/
// 类型限定接口 rps=238.43
ab -n 5000 -c 150 -p '/tmp/ab_post_data.json' -T 'application:json' -r http://www.laravel_type_test.com/api/type/create_user
// 一般接口 rps=237.16
ab -n 5000 -c 150 -p '/tmp/ab_post_data.json' -T 'application:json' -r http://www.laravel_type_test.com/api/common/create_user
/***** 第四次 *****/
// 类型限定接口 rps=209.21
ab -n 10000 -c 150 -p '/tmp/ab_post_data.json' -T 'application:json' -r http://www.laravel_type_test.com/api/type/create_user
// 一般接口 rps=198.01
ab -n 10000 -c 150 -p '/tmp/ab_post_data.json' -T 'application:json' -r http://www.laravel_type_test.com/api/common/create_user
/***** 第五次 *****/
// 类型限定接口 rps=191.17
ab -n 100000 -c 150 -p '/tmp/ab_post_data.json' -T 'application:json' -r http://www.laravel_type_test.com/api/type/create_user
// 一般接口 rps=190.55
ab -n 100000 -c 150 -p '/tmp/ab_post_data.json' -T 'application:json' -r http://www.laravel_type_test.com/api/common/create_user
(4) 后果
- 压测不算太谨严,后果仅供参考
- 类型限定对性能的晋升没有预期的大,很渺小,不过还是举荐这种写法