您的位置: 翼速应用 > 业内知识 > PHP框架 > 正文

PHP7函数类型限定对性能有无影响?

文中主要讲解通过简单的压测来探讨PHP7函数数据类型限定设定与否对性能的影响,其次是分享下我们两个工作中遇到的小问题及其应对,如有错误还请文章下方评论纠正。


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.结果


压测不算太严谨,结果仅供参考
类型限定对性能的提升没有预期的大,很微小,不过还是推荐这种写法

我来说两句

0 条评论

推荐阅读

  • 响应式布局CSS媒体查询设备像素比介绍

    构建响应式网站布局最常见的是流体网格,灵活调整大小的站点布局技术,确保用户在使用的幕上获得完整的体验。响应式设计如何展示富媒体图像,可以通过以下几种方法。

    admin
  • 提升网站的性能快速加载的实用技巧

    网站速度很重要,快速加载的网站会带来更好的用户体验、更高的转化率、更多的参与度,而且在搜索引擎排名中也扮演重要角色,做SEO,网站硬件是起跑线,如果输在了起跑线,又怎么跟同行竞争。有许多方法可提升网站的性能,有一些技巧可以避免踩坑。

    admin
  • 织梦CMS TAG页找不到标签和实现彩色标签解决方法

    织梦cms是我们常见的网站程序系统的一款,在TAG标签中常常遇到的问题也很多。当我们点击 tags.php 页的某个标签的时候,有时会提示:“系统无此标签,可 能已经移除!” 但是我们检查程序后台,以及前台显示页面。这个标签确实存在,如果解决这个问题那?

    admin
  • HTML关于fieldset标签主要的作用

    在前端开发html页面中常用的标签很多,今天为大家带来的是关于HTML中fieldset标签主要的作用说明,根据技术分析HTML

    admin

精选专题