heaps-good-services / variant
用于Laravel 5框架的A/B/n测试包
Requires
- php: ^7.0.0
- psr/simple-cache: ^1.0
README
PHP 7的a/b/n测试包。
要求
- PHP >= 7.0
安装
由于引入了"包发现",Laravel v5.4和v5.5+的安装过程略有不同。请参考下面的适当安装部分。
Laravel 5.5+的安装
- 将 "heaps-good-services/variant": "^2.0" 添加到您的 composer.json 文件中。
- 运行 "composer update"。
配置
Variant需要存储聚合结果和执行用户实验时的缓存,但该包中不包含实现。需要创建UserVariationRepository和CacheInterface的实现。
既有聚合结果的存储机制,也有用户结果的存储机制。聚合结果存储用于存储系统实验和经过验证的用户结果。还需要一个用户存储来缓存用户结果,直到它们满足验证要求,然后结果将自动迁移到聚合结果。
用户结果通常存储在会话中,而聚合结果可以存储在数据库或持久化缓存中。
注意事项
如果使用服务容器,您需要将Experiments类的实例绑定为一个单例以使实验持久化。
用法
实验在VariantServiceProvider的boot方法中注册。然后,这些实验在应用程序的整个生命周期中都可以使用。
注册实验
注册一个实验以测试某个文本对注册页面转换率的影响。
$variant->registerExperiment('sign_up_message')
->addVariation('welcome')// A welcoming message.
->addVariation('free_ipad')// Free IPad on sign up.
->addVariation('not_welcome', 9);// Deter the user from signing up.
权重
权重越高,特定变体被从随机池中选择的可能性就越高。
...
$variant->registerExperiment('sign_up_message')
->addVariation('welcome', 3)
->addVariation('free_ipad')
->addVariation('deter', 9);
...
权重对应于该变体在彩票中拥有的门票数量。在上面的示例中,'welcome'变体有3/13的概率被选中。
实验类型
有用户实验和系统实验。用户实验在将数据传播到聚合结果之前需要验证。系统实验直接存储在聚合结果中。
要注册系统实验,请将'isSystemExperiment'参数设置为true。
...
$variant->registerExperiment('sms_gateway_reliability', true)
->addVariation('superstar_sms_company')
->addVariation('hindenburg_sms_systems');
...
用法
可以使用辅助函数'variant()'在任何地方使用Variant外观。
添加验证标签
验证标签有助于验证人类请求并阻止机器人扭曲结果。
交互
交互表示特定实验实例的开始。**交互限制为每个用户实验一个,无论交互被触发多少次**。
转换
app/Http/Controllers/SignUpController.php
function store(Request $request) {
...
convert('sign_up_message');
...
}
转换限制为每个用户实验一个,无论转换被触发多少次。
示例系统实验
app/Factories/SmsGatewayFactory.php
function makeSmsGateway(string $smsGatewayName): SmsGatewayInterface {
...
switch($smsGatewayName) {
case 'superstar_sms_company':
return new SuperStarSMSGateway(...);
case 'hindenburg_sms_systems':
return new HindenburgSMSGateway(...);
default:
...
}
...
}
app/Jobs/SendSmsMessage.php
function handle(SmsGatewayFactory $smsGatewayFactory) {
$variation = variant()->getExperiment('sms_gateway_reliability')
->getVariation()
->addInteraction();
if($smsGatewayFactory->makeSmsGateway($variation->getName())->send(...)) {
$variation->addConversion();
}
}
注意
函数'interact'和'convert'将抑制异常,而函数'interact_or_fail'和'convert_or_fail'则不会抑制异常。