PHP A/B Testing SDK 依赖于神策 PHP SDK,在使用前请确保已经成功集成神策 PHP SDK,并进行了 SDK 初始化,详情可参考 SDK 集成 (PHP SDK)

PHP A/B Testing  最低兼容 PHP 7.X,缓存功能依赖 memcached 或者 redis 扩展

集成 SDK

有 2 种集成方式:

  1. 使用 composer 集成

    { 
    	"require": { 
    		"sensorsdata/abtesting-sdk-php": "0.0.5" 
    	} 
    }
    CODE
  2. 直接从 GitHub  获取 SDK 的源码并集成到项目中

初始化 SDK

PHP A/B Testing SDK 依赖神策分析 PHP SDK。请确保已经成功集成 PHP SDK,并进行了 SDK 初始化。成功引入 A/B Testing SDK 之后,请先在神策分析前端页面创建相关的分流试验,然后获取生成的分流 URL。

<?php
	require_once("SensorsAnalytics.php");
	require_once("SensorsABTesting.php");
    # 从神策分析配置页面中获取的数据接收的 URL
	$SA_SERVER_URL = 'YOUR_SERVER_URL';
	# 获取分流试验请求地址
    $ABTesting_API_URL = 'YOUR_AB_API_URL';   
	
	# 初始化一个 Consumer,用于数据发送
	# BatchConsumer 是同步发送数据,因此不要在任何线上的服务中使用此 Consumer
	$consumer = new BatchConsumer($SA_SERVER_URL);
	# 使用 Consumer 来构造 SensorsAnalytics 对象
	$sa = new SensorsAnalytics($consumer);
	# 支持在构造SensorsAnalytics对象时指定project, 后续所有通过这个SensorsAnalytics对象发送的数据都将发往这个project
	# $sa = new SensorsAnalytics($consumer, "project_name");
	# 初始化 PHP AB 功能
 	$sab = new SensorsABTesting($ABTesting_API_URL, $sa);

	# 以下是触发一个事件测试数据发送
	$distinct_id = 'ABCDEF123456789';
	$sa->track($distinct_id, true, 'UserLogin');

	$sa->flush();
?>
CODE

初始化配置参数说明

参数含义

参数名

试验请求 API 地址(必填$api_url
用于 SDK 埋点 SensorsAnalytics 实例(必填$sa
缓存服务配置$cache_config

A/B 试验

获取试验变量

初始化 SDK 之后,通过 API 获取具体试验的变量值,根据获取试验变量值的方式,可分为下面两种策略:

  • async_fetch_abtest :直接从服务端获取数据
  • fast_fetch_abtest 优先读取内存缓存,缓存不存在时从服务端获取数据。

应该选择哪个API获取试验变量值?

1.一般情况下,我们推荐使用fast_fetch_abtest获取试验变量值。

2.如果您进行的是时间片轮转等在试验过程中用户会进入不同组的试验,建议您使用async_fetch_abtest,直接从服务端获取数据,保证获取变量的准确性。

1. 接入前请参考如何设置distinct_id,在调用时正确设置distinct_id参数.

2. 请确保对 A/B 分流返回的 result 结果 & 接口中使用的默认值,都做了正常的业务逻辑处理

3. 请确保默认值 default_value 和当前试验值类型相同。比如参数对应试验值为 Int 类型,则传入的 default_value 也必须是 Int 类型,同时返回的试验结果 result 也是 Int 类型

如果您需要在新用户注册流程中使用A/B Testing服务端SDK新用户进行用户主体分流试验,不建议您使用login_id请求分流。可参考以下方案,根据您试验的实际情况选择其中一个:

  1. 如果您目前的A/B Testing 版本在v0.9.1以上,可以在创建试验时采用登录ID作为试验的分流主体。
  2. 如果用户只会在一台设备登录,没有多设备登录场景,可使用客户端设备的匿名ID请求分流,即distinct_id为从客户端获取的匿名ID,is_login_id为false.
  3. 可以将试验移到客户端进行。
  4. 可以使用服务端SDK进行自定义主体分流试验。

以 fast_fetch_abtest 为例,可在相应的业务逻辑中添加如下代码:

$distinct_id = "ABCDEFG1234567" // 具体的用户 ID 标识
$is_login_id = true // 当前用户是否是登录 ID
$experiment_result = $sab->fast_fetch_abtest($distinct_id, $is_login_id, [
	"param_name" => '具体的试验参数',
  	"default_value" => '1', //默认值,必填
	"value_type" => 'STRING', //试验变量类型,必填
  	"enable_auto_track_event" => true, // true 表示自动触发 A/B 测试($ABTestTrigger)事件,用于后续分析试验效果,计算置信区间等
]);
switch ($experiment_result['value']) {
	case 0:
    	break;
	case 1:
		// 试验组 1 的处理逻辑
    	break;
 	case 2:
		// 试验组 2 的处理逻辑
    	break;
  default:
		break;
}
PHP

获取试验方法说明

描述

说明

方法名async_fetch_abtest/fast_fetch_abtest
参数

$distinct_id, $is_login_id, $request_param

  • $distinct_id:用户标识(必填)
  • $is_login_id:是否是登录 ID(必填)
  • $request_param:请求参数(必填)
返回值

$experiment_result:返回试验变量,用于客户埋点

request_param 参数说明

名称

说明

default_value未命中试验时,会返回默认值,请根据业务需要更改此处的值(必填
param_name试验变量名(必填
value_type试验变量类型,只能是 'INTEGER' | 'STRING' | 'JSON' | 'BOOLEAN'(必填
enable_auto_track_event是否自动触发 A/B 测试($ABTestTrigger)事件,用于后续分析试验效果,计算置信区间等,默认为 true
timeout_milliseconds网络请求超时时间,默认 3000ms,单位 ms

手动触发 A/B 测试($ABTestTrigger)事件说明

如果设置了 enable_auto_track_event=true 表示由 SDK 自动触发 A/B 测试($ABTestTrigger)事件,用于后续分析试验效果,计算置信区间等。

如果不想让 SDK 自动触发 A/B 测试($ABTestTrigger)事件,可以设置 enable_auto_track_event=false 然后调用 track_abtesttrigger 方法来手动触发事件

示例如下:

$distinct_id = "ABCDEFG1234567" // 具体的用户 ID 标识
$is_login_id = true // 当前用户是否是登录 ID
$experiment_result = $sab->fast_fetch_abtest($distinct_id, $is_login_id, [
	"param_name" => '具体的试验参数',
  	"default_value" => '1', //默认值,必填
	"value_type" => 'STRING', //试验变量类型,必填
  	"enable_auto_track_event" => true, // true 表示自动触发 A/B 测试($ABTestTrigger)事件,用于后续分析试验效果,计算置信区间等
]);
switch ($experiment_result['value']) {
	case 0:
    	break;
	case 1:
		// 试验组 1 的处理逻辑
    	break;
 	case 2:
		// 试验组 2 的处理逻辑
    	break;
  default:
		break;
}

//……
// 手动触发 A/B 测试($ABTestTrigger)事件
$sab->track_abtesttrigger($experiment_result);
PHP

$experiment_result 对象信息

试验结果 $experiment_result 对象中包含 distinct_id、是否登录  ID(is_login_id)、试验变量值(value)、试验 ID(abtest_experiment_id)、试验内分组 ID(abtest_experiment_group_id)、是否是对照组(is_control_group)、是否是白名单(is_white_list)和试验参数对象(VariableList)。

获取设备主体试验变量

接入前请参考如何设置distinctId,在调用时正确设置distinct_id参数。获取设备主体试验变量时,distinct_id为从客户端获取的匿名ID。

请确保对A/B分流返回的 result 结果 & 接口中使用的默认值,都做了正常的业务逻辑处理!

初始化SDK后,需要使用从客户端获取的匿名ID调用获取试验变量API,添加anonymous_id属性后手动上报$ABTestTrigger事件,且需要在后续上报的事件中添加anonymous_id作为事件属性。

$distinct_id = "anonymous_id" # 从客户端获取的匿名ID
$is_login_id = false # 当前用户不是登录ID
$experiment_result = $sab->fast_fetch_abtest($distinct_id, $is_login_id, [
	"param_name" => '具体的试验参数',
  	"default_value" => '1', #默认值,必填
	"value_type" => 'STRING', #试验变量类型,必填
  	"enable_auto_track_event" => false, # false 表示手动触发 A/B 测试($ABTestTrigger)事件,用于后续分析试验效果,计算置信区间等
]);

# 手动触发 A/B 测试($ABTestTrigger)事件,将anonymous_id作为事件属性
$anonymous_id_properties = array("anonymous_id" => $distinct_id);
$sab->track_abtesttrigger($experiment_result,$anonymous_id_properties);

switch ($experiment_result['value']) {
	case 0:
    	break;
	case 1:
		# 试验组 1 的处理逻辑
    	break;
 	case 2:
		# 试验组 2 的处理逻辑
    	break;
  default:
		break;
}

# 如果需要上报事件参与AB设备主体试验指标计算,需要在每条埋点事件中将anonymous_id作为事件属性上报,如下所示
$properties = array(
		# 商品 ID
		'ProductId' => '123456',
        # 将anonymous_id作为事件属性上报
        'anonymous_id' => $distinct_id
);
$sa->track($distinct_id, false, 'buy', $properties);
PHP

缓存服务

使用缓存服务可以将实验结果或者上传事件缓存到内存中,减少接口和埋点请求量。现在 PHP A/B Testing 的缓存支持 redis 和 memcached,需要 php 安装了 redis/memcached 扩展。

$sab = new SensorsABTesting($ABTesting_API_URL, $sa, [
	"type" => "redis",
	"host" => "127.0.0.1",
	"port" => "6379",
	"pass" => "pass",
	"enable_event_cache" => true,
]);
PHP

缓存服务配置说明

参数含义

参数名

备注

默认值

范围

缓存服务类型(必填$typeredis 或 memcached

服务地址(必填$host


服务端口(必填$port


试验总缓存用户量限制$experiment_cache_size与type+host+port绑定,后面设置的会覆盖之前的配置4096
单用户试验缓存时间$experiment_cache_time与type+host+port绑定,后面设置的会覆盖之前的配置,已设置的实验缓存过期时间不会改变24h0~24h
是否开启自动上报事件$enable_event_cache
true
$ABTestTrigger 事件总缓存用户量限制$event_cache_size与type+host+port绑定,后面设置的会覆盖之前的配置4096

$ABTestTrigger 事件单用户缓存配置

$event_cache_time与type+host+port绑定,后面设置的会覆盖之前的配置,已设置的用户缓存过期时间不会改变24h0~24h

调试试验

  1. 可以通过录入调试设备的方式,把 PHP 用户加入指定分组中;加入调试设备后,会强制命中当前试验指定的分组调试设备在调试状态和正式上线阶段都会生效
  2. 集成神策分析 PHP SDK 后,在控制台中查看任意一条数据,可以获取当前用户的 distinct_id。
  3. 将此 distinct_id 对应的值复制录入试验白名单