The latest from the PostHog community

How to set up A/B tests in PHP

Feb 08, 2024

A/B tests help you improve your PHP app by enabling you to compare the impact of changes on key metrics. To show you how to set one up, we create a basic PHP app, add PostHog, create an A/B test, and implement the code for it.

1. Create a basic PHP app

First, ensure PHP is installed. Then, create a new folder for your project called php-ab-tests. In this folder, create an index.php file:

Terminal
mkdir php-ab-tests
cd ./php-ab-tests
touch index.php

Next, add the following code to index.php to set up a basic page with a heading and paragraph:

index.php
<?php
$paragraphText = 'Placeholder text';
?>
<!DOCTYPE html>
<html>
<body>
<h1>PHP A/B Testing Tutorial</h1>
<p><?php echo $paragraphText; ?></p>
</body>
</html>

Run php -S localhost:8000 and navigate to http://localhost:8000 to see our app in action.

Basic PHP app

2. Add PostHog to your app

With our app set up, it’s time to install and set up PostHog. If you don't have a PostHog instance, you can sign up for free.

To start, make sure Composer is installed. Then run composer require posthog/posthog-php to install PostHog’s PHP SDK.

Then, initialize PostHog at the top of index.php using your project API key and instance address (you can find these in your project settings):

index.php
<?php
require_once __DIR__ . '/vendor/autoload.php';
use PostHog\PostHog;
PostHog::init(
'<ph_project_api_key>',
['host' => https://us.i.posthog.com]
);
// rest of your code

Lastly, we capture a $pageview event using PostHog::capture():

index.php
<?php
require_once __DIR__ . '/vendor/autoload.php';
use PostHog\PostHog;
PostHog::init(
'<ph_project_api_key>',
['host' => https://us.i.posthog.com]
);
$paragraphText = 'Placeholder text';
$distinctId = 'placeholder-user-id';
PostHog::capture([
'distinctId' => $distinctId,
'event' => '$pageview'
]);
?>
<!-- your existing html code -->

With this set up, restart your app and then refresh your browser a few times. You should now see the captured event in your PostHog activity tab.

Events captured in PostHog

3. Create an A/B test in PostHog

If you haven't done so already, you'll need to upgrade your PostHog account to include A/B testing. This requires entering your credit card, but don't worry, we have a generous free tier of 1 million requests per month – so you won't be charged anything yet.

Next, go to the A/B testing tab and create an A/B test by clicking the New experiment button. Add the following details to your experiment:

  1. Name it "My cool experiment".
  2. Set "Feature flag key" to my-cool-experiment.
  3. Under the experiment goal, select the pageview event we captured in the previous step.
  4. Use the default values for all other fields.

Click "Save as draft" and then click "Launch".

Experiment setup in PostHog

4. Implement the A/B test code

To implement the A/B test, we:

  1. Fetch the my-cool-experiment flag using PostHog::getFeatureFlag().
  2. Update the paragraph text based on whether the user is in the control or test variant of the experiment.
index.php
<?php
require_once __DIR__ . '/vendor/autoload.php';
use PostHog\PostHog;
PostHog::init(
'<ph_project_api_key>',
['host' => https://us.i.posthog.com]
);
$paragraphText = 'Placeholder text';
$distinctId = 'placeholder-user-id';
// fetch the feature flag
$enabledVariant = PostHog::getFeatureFlag(
'my-cool-experiment',
$distinctId
);
if ($enabledVariant === "control") {
$paragraphText = "Control variant!";
} else if ($enabledVariant === "test") {
$paragraphText = "Test variant!";
}
// rest of your code

When you restart your app and refresh the page, you should see the text updated to either Control variant! or Test variant!.

💡 Setting the correct distinctId:

You may notice that we set distinctId = 'placeholder-user-id' in our flag call above. In production apps, to ensure you fetch the correct flag value for your user, distinctId should be set to their unique ID.

For logged-in users, you typically use their email or user ID as their distinctId. For logged-out users, assuming they made their request from a browser, you can use values from their request cookies. See an example of this in our Nuxt feature flags tutorial.

5. Include the feature flag when capturing your event

To ensure our goal metric is correctly calculated for each experiment variant, we need to include our feature flag information when capturing our $pageview event.

To do this, we add the $feature/my-cool-experiment key to our event properties:

index.php
<?php
// rest of your code
PostHog::capture([
'distinctId' => $distinctId,
'event' => '$pageview',
'properties' => [
'$feature/my-cool-experiment' => $enabledVariant
]
]);
// rest of your code

Now PostHog is able to calculate our goal metric for our experiment results:

Experiment results in PostHog

Further reading