KeyEnvKeyEnv
SDKs & Integrations

PHP SDK

Official PHP SDK for KeyEnv.

PHP SDK

Official PHP SDK for KeyEnv with PHP 8.0+ support.

Beta Release: This SDK is currently in development. APIs may change before the stable 1.0 release.

Installation

Install via Composer:

composer require keyenv/keyenv

Quick Start

<?php

use KeyEnv\KeyEnv;

$client = KeyEnv::create($_ENV['KEYENV_TOKEN']);

// Load secrets into $_ENV and putenv()
$count = $client->loadEnv('your-project-id', 'production');
echo "Loaded {$count} secrets\n";

// Access secrets
echo $_ENV['DATABASE_URL'];
echo getenv('DATABASE_URL');

Initialize the Client

Simple Initialization

<?php

use KeyEnv\KeyEnv;

$client = KeyEnv::create($_ENV['KEYENV_TOKEN']);

With Options

<?php

use KeyEnv\KeyEnv;

$client = new KeyEnv(
    token: $_ENV['KEYENV_TOKEN'],
    timeout: 60  // Request timeout in seconds
);

Loading Secrets

Load into Environment

The simplest way to use secrets in your application:

<?php

$count = $client->loadEnv('project-id', 'production');
echo "Loaded {$count} secrets\n";

// Access via $_ENV
echo $_ENV['DATABASE_URL'];
echo $_ENV['API_KEY'];

// Or via getenv()
echo getenv('DATABASE_URL');
echo getenv('API_KEY');

Get Secrets as Array

Get secrets as a key-value associative array:

<?php

$secrets = $client->exportSecretsAsArray('project-id', 'production');
echo $secrets['DATABASE_URL'];
echo $secrets['API_KEY'];

Export as List

Get secrets with metadata:

<?php

$secrets = $client->exportSecrets('project-id', 'production');
foreach ($secrets as $secret) {
    echo "{$secret->key}={$secret->value}\n";
}

Managing Secrets

Get a Single Secret

<?php

$secret = $client->getSecret('project-id', 'production', 'DATABASE_URL');
echo $secret->value;
echo $secret->description;

Set a Secret

Creates or updates a secret:

<?php

$client->setSecret('project-id', 'production', 'API_KEY', 'sk_live_...');

// With description
$client->setSecret(
    'project-id',
    'production',
    'API_KEY',
    'sk_live_...',
    description: 'Production API key'
);

Create a Secret

Explicitly create a new secret (fails if exists):

<?php

$secret = $client->createSecret(
    'project-id',
    'production',
    'NEW_KEY',
    'new_value',
    description: 'New secret'
);

Update a Secret

Explicitly update an existing secret (fails if not exists):

<?php

$secret = $client->updateSecret(
    'project-id',
    'production',
    'EXISTING_KEY',
    'updated_value'
);

Delete a Secret

<?php

$client->deleteSecret('project-id', 'production', 'OLD_KEY');

Environments

List Environments

<?php

$environments = $client->listEnvironments('project-id');
foreach ($environments as $env) {
    echo $env->name . "\n";
}

Generate .env File

<?php

$envContent = $client->generateEnvFile('project-id', 'production');
file_put_contents('.env', $envContent);

Error Handling

<?php

use KeyEnv\KeyEnv;
use KeyEnv\KeyEnvException;

try {
    $secret = $client->getSecret('project-id', 'production', 'MISSING_KEY');
} catch (KeyEnvException $e) {
    echo "Error {$e->getCode()}: {$e->getMessage()}\n";

    if ($e->isNotFound()) {
        echo "Secret not found\n";
    } elseif ($e->isUnauthorized()) {
        echo "Invalid or expired token\n";
    } elseif ($e->isForbidden()) {
        echo "Access denied\n";
    }

    // Access error details
    if ($e->getDetails()) {
        print_r($e->getDetails());
    }
}

API Reference

Constructor Parameters

ParameterTypeRequiredDefaultDescription
tokenstringYes-Service token
timeoutintNo30Request timeout (seconds)

Methods

MethodDescription
validateToken()Validate token and get user info
listEnvironments(projectId)List environments in a project
listSecrets(projectId, env)List secret keys (no values)
exportSecrets(projectId, env)Export secrets with values
exportSecretsAsArray(projectId, env)Export as associative array
getSecret(projectId, env, key)Get single secret
createSecret(projectId, env, key, value)Create new secret
updateSecret(projectId, env, key, value)Update existing secret
setSecret(projectId, env, key, value)Create or update secret
deleteSecret(projectId, env, key)Delete secret
loadEnv(projectId, env)Load secrets into $_ENV
generateEnvFile(projectId, env)Generate .env file content

Examples

Laravel Application

<?php
// bootstrap/app.php or AppServiceProvider

use KeyEnv\KeyEnv;

if ($token = env('KEYENV_TOKEN')) {
    $client = KeyEnv::create($token);
    $client->loadEnv(env('KEYENV_PROJECT'), env('APP_ENV', 'production'));
}

Laravel Service Provider

<?php

namespace App\Providers;

use Illuminate\Support\ServiceProvider;
use KeyEnv\KeyEnv;

class KeyEnvServiceProvider extends ServiceProvider
{
    public function register(): void
    {
        $this->app->singleton(KeyEnv::class, function () {
            return KeyEnv::create(config('services.keyenv.token'));
        });
    }

    public function boot(): void
    {
        if ($token = config('services.keyenv.token')) {
            $client = app(KeyEnv::class);
            $client->loadEnv(
                config('services.keyenv.project'),
                app()->environment()
            );
        }
    }
}

Symfony Application

<?php
// src/EventSubscriber/SecretsSubscriber.php

namespace App\EventSubscriber;

use KeyEnv\KeyEnv;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use Symfony\Component\HttpKernel\KernelEvents;

class SecretsSubscriber implements EventSubscriberInterface
{
    public static function getSubscribedEvents(): array
    {
        return [
            KernelEvents::REQUEST => ['loadSecrets', 255],
        ];
    }

    public function loadSecrets(): void
    {
        static $loaded = false;

        if ($loaded) {
            return;
        }

        if ($token = $_ENV['KEYENV_TOKEN'] ?? null) {
            $client = KeyEnv::create($token);
            $client->loadEnv($_ENV['KEYENV_PROJECT'], $_ENV['APP_ENV'] ?? 'prod');
            $loaded = true;
        }
    }
}

WordPress Plugin

<?php
// In your plugin or theme's functions.php

use KeyEnv\KeyEnv;

add_action('init', function () {
    if (!defined('KEYENV_TOKEN')) {
        return;
    }

    $client = KeyEnv::create(KEYENV_TOKEN);
    $secrets = $client->exportSecretsAsArray(KEYENV_PROJECT, KEYENV_ENV ?? 'production');

    foreach ($secrets as $key => $value) {
        if (!defined($key)) {
            define($key, $value);
        }
    }
}, 1);

CLI Script

#!/usr/bin/env php
<?php

require_once __DIR__ . '/vendor/autoload.php';

use KeyEnv\KeyEnv;
use KeyEnv\KeyEnvException;

$token = getenv('KEYENV_TOKEN');
if (!$token) {
    fwrite(STDERR, "Error: KEYENV_TOKEN environment variable not set\n");
    exit(1);
}

try {
    $client = KeyEnv::create($token);
    $secrets = $client->exportSecrets('my-project', 'production');

    foreach ($secrets as $secret) {
        echo "{$secret->key}={$secret->value}\n";
    }
} catch (KeyEnvException $e) {
    fwrite(STDERR, "KeyEnv Error: {$e->getMessage()}\n");
    exit(1);
}

PHPUnit Test Setup

<?php

namespace Tests;

use KeyEnv\KeyEnv;
use PHPUnit\Framework\TestCase;

abstract class TestCaseWithSecrets extends TestCase
{
    protected function setUp(): void
    {
        parent::setUp();

        if ($token = getenv('KEYENV_TOKEN')) {
            $client = KeyEnv::create($token);
            $client->loadEnv(getenv('KEYENV_PROJECT'), 'test');
        }
    }
}

On this page