pablojoan / feature
用于运营爬坡和A/B测试的功能标志API
Requires
- php: >=8.3
Requires (Dev)
README
需要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或配置功能的方式可能会被发现。(其中一些目前尚未检测到,但将来可能会。)
-
将
'variants'
中变体的百分比值设置为小于0或大于100的值。 -
将
'variants'
设置为使变体百分比之和大于100。 -
将
'variants'
设置为非数组值。 -
将
'bucketing'
设置为任何不是'id'
或'random'
的值。