Ю2сайт

Создание сайтов

Скрипт А/Б тестирования на php

В последнее время все популярнее стали мультилендинги и АБ-тесты, давайте разберемся, что это такое и как оно работает.

А/Б тест - это демонстрация разных версий одного сайта пользователям с целью выявления лучшей. Почему нельзя второй сайт повесить на новый домен? Потому, что условия будут не равными, один сайт всегда будет лучше другого (по SEO, по возрасту, по названию и т.д.), идея в том, что бы взять 1000 пользователей например из контекстной рекламы, 500 пользователям показать версию сайта с зеленой кнопкой "купить", а 500 пользователям с красной кнопкой "заказать сейчас" и понять какой вариант даст большую конверсию.

Мультилендинг 
- это нечто похожее, но тут мы например выяснили, что те пользователи которые приходят из соц сети одноклассники не нуждаются в вэйпинг аксессуарах и на главной странице вашего интернет магазина лучше им показать ретро пепельницы. Получается, что мультилендинг определяет откуда пришел человек (в случае с контекстной рекламой можно настроить очень тонко) и подставляет для этого канала пользователей свой вариант страницы. Остается только протестировать все варианты и подобрать для каждого канала вариант с наибольшей конверсией.

А/Б тест на php

Для начала я делаю страницу index.php на которую будет попадать пользователь. Далее эта страница будет редиректить на нужный вариант. Все варианты я называю цифрами, так удобнее, например классический А/Б тест будет содержать в корне сайта 1.php и 2.php
Ещё создаем файл flag.txt в который будем записывать номер последней отрытой версии (т.е. если зашел человек и попал на 2.php, то во flag.txt запишем 2)
Так же нам понадобится ставить пользователю куку, для того что бы при обновлении страницы он не увидел другую версию. Назавем её ab_test, а в значение будем записывать ту версию которая теперь его.
Перейдем к коду, в index.php нам нужна будет функция для записи флага:

function writeFlag($next_num = false){
    $write_next_num = ($next_num ? $next_num : DEFAULT_TEMPLATE_NUM);
    $f = fopen(FLAG_FILE, 'w');
    fwrite($f, $write_next_num);
    fclose($f);
}


Ну и основной код файла:

define('FLAG_FILE', 'flag.txt'); //определяем файл флага
define('DEFAULT_TEMPLATE_NUM', 1); //версия по умолчанию, срабатывает при самом первом заходе или в случае ошибок с файлом flag

$last_visit_template = file(FLAG_FILE); //считываем файл флага
$last_template_num = 0;
$next_template_num = 0;
$templates_array = array(  //основной массив версий, может быть много
    1, 2,
);

if (is_array($last_visit_template) && sizeof($last_visit_template) > 0)
{
    $last_template_num = intval(trim($last_visit_template[0]));
}else{
    writeFlag();
    $last_template_num = DEFAULT_TEMPLATE_NUM;
}

if (!($last_template_num == 1 || $last_template_num == 2))
{
    writeFlag();
    $last_template_num = DEFAULT_TEMPLATE_NUM;
}

$next_template_num = $last_template_num;

foreach ($templates_array as $template_num_key => $template_num)
{
    if ($template_num == $last_template_num)
    {
        if (isset($templates_array[$template_num_key+1]))
        {
            $next_template_num = $templates_array[$template_num_key+1];
        }
        elseif (isset($templates_array[$template_num_key-1]))
        {
            $next_template_num = $templates_array[$template_num_key-1];
        }
        break;
    }
}

if (isset($_COOKIE['ab_test'])) {
    if (in_array($_COOKIE['ab_test'], $templates_array))    {
        $next_template_num = $_COOKIE['ab_test'];
    }else{
        setcookie(
            "ab_test",
            $next_template_num,
            time() + (10 * 365 * 24 * 60 * 60)
        );
        writeFlag($next_template_num);
    }
}else{
    setcookie(
        "ab_test",
        $next_template_num,
        time() + (10 * 365 * 24 * 60 * 60)
    );
    writeFlag($next_template_num);
}

include($next_template_num.'.php');