pablojoan/feature

用于运营爬坡和A/B测试的功能标志API

8.0.2 2023-11-29 17:13 UTC

This package is auto-updated.

Last update: 2024-09-03 04:08:31 UTC


README

GitHub license

需要PHP 8.3及以上。

安装

composer require pablojoan/feature

基本用法

use PabloJoan\Feature\Features; // Import the namespace.

$featureConfigs = [
    'foo' => [
        'variants' => [
            'variant1' => 100, //100% chance this variable will be chosen
            'variant2' => 0    //0% chance this variable will be chosen
        ]
    ],
    'bar' => [
        'variants' => [
            'variant1' => 25, //25% chance this variable will be chosen
            'variant2' => 25, //25% chance this variable will be chosen
            'variant3' => 50 //50% chance this variable will be chosen
        ],
        'bucketing' => 'id' //same id string will always return the same variant
    ]
];

$features = new Features($featureConfigs);

$features->isEnabled(featureName: 'foo');         // true
$features->getEnabledVariant(featureName: 'foo'); // 'variant1'

为了快速总结和常见用例,请阅读此README的其余部分。

功能API

用于运营爬坡和A/B测试的功能标志API。

功能API是我们选择性启用和禁用功能的方式,以非常精细的粒度,同时还可以为运营爬坡和A/B测试启用一定比例的用户的功能。一个功能可以完全启用、完全禁用或介于两者之间,并可以包含多个相关变体。

两个主要的API入口点

    $features->isEnabled(featureName: 'my_feature')

my_feature 启用时返回true,对于多变体功能

    $features->getEnabledVariant(featureName: 'my_feature')

返回应使用的特定变体的名称。

这些方法的单个参数是要测试的功能的名称。

对于单变体功能,$features->isEnabled 的典型用法如下

    if ($features->isEnabled(featureName: 'my_feature')) {
        // do stuff
    }

对于多变体功能,我们可以使用类似以下的方法来确定每个变体的适当代码

    switch ($features->getEnabledVariant(featureName: 'my_feature')) {
      case 'foo':
          // do stuff appropriate for the 'foo' variant
          break;
      case 'bar':
          // do stuff appropriate for the 'bar' variant
          break;
    }

如果功能按id划分桶,则我们将id字符串传递给 $features->isEnabled$features->getEnabledVariant 作为第二个参数

    $isMyFeatureEnabled = $features->isEnabled(
        featureName: 'my_feature',
        id: 'unique_id_string'
    );

    $variant = $features->getEnabledVariant(
        featureName: 'my_feature',
        id: 'unique_id_string'
    );

配置菜谱

有许多常见的配置,在解释功能配置段落的完整语法之前,这里有一些更常见的案例以及配置的最简洁方式。

完全启用的功能

    $server_config['foo'] = ['variants' => ['enabled' => 100]];

完全禁用的功能

    $server_config['foo'] = ['variants' => ['enabled' => 0]];

为所有人启用获胜变体的功能

    $server_config['foo'] = ['variants' => ['blue_background' => 100]];

单变体功能以1%的用户量爬坡。

    $server_config['foo'] = ['variants' => ['enabled' => 1]];

多变体功能以1%的用户量对每个变体爬坡。

    $server_config['foo'] = [
       'variants' => [
           'blue_background'   => 1,
           'orange_background' => 1,
           'pink_background'   => 1,
       ],
    ];

为10%的普通用户启用。

    $server_config['foo'] = [
       'variants' => ['enabled' => 10]
    ];

功能以1%的请求量爬坡,随机划分而不是按id

    $server_config['foo'] = [
       'variants' => ['enabled' => 1],
       'bucketing' => 'random'
    ];

功能以40%的请求量爬坡,按id划分而不是随机

    $server_config['foo'] = [
       'variants' => ['enabled' => 40],
       'bucketing' => 'id'
    ];

50/50 A/B测试中的单变体功能

    $server_config['foo'] = ['variants' => ['enabled' => 50]];

A/B测试中的多变体功能,20%的用户看到每个变体(40%留在控制组)。

    $server_config['foo'] = [
       'variants' => [
           'blue_background'   => 20,
           'orange_background' => 20,
           'pink_background'   => 20
       ],
    ];

配置细节

每个功能的配置段落控制功能何时启用以及启用时应使用哪个变体。

功能配置段落的值是一个数组,包含多个特殊键,其中最重要的是 'variants'

'variants' 属性的值是一个数组,其键是变体的名称,其值是应看到每个变体的请求百分比。

剩余的功能配置属性是 'bucketing'。Bucketing指定在只启用一定比例用户的功能时如何对用户进行划分。默认值 'random' 导致每个请求独立划分,这意味着同一用户在不同请求中会处于不同的桶中。这通常用于不应有任何用户可见效果的功能,但我们希望启动类似从master到shards的切换或JS代码的新版本。

'id' 的bucketing值,导致基于给定id进行划分。

错误

有几种误用功能API或配置功能的方式可能会被发现。(其中一些目前尚未检测到,但将来可能会。)

  1. 'variants' 中变体的百分比值设置为小于0或大于100的值。

  2. 'variants' 设置为使变体百分比之和大于100。

  3. 'variants' 设置为非数组值。

  4. 'bucketing' 设置为任何不是 'id''random' 的值。