Skip to content

Repository files navigation

Perfbase

Perfbase for CakePHP

CakePHP integration for Perfbase.

Packagist VersionLicenseCIPHP VersionCakePHP Version

This package is a thin adapter over perfbase/php-sdk. It wires CakePHP HTTP requests and command lifecycles into the shared SDK and leaves transport, payload construction, extension handling, and submission to perfbase/php-sdk.

What it profiles

  • HTTP requests on CakePHP 4.4+ and 5.x
  • CakePHP 5 console commands through command lifecycle events
  • CakePHP 4 console commands when they extend ProfiledCommand

Out of scope in v1:

  • Queue profiling
  • Custom buffering, retry, or transport logic

Requirements

  • PHP 7.4 to 8.5
  • CakePHP ^4.4 || ^5.0
  • ext-json
  • perfbase/php-sdk ^1.0
  • The native Perfbase PHP extension in the host runtime if you want traces to be collected

The package fails open when the extension is unavailable. Your CakePHP application keeps running, but no Perfbase trace data is collected until the extension is installed and loaded.

If your application wants manual custom spans outside the automatic HTTP and console integration, depend on and use perfbase/php-sdk directly. This package does not add a separate Cake-specific manual tracing API.

Installation

Install the package from Packagist:

composer require perfbase/cakephp:^1.0

Install the Perfbase PHP extension if it is not already available:

bash -c "$(curl -fsSL https://cdn.perfbase.com/install.sh)"

Restart PHP-FPM, RoadRunner workers, Swoole workers, or your web server after installing the extension.

Load the plugin in your application:

useCake\Http\BaseApplication;
usePerfbase\CakePHP\PerfbasePlugin;
class Application extends BaseApplication
{
publicfunctionbootstrap(): void
{
parent::bootstrap();
$this->addPlugin(PerfbasePlugin::class);
}
}

Once the plugin is loaded:

  • HTTP profiling is enabled automatically through plugin middleware
  • CakePHP 5 command profiling is enabled automatically through command events
  • CakePHP 4 command profiling is available by extending ProfiledCommand

CakePHP 4 does not get automatic command profiling. That path is CakePHP 5 only.

Quick start

Create config/perfbase.php in your application:

<?phpusePerfbase\SDK\FeatureFlags;
return [
'Perfbase' => [
'enabled' => true,
'api_key' => env('PERFBASE_API_KEY'),
'sample_rate' => 0.1,
'profile_http_status_codes' => [...range(200, 299), ...range(500, 599)],
'flags' => FeatureFlags::DefaultFlags,
'environment' => env('APP_ENV', 'production'),
'app_version' => env('APP_VERSION', ''),
],
];

Set your API key in the environment:

export PERFBASE_API_KEY=your-api-key-here

Start with a sample rate like 0.1 or lower in production, then tune based on traffic and overhead.

Configuration model

The plugin ships defaults in config/perfbase.php.

Configuration is resolved in this order:

  1. Package defaults
  2. Application config/perfbase.php if present
  3. Existing Configure::write('Perfbase', ...) values

That means explicit runtime configuration wins over file-based configuration.

Supported configuration

return [
'Perfbase' => [
'enabled' => false,
'debug' => false,
'log_errors' => true,
'api_key' => null,
'api_url' => 'https://ingress.perfbase.cloud',
'sample_rate' => 0.1,
'profile_http_status_codes' => [...range(200, 299), ...range(500, 599)],
'timeout' => 10,
'proxy' => null,
'flags' => \Perfbase\SDK\FeatureFlags::DefaultFlags,
'environment' => 'production',
'app_version' => '',
'include' => [
'http' => ['*'],
'console' => ['*'],
],
'exclude' => [
'http' => [],
'console' => [],
],
],
];

Core settings

SettingDefaultPurpose
enabledfalseGlobal on/off switch
debugfalseRe-throw profiling failures instead of failing open
log_errorstrueLog profiling failures when debug is off
api_keynullPerfbase API key
api_urlhttps://ingress.perfbase.cloudReceiver base URL
sample_rate0.1Sampling rate from 0.0 to 1.0
profile_http_status_codes[...range(200, 299), ...range(500, 599)]HTTP response codes that should be submitted
timeout10Submission timeout in seconds
proxynullOptional outbound proxy
flagsFeatureFlags::DefaultFlagsPerfbase extension feature flags
environmentproductionTrace environment tag
app_version''Application version tag

profile_http_status_codes is configured in CakePHP config rather than an environment variable. The default [...range(200, 299), ...range(500, 599)] submits successful responses and server errors, while dropping common noisy client responses such as 404. Add codes like 404 if you want to keep them.

Runtime config

If you want to override settings programmatically, do it before the plugin uses the config:

useCake\Core\Configure;
Configure::write('Perfbase', [
'enabled' => true,
'api_key' => env('PERFBASE_API_KEY'),
'sample_rate' => 1.0,
]);

Feature flags

The plugin passes feature flags straight through to the Perfbase extension via the shared SDK.

Examples:

usePerfbase\SDK\FeatureFlags;
'flags' => FeatureFlags::DefaultFlags;
'flags' => FeatureFlags::AllFlags;
'flags' => FeatureFlags::TrackCpuTime | FeatureFlags::TrackPdo;

Common flags:

  • UseCoarseClock
  • TrackCpuTime
  • TrackMemoryAllocation
  • TrackPdo
  • TrackHttp
  • TrackCaches
  • TrackMongodb
  • TrackElasticsearch
  • TrackQueues
  • TrackAwsSdk
  • TrackFileOperations
  • TrackFileCompilation
  • TrackFileDefinitions
  • TrackExceptions

Filters

The package supports include and exclude filters for http and console contexts.

return [
'Perfbase' => [
'include' => [
'http' => ['GET /users/*', 'POST /checkout'],
'console' => ['migrations:*', 'cache clear*'],
],
'exclude' => [
'http' => ['GET /health*', '/metrics'],
'console' => ['debug:*'],
],
],
];

Supported pattern styles:

  • * or .* to match all
  • glob patterns such as GET /admin/*
  • regular expressions such as /^POST \/checkout/

The HTTP lifecycle matches against normalized identifiers, not just the raw URL. It prefers route-derived action names and falls back to stable controller/action or path identifiers when needed.

How it behaves

HTTP requests

HTTP profiling is provided by PerfbaseMiddleware. The middleware guarantees lifecycle cleanup with try/finally and attaches response or exception data before submission.

By default, only responses with a status code in profile_http_status_codes are submitted. The shipped default is [...range(200, 299), ...range(500, 599)].

Recorded attributes include:

  • source=http
  • action
  • http_method
  • http_url
  • http_status_code
  • user_ip
  • user_agent
  • user_id when the request identity attribute exposes a scalar identifier
  • environment
  • app_version
  • hostname
  • php_version

Span names follow the format http.{METHOD}.{identifier}.

http_url is recorded without the query string. This is deliberate so tokens, emails, and other sensitive query parameters are not shipped as trace metadata.

CakePHP 5 console commands

CakePHP 5 command profiling is automatic once the plugin is loaded. The plugin registers Cake5ConsoleListener with the global event manager and tracks active command lifecycles by command object hash so repeated or nested commands do not collide.

Recorded attributes include:

  • source=console
  • action
  • exit_code
  • exception when present
  • environment
  • app_version
  • hostname
  • php_version

Span names follow the format console.{command-name}.

CakePHP 4 console commands

CakePHP 4 does not expose the same global command lifecycle events as CakePHP 5. Command profiling is therefore opt-in. Extend ProfiledCommand:

namespaceApp\Command;
useCake\Console\Arguments;
useCake\Console\ConsoleIo;
usePerfbase\CakePHP\Command\ProfiledCommand;
class ExampleCommand extends ProfiledCommand
{
publicfunctionexecute(Arguments$args, ConsoleIo$io)
{
$io->out('Perfbase command profiling is active.');
returnstatic::CODE_SUCCESS;
}
}

Failure behavior

This package is designed to fail open:

  • if the extension is unavailable, profiling is skipped
  • if Perfbase submission fails, the host application continues
  • if debug is true, profiling exceptions are rethrown to make failures visible during development

The adapter does not implement its own buffering or retry layer. Submission is delegated to the shared SDK.

Example production setup

For a low-overhead production baseline:

<?phpusePerfbase\SDK\FeatureFlags;
return [
'Perfbase' => [
'enabled' => true,
'api_key' => env('PERFBASE_API_KEY'),
'sample_rate' => 0.02,
'timeout' => 5,
'flags' => FeatureFlags::UseCoarseClock | FeatureFlags::TrackCpuTime | FeatureFlags::TrackPdo,
'environment' => env('APP_ENV', 'production'),
'app_version' => env('APP_VERSION', ''),
'exclude' => [
'http' => ['GET /health*', '/metrics'],
],
],
];

That gives you a useful production trace stream with conservative overhead.

Troubleshooting

The extension is unavailable

Check that the extension is loaded:

php -m | grep perfbase
php --ini

If needed, reinstall it:

bash -c "$(curl -fsSL https://cdn.perfbase.com/install.sh)"

Restart any long-lived PHP workers afterwards.

No traces are appearing

Check these first:

  • the plugin is loaded
  • profiling is enabled
  • the API key is present
  • the extension is loaded
  • the current request or command is allowed by your filters
  • the sample rate is not set too low

Overhead is higher than expected

To reduce overhead:

  • lower sample_rate
  • use UseCoarseClock
  • disable feature flags you do not need
  • narrow include filters or widen excludes

Development

Useful commands:

composer install
composer run phpstan
composer run test
composer run lint

The package currently has full PHPUnit coverage and a clean PHPStan pass against the checked-in source.

Documentation

Full documentation is available at perfbase.com/docs.

License

Apache-2.0. See LICENSE.txt.

About

CakePHP integration for Perfbase - the PHP profiling service that helps you understand and optimize your application's performance.

Topics

Resources

Stars

1 star

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Add copy buttons to all
 blocks
(function() {
function addCopyButtons() {
document.querySelectorAll('pre code').forEach(function(codeBlock) {
if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;
codeBlock.parentElement.setAttribute('data-copy-added', 'true');
var btn = document.createElement('button');
btn.textContent = 'Copy';
btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';
btn.onmouseover = function() { this.style.opacity = '1'; };
btn.onmouseout = function() { this.style.opacity = '0.7'; };
btn.onclick = function() {
navigator.clipboard.writeText(codeBlock.textContent).then(function() {
btn.textContent = 'Copied!';
setTimeout(function() { btn.textContent = 'Copy'; }, 1500);
});
};
codeBlock.parentElement.style.position = 'relative';
codeBlock.parentElement.appendChild(btn);
});
}
addCopyButtons();
// Re-run on dynamic content
var observer = new MutationObserver(addCopyButtons);
observer.observe(document.body, { childList: true, subtree: true });
})();
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
GitHub - perfbaseorg/cakephp: CakePHP integration for Perfbase - the PHP profiling service that helps you understand and optimize your application's performance. · GitHub
Skip to content

Repository files navigation

Perfbase

Perfbase for CakePHP

CakePHP integration for Perfbase.

Packagist VersionLicenseCIPHP VersionCakePHP Version

This package is a thin adapter over perfbase/php-sdk. It wires CakePHP HTTP requests and command lifecycles into the shared SDK and leaves transport, payload construction, extension handling, and submission to perfbase/php-sdk.

What it profiles

  • HTTP requests on CakePHP 4.4+ and 5.x
  • CakePHP 5 console commands through command lifecycle events
  • CakePHP 4 console commands when they extend ProfiledCommand

Out of scope in v1:

  • Queue profiling
  • Custom buffering, retry, or transport logic

Requirements

  • PHP 7.4 to 8.5
  • CakePHP ^4.4 || ^5.0
  • ext-json
  • perfbase/php-sdk ^1.0
  • The native Perfbase PHP extension in the host runtime if you want traces to be collected

The package fails open when the extension is unavailable. Your CakePHP application keeps running, but no Perfbase trace data is collected until the extension is installed and loaded.

If your application wants manual custom spans outside the automatic HTTP and console integration, depend on and use perfbase/php-sdk directly. This package does not add a separate Cake-specific manual tracing API.

Installation

Install the package from Packagist:

composer require perfbase/cakephp:^1.0

Install the Perfbase PHP extension if it is not already available:

bash -c "$(curl -fsSL https://cdn.perfbase.com/install.sh)"

Restart PHP-FPM, RoadRunner workers, Swoole workers, or your web server after installing the extension.

Load the plugin in your application:

useCake\Http\BaseApplication;
usePerfbase\CakePHP\PerfbasePlugin;
class Application extends BaseApplication
{
publicfunctionbootstrap(): void
{
parent::bootstrap();
$this->addPlugin(PerfbasePlugin::class);
}
}

Once the plugin is loaded:

  • HTTP profiling is enabled automatically through plugin middleware
  • CakePHP 5 command profiling is enabled automatically through command events
  • CakePHP 4 command profiling is available by extending ProfiledCommand

CakePHP 4 does not get automatic command profiling. That path is CakePHP 5 only.

Quick start

Create config/perfbase.php in your application:

<?phpusePerfbase\SDK\FeatureFlags;
return [
'Perfbase' => [
'enabled' => true,
'api_key' => env('PERFBASE_API_KEY'),
'sample_rate' => 0.1,
'profile_http_status_codes' => [...range(200, 299), ...range(500, 599)],
'flags' => FeatureFlags::DefaultFlags,
'environment' => env('APP_ENV', 'production'),
'app_version' => env('APP_VERSION', ''),
],
];

Set your API key in the environment:

export PERFBASE_API_KEY=your-api-key-here

Start with a sample rate like 0.1 or lower in production, then tune based on traffic and overhead.

Configuration model

The plugin ships defaults in config/perfbase.php.

Configuration is resolved in this order:

  1. Package defaults
  2. Application config/perfbase.php if present
  3. Existing Configure::write('Perfbase', ...) values

That means explicit runtime configuration wins over file-based configuration.

Supported configuration

return [
'Perfbase' => [
'enabled' => false,
'debug' => false,
'log_errors' => true,
'api_key' => null,
'api_url' => 'https://ingress.perfbase.cloud',
'sample_rate' => 0.1,
'profile_http_status_codes' => [...range(200, 299), ...range(500, 599)],
'timeout' => 10,
'proxy' => null,
'flags' => \Perfbase\SDK\FeatureFlags::DefaultFlags,
'environment' => 'production',
'app_version' => '',
'include' => [
'http' => ['*'],
'console' => ['*'],
],
'exclude' => [
'http' => [],
'console' => [],
],
],
];

Core settings

SettingDefaultPurpose
enabledfalseGlobal on/off switch
debugfalseRe-throw profiling failures instead of failing open
log_errorstrueLog profiling failures when debug is off
api_keynullPerfbase API key
api_urlhttps://ingress.perfbase.cloudReceiver base URL
sample_rate0.1Sampling rate from 0.0 to 1.0
profile_http_status_codes[...range(200, 299), ...range(500, 599)]HTTP response codes that should be submitted
timeout10Submission timeout in seconds
proxynullOptional outbound proxy
flagsFeatureFlags::DefaultFlagsPerfbase extension feature flags
environmentproductionTrace environment tag
app_version''Application version tag

profile_http_status_codes is configured in CakePHP config rather than an environment variable. The default [...range(200, 299), ...range(500, 599)] submits successful responses and server errors, while dropping common noisy client responses such as 404. Add codes like 404 if you want to keep them.

Runtime config

If you want to override settings programmatically, do it before the plugin uses the config:

useCake\Core\Configure;
Configure::write('Perfbase', [
'enabled' => true,
'api_key' => env('PERFBASE_API_KEY'),
'sample_rate' => 1.0,
]);

Feature flags

The plugin passes feature flags straight through to the Perfbase extension via the shared SDK.

Examples:

usePerfbase\SDK\FeatureFlags;
'flags' => FeatureFlags::DefaultFlags;
'flags' => FeatureFlags::AllFlags;
'flags' => FeatureFlags::TrackCpuTime | FeatureFlags::TrackPdo;

Common flags:

  • UseCoarseClock
  • TrackCpuTime
  • TrackMemoryAllocation
  • TrackPdo
  • TrackHttp
  • TrackCaches
  • TrackMongodb
  • TrackElasticsearch
  • TrackQueues
  • TrackAwsSdk
  • TrackFileOperations
  • TrackFileCompilation
  • TrackFileDefinitions
  • TrackExceptions

Filters

The package supports include and exclude filters for http and console contexts.

return [
'Perfbase' => [
'include' => [
'http' => ['GET /users/*', 'POST /checkout'],
'console' => ['migrations:*', 'cache clear*'],
],
'exclude' => [
'http' => ['GET /health*', '/metrics'],
'console' => ['debug:*'],
],
],
];

Supported pattern styles:

  • * or .* to match all
  • glob patterns such as GET /admin/*
  • regular expressions such as /^POST \/checkout/

The HTTP lifecycle matches against normalized identifiers, not just the raw URL. It prefers route-derived action names and falls back to stable controller/action or path identifiers when needed.

How it behaves

HTTP requests

HTTP profiling is provided by PerfbaseMiddleware. The middleware guarantees lifecycle cleanup with try/finally and attaches response or exception data before submission.

By default, only responses with a status code in profile_http_status_codes are submitted. The shipped default is [...range(200, 299), ...range(500, 599)].

Recorded attributes include:

  • source=http
  • action
  • http_method
  • http_url
  • http_status_code
  • user_ip
  • user_agent
  • user_id when the request identity attribute exposes a scalar identifier
  • environment
  • app_version
  • hostname
  • php_version

Span names follow the format http.{METHOD}.{identifier}.

http_url is recorded without the query string. This is deliberate so tokens, emails, and other sensitive query parameters are not shipped as trace metadata.

CakePHP 5 console commands

CakePHP 5 command profiling is automatic once the plugin is loaded. The plugin registers Cake5ConsoleListener with the global event manager and tracks active command lifecycles by command object hash so repeated or nested commands do not collide.

Recorded attributes include:

  • source=console
  • action
  • exit_code
  • exception when present
  • environment
  • app_version
  • hostname
  • php_version

Span names follow the format console.{command-name}.

CakePHP 4 console commands

CakePHP 4 does not expose the same global command lifecycle events as CakePHP 5. Command profiling is therefore opt-in. Extend ProfiledCommand:

namespaceApp\Command;
useCake\Console\Arguments;
useCake\Console\ConsoleIo;
usePerfbase\CakePHP\Command\ProfiledCommand;
class ExampleCommand extends ProfiledCommand
{
publicfunctionexecute(Arguments$args, ConsoleIo$io)
{
$io->out('Perfbase command profiling is active.');
returnstatic::CODE_SUCCESS;
}
}

Failure behavior

This package is designed to fail open:

  • if the extension is unavailable, profiling is skipped
  • if Perfbase submission fails, the host application continues
  • if debug is true, profiling exceptions are rethrown to make failures visible during development

The adapter does not implement its own buffering or retry layer. Submission is delegated to the shared SDK.

Example production setup

For a low-overhead production baseline:

<?phpusePerfbase\SDK\FeatureFlags;
return [
'Perfbase' => [
'enabled' => true,
'api_key' => env('PERFBASE_API_KEY'),
'sample_rate' => 0.02,
'timeout' => 5,
'flags' => FeatureFlags::UseCoarseClock | FeatureFlags::TrackCpuTime | FeatureFlags::TrackPdo,
'environment' => env('APP_ENV', 'production'),
'app_version' => env('APP_VERSION', ''),
'exclude' => [
'http' => ['GET /health*', '/metrics'],
],
],
];

That gives you a useful production trace stream with conservative overhead.

Troubleshooting

The extension is unavailable

Check that the extension is loaded:

php -m | grep perfbase
php --ini

If needed, reinstall it:

bash -c "$(curl -fsSL https://cdn.perfbase.com/install.sh)"

Restart any long-lived PHP workers afterwards.

No traces are appearing

Check these first:

  • the plugin is loaded
  • profiling is enabled
  • the API key is present
  • the extension is loaded
  • the current request or command is allowed by your filters
  • the sample rate is not set too low

Overhead is higher than expected

To reduce overhead:

  • lower sample_rate
  • use UseCoarseClock
  • disable feature flags you do not need
  • narrow include filters or widen excludes

Development

Useful commands:

composer install
composer run phpstan
composer run test
composer run lint

The package currently has full PHPUnit coverage and a clean PHPStan pass against the checked-in source.

Documentation

Full documentation is available at perfbase.com/docs.

License

Apache-2.0. See LICENSE.txt.

About

CakePHP integration for Perfbase - the PHP profiling service that helps you understand and optimize your application's performance.

Topics

Resources

Stars

1 star

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Force GitHub README to respect dark mode (function() { var style = document.createElement('style'); style.textContent = ' .markdown-body { color-scheme: dark light; } .markdown-body pre { background: #161b22 !important; } .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; } .markdown-body table th, .markdown-body table td { border-color: #30363d !important; } .markdown-body img { background: #0d1117; } .markdown-body blockquote { border-left-color: #8b949e; } .markdown-body hr { border-color: #30363d; } '; document.head.appendChild(style); })(); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' GitHub - perfbaseorg/cakephp: CakePHP integration for Perfbase - the PHP profiling service that helps you understand and optimize your application's performance. · GitHub
Skip to content

Repository files navigation

Perfbase

Perfbase for CakePHP

CakePHP integration for Perfbase.

Packagist VersionLicenseCIPHP VersionCakePHP Version

This package is a thin adapter over perfbase/php-sdk. It wires CakePHP HTTP requests and command lifecycles into the shared SDK and leaves transport, payload construction, extension handling, and submission to perfbase/php-sdk.

What it profiles

  • HTTP requests on CakePHP 4.4+ and 5.x
  • CakePHP 5 console commands through command lifecycle events
  • CakePHP 4 console commands when they extend ProfiledCommand

Out of scope in v1:

  • Queue profiling
  • Custom buffering, retry, or transport logic

Requirements

  • PHP 7.4 to 8.5
  • CakePHP ^4.4 || ^5.0
  • ext-json
  • perfbase/php-sdk ^1.0
  • The native Perfbase PHP extension in the host runtime if you want traces to be collected

The package fails open when the extension is unavailable. Your CakePHP application keeps running, but no Perfbase trace data is collected until the extension is installed and loaded.

If your application wants manual custom spans outside the automatic HTTP and console integration, depend on and use perfbase/php-sdk directly. This package does not add a separate Cake-specific manual tracing API.

Installation

Install the package from Packagist:

composer require perfbase/cakephp:^1.0

Install the Perfbase PHP extension if it is not already available:

bash -c "$(curl -fsSL https://cdn.perfbase.com/install.sh)"

Restart PHP-FPM, RoadRunner workers, Swoole workers, or your web server after installing the extension.

Load the plugin in your application:

useCake\Http\BaseApplication;
usePerfbase\CakePHP\PerfbasePlugin;
class Application extends BaseApplication
{
publicfunctionbootstrap(): void
{
parent::bootstrap();
$this->addPlugin(PerfbasePlugin::class);
}
}

Once the plugin is loaded:

  • HTTP profiling is enabled automatically through plugin middleware
  • CakePHP 5 command profiling is enabled automatically through command events
  • CakePHP 4 command profiling is available by extending ProfiledCommand

CakePHP 4 does not get automatic command profiling. That path is CakePHP 5 only.

Quick start

Create config/perfbase.php in your application:

<?phpusePerfbase\SDK\FeatureFlags;
return [
'Perfbase' => [
'enabled' => true,
'api_key' => env('PERFBASE_API_KEY'),
'sample_rate' => 0.1,
'profile_http_status_codes' => [...range(200, 299), ...range(500, 599)],
'flags' => FeatureFlags::DefaultFlags,
'environment' => env('APP_ENV', 'production'),
'app_version' => env('APP_VERSION', ''),
],
];

Set your API key in the environment:

export PERFBASE_API_KEY=your-api-key-here

Start with a sample rate like 0.1 or lower in production, then tune based on traffic and overhead.

Configuration model

The plugin ships defaults in config/perfbase.php.

Configuration is resolved in this order:

  1. Package defaults
  2. Application config/perfbase.php if present
  3. Existing Configure::write('Perfbase', ...) values

That means explicit runtime configuration wins over file-based configuration.

Supported configuration

return [
'Perfbase' => [
'enabled' => false,
'debug' => false,
'log_errors' => true,
'api_key' => null,
'api_url' => 'https://ingress.perfbase.cloud',
'sample_rate' => 0.1,
'profile_http_status_codes' => [...range(200, 299), ...range(500, 599)],
'timeout' => 10,
'proxy' => null,
'flags' => \Perfbase\SDK\FeatureFlags::DefaultFlags,
'environment' => 'production',
'app_version' => '',
'include' => [
'http' => ['*'],
'console' => ['*'],
],
'exclude' => [
'http' => [],
'console' => [],
],
],
];

Core settings

SettingDefaultPurpose
enabledfalseGlobal on/off switch
debugfalseRe-throw profiling failures instead of failing open
log_errorstrueLog profiling failures when debug is off
api_keynullPerfbase API key
api_urlhttps://ingress.perfbase.cloudReceiver base URL
sample_rate0.1Sampling rate from 0.0 to 1.0
profile_http_status_codes[...range(200, 299), ...range(500, 599)]HTTP response codes that should be submitted
timeout10Submission timeout in seconds
proxynullOptional outbound proxy
flagsFeatureFlags::DefaultFlagsPerfbase extension feature flags
environmentproductionTrace environment tag
app_version''Application version tag

profile_http_status_codes is configured in CakePHP config rather than an environment variable. The default [...range(200, 299), ...range(500, 599)] submits successful responses and server errors, while dropping common noisy client responses such as 404. Add codes like 404 if you want to keep them.

Runtime config

If you want to override settings programmatically, do it before the plugin uses the config:

useCake\Core\Configure;
Configure::write('Perfbase', [
'enabled' => true,
'api_key' => env('PERFBASE_API_KEY'),
'sample_rate' => 1.0,
]);

Feature flags

The plugin passes feature flags straight through to the Perfbase extension via the shared SDK.

Examples:

usePerfbase\SDK\FeatureFlags;
'flags' => FeatureFlags::DefaultFlags;
'flags' => FeatureFlags::AllFlags;
'flags' => FeatureFlags::TrackCpuTime | FeatureFlags::TrackPdo;

Common flags:

  • UseCoarseClock
  • TrackCpuTime
  • TrackMemoryAllocation
  • TrackPdo
  • TrackHttp
  • TrackCaches
  • TrackMongodb
  • TrackElasticsearch
  • TrackQueues
  • TrackAwsSdk
  • TrackFileOperations
  • TrackFileCompilation
  • TrackFileDefinitions
  • TrackExceptions

Filters

The package supports include and exclude filters for http and console contexts.

return [
'Perfbase' => [
'include' => [
'http' => ['GET /users/*', 'POST /checkout'],
'console' => ['migrations:*', 'cache clear*'],
],
'exclude' => [
'http' => ['GET /health*', '/metrics'],
'console' => ['debug:*'],
],
],
];

Supported pattern styles:

  • * or .* to match all
  • glob patterns such as GET /admin/*
  • regular expressions such as /^POST \/checkout/

The HTTP lifecycle matches against normalized identifiers, not just the raw URL. It prefers route-derived action names and falls back to stable controller/action or path identifiers when needed.

How it behaves

HTTP requests

HTTP profiling is provided by PerfbaseMiddleware. The middleware guarantees lifecycle cleanup with try/finally and attaches response or exception data before submission.

By default, only responses with a status code in profile_http_status_codes are submitted. The shipped default is [...range(200, 299), ...range(500, 599)].

Recorded attributes include:

  • source=http
  • action
  • http_method
  • http_url
  • http_status_code
  • user_ip
  • user_agent
  • user_id when the request identity attribute exposes a scalar identifier
  • environment
  • app_version
  • hostname
  • php_version

Span names follow the format http.{METHOD}.{identifier}.

http_url is recorded without the query string. This is deliberate so tokens, emails, and other sensitive query parameters are not shipped as trace metadata.

CakePHP 5 console commands

CakePHP 5 command profiling is automatic once the plugin is loaded. The plugin registers Cake5ConsoleListener with the global event manager and tracks active command lifecycles by command object hash so repeated or nested commands do not collide.

Recorded attributes include:

  • source=console
  • action
  • exit_code
  • exception when present
  • environment
  • app_version
  • hostname
  • php_version

Span names follow the format console.{command-name}.

CakePHP 4 console commands

CakePHP 4 does not expose the same global command lifecycle events as CakePHP 5. Command profiling is therefore opt-in. Extend ProfiledCommand:

namespaceApp\Command;
useCake\Console\Arguments;
useCake\Console\ConsoleIo;
usePerfbase\CakePHP\Command\ProfiledCommand;
class ExampleCommand extends ProfiledCommand
{
publicfunctionexecute(Arguments$args, ConsoleIo$io)
{
$io->out('Perfbase command profiling is active.');
returnstatic::CODE_SUCCESS;
}
}

Failure behavior

This package is designed to fail open:

  • if the extension is unavailable, profiling is skipped
  • if Perfbase submission fails, the host application continues
  • if debug is true, profiling exceptions are rethrown to make failures visible during development

The adapter does not implement its own buffering or retry layer. Submission is delegated to the shared SDK.

Example production setup

For a low-overhead production baseline:

<?phpusePerfbase\SDK\FeatureFlags;
return [
'Perfbase' => [
'enabled' => true,
'api_key' => env('PERFBASE_API_KEY'),
'sample_rate' => 0.02,
'timeout' => 5,
'flags' => FeatureFlags::UseCoarseClock | FeatureFlags::TrackCpuTime | FeatureFlags::TrackPdo,
'environment' => env('APP_ENV', 'production'),
'app_version' => env('APP_VERSION', ''),
'exclude' => [
'http' => ['GET /health*', '/metrics'],
],
],
];

That gives you a useful production trace stream with conservative overhead.

Troubleshooting

The extension is unavailable

Check that the extension is loaded:

php -m | grep perfbase
php --ini

If needed, reinstall it:

bash -c "$(curl -fsSL https://cdn.perfbase.com/install.sh)"

Restart any long-lived PHP workers afterwards.

No traces are appearing

Check these first:

  • the plugin is loaded
  • profiling is enabled
  • the API key is present
  • the extension is loaded
  • the current request or command is allowed by your filters
  • the sample rate is not set too low

Overhead is higher than expected

To reduce overhead:

  • lower sample_rate
  • use UseCoarseClock
  • disable feature flags you do not need
  • narrow include filters or widen excludes

Development

Useful commands:

composer install
composer run phpstan
composer run test
composer run lint

The package currently has full PHPUnit coverage and a clean PHPStan pass against the checked-in source.

Documentation

Full documentation is available at perfbase.com/docs.

License

Apache-2.0. See LICENSE.txt.

About

CakePHP integration for Perfbase - the PHP profiling service that helps you understand and optimize your application's performance.

Topics

Resources

Stars

1 star

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Highlight search terms from Google/DuckDuckGo/Bing referrer (function() { var ref = document.referrer; var terms = []; if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) { var url = new URL(ref); var q = url.searchParams.get('q') || url.searchParams.get('p'); if (q) { terms = q.split(/\s+/).filter(function(t) { return t.length > 2; }); } } if (terms.length === 0) return; var style = document.createElement('style'); style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }'; document.head.appendChild(style); function highlight(node) { if (node.nodeType === 3) { // text node var text = node.textContent; var found = false; terms.forEach(function(term) { var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\]\\]/g, '\\') + ')', 'gi'); if (regex.test(text)) { found = true; var frag = document.createDocumentFragment(); var parts = text.split(regex); parts.forEach(function(part, i) { if (i % 2 === 0) { frag.appendChild(document.createTextNode(part)); } else { var span = document.createElement('span'); span.className = 'userscript-highlight'; span.textContent = part; frag.appendChild(span); } }); node.parentNode.replaceChild(frag, node); } }); } else if (node.nodeType === 1 && node.childNodes) { // element var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT']; if (!skipTags.includes(node.tagName)) { Array.from(node.childNodes).forEach(highlight); } } } highlight(document.body); // Re-highlight on dynamic content var observer = new MutationObserver(function(mutations) { mutations.forEach(function(m) { m.addedNodes.forEach(function(node) { if (node.nodeType === 1 || node.nodeType === 3) highlight(node); }); }); }); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' GitHub - perfbaseorg/cakephp: CakePHP integration for Perfbase - the PHP profiling service that helps you understand and optimize your application's performance. · GitHub
Skip to content

Repository files navigation

Perfbase

Perfbase for CakePHP

CakePHP integration for Perfbase.

Packagist VersionLicenseCIPHP VersionCakePHP Version

This package is a thin adapter over perfbase/php-sdk. It wires CakePHP HTTP requests and command lifecycles into the shared SDK and leaves transport, payload construction, extension handling, and submission to perfbase/php-sdk.

What it profiles

  • HTTP requests on CakePHP 4.4+ and 5.x
  • CakePHP 5 console commands through command lifecycle events
  • CakePHP 4 console commands when they extend ProfiledCommand

Out of scope in v1:

  • Queue profiling
  • Custom buffering, retry, or transport logic

Requirements

  • PHP 7.4 to 8.5
  • CakePHP ^4.4 || ^5.0
  • ext-json
  • perfbase/php-sdk ^1.0
  • The native Perfbase PHP extension in the host runtime if you want traces to be collected

The package fails open when the extension is unavailable. Your CakePHP application keeps running, but no Perfbase trace data is collected until the extension is installed and loaded.

If your application wants manual custom spans outside the automatic HTTP and console integration, depend on and use perfbase/php-sdk directly. This package does not add a separate Cake-specific manual tracing API.

Installation

Install the package from Packagist:

composer require perfbase/cakephp:^1.0

Install the Perfbase PHP extension if it is not already available:

bash -c "$(curl -fsSL https://cdn.perfbase.com/install.sh)"

Restart PHP-FPM, RoadRunner workers, Swoole workers, or your web server after installing the extension.

Load the plugin in your application:

useCake\Http\BaseApplication;
usePerfbase\CakePHP\PerfbasePlugin;
class Application extends BaseApplication
{
publicfunctionbootstrap(): void
{
parent::bootstrap();
$this->addPlugin(PerfbasePlugin::class);
}
}

Once the plugin is loaded:

  • HTTP profiling is enabled automatically through plugin middleware
  • CakePHP 5 command profiling is enabled automatically through command events
  • CakePHP 4 command profiling is available by extending ProfiledCommand

CakePHP 4 does not get automatic command profiling. That path is CakePHP 5 only.

Quick start

Create config/perfbase.php in your application:

<?phpusePerfbase\SDK\FeatureFlags;
return [
'Perfbase' => [
'enabled' => true,
'api_key' => env('PERFBASE_API_KEY'),
'sample_rate' => 0.1,
'profile_http_status_codes' => [...range(200, 299), ...range(500, 599)],
'flags' => FeatureFlags::DefaultFlags,
'environment' => env('APP_ENV', 'production'),
'app_version' => env('APP_VERSION', ''),
],
];

Set your API key in the environment:

export PERFBASE_API_KEY=your-api-key-here

Start with a sample rate like 0.1 or lower in production, then tune based on traffic and overhead.

Configuration model

The plugin ships defaults in config/perfbase.php.

Configuration is resolved in this order:

  1. Package defaults
  2. Application config/perfbase.php if present
  3. Existing Configure::write('Perfbase', ...) values

That means explicit runtime configuration wins over file-based configuration.

Supported configuration

return [
'Perfbase' => [
'enabled' => false,
'debug' => false,
'log_errors' => true,
'api_key' => null,
'api_url' => 'https://ingress.perfbase.cloud',
'sample_rate' => 0.1,
'profile_http_status_codes' => [...range(200, 299), ...range(500, 599)],
'timeout' => 10,
'proxy' => null,
'flags' => \Perfbase\SDK\FeatureFlags::DefaultFlags,
'environment' => 'production',
'app_version' => '',
'include' => [
'http' => ['*'],
'console' => ['*'],
],
'exclude' => [
'http' => [],
'console' => [],
],
],
];

Core settings

SettingDefaultPurpose
enabledfalseGlobal on/off switch
debugfalseRe-throw profiling failures instead of failing open
log_errorstrueLog profiling failures when debug is off
api_keynullPerfbase API key
api_urlhttps://ingress.perfbase.cloudReceiver base URL
sample_rate0.1Sampling rate from 0.0 to 1.0
profile_http_status_codes[...range(200, 299), ...range(500, 599)]HTTP response codes that should be submitted
timeout10Submission timeout in seconds
proxynullOptional outbound proxy
flagsFeatureFlags::DefaultFlagsPerfbase extension feature flags
environmentproductionTrace environment tag
app_version''Application version tag

profile_http_status_codes is configured in CakePHP config rather than an environment variable. The default [...range(200, 299), ...range(500, 599)] submits successful responses and server errors, while dropping common noisy client responses such as 404. Add codes like 404 if you want to keep them.

Runtime config

If you want to override settings programmatically, do it before the plugin uses the config:

useCake\Core\Configure;
Configure::write('Perfbase', [
'enabled' => true,
'api_key' => env('PERFBASE_API_KEY'),
'sample_rate' => 1.0,
]);

Feature flags

The plugin passes feature flags straight through to the Perfbase extension via the shared SDK.

Examples:

usePerfbase\SDK\FeatureFlags;
'flags' => FeatureFlags::DefaultFlags;
'flags' => FeatureFlags::AllFlags;
'flags' => FeatureFlags::TrackCpuTime | FeatureFlags::TrackPdo;

Common flags:

  • UseCoarseClock
  • TrackCpuTime
  • TrackMemoryAllocation
  • TrackPdo
  • TrackHttp
  • TrackCaches
  • TrackMongodb
  • TrackElasticsearch
  • TrackQueues
  • TrackAwsSdk
  • TrackFileOperations
  • TrackFileCompilation
  • TrackFileDefinitions
  • TrackExceptions

Filters

The package supports include and exclude filters for http and console contexts.

return [
'Perfbase' => [
'include' => [
'http' => ['GET /users/*', 'POST /checkout'],
'console' => ['migrations:*', 'cache clear*'],
],
'exclude' => [
'http' => ['GET /health*', '/metrics'],
'console' => ['debug:*'],
],
],
];

Supported pattern styles:

  • * or .* to match all
  • glob patterns such as GET /admin/*
  • regular expressions such as /^POST \/checkout/

The HTTP lifecycle matches against normalized identifiers, not just the raw URL. It prefers route-derived action names and falls back to stable controller/action or path identifiers when needed.

How it behaves

HTTP requests

HTTP profiling is provided by PerfbaseMiddleware. The middleware guarantees lifecycle cleanup with try/finally and attaches response or exception data before submission.

By default, only responses with a status code in profile_http_status_codes are submitted. The shipped default is [...range(200, 299), ...range(500, 599)].

Recorded attributes include:

  • source=http
  • action
  • http_method
  • http_url
  • http_status_code
  • user_ip
  • user_agent
  • user_id when the request identity attribute exposes a scalar identifier
  • environment
  • app_version
  • hostname
  • php_version

Span names follow the format http.{METHOD}.{identifier}.

http_url is recorded without the query string. This is deliberate so tokens, emails, and other sensitive query parameters are not shipped as trace metadata.

CakePHP 5 console commands

CakePHP 5 command profiling is automatic once the plugin is loaded. The plugin registers Cake5ConsoleListener with the global event manager and tracks active command lifecycles by command object hash so repeated or nested commands do not collide.

Recorded attributes include:

  • source=console
  • action
  • exit_code
  • exception when present
  • environment
  • app_version
  • hostname
  • php_version

Span names follow the format console.{command-name}.

CakePHP 4 console commands

CakePHP 4 does not expose the same global command lifecycle events as CakePHP 5. Command profiling is therefore opt-in. Extend ProfiledCommand:

namespaceApp\Command;
useCake\Console\Arguments;
useCake\Console\ConsoleIo;
usePerfbase\CakePHP\Command\ProfiledCommand;
class ExampleCommand extends ProfiledCommand
{
publicfunctionexecute(Arguments$args, ConsoleIo$io)
{
$io->out('Perfbase command profiling is active.');
returnstatic::CODE_SUCCESS;
}
}

Failure behavior

This package is designed to fail open:

  • if the extension is unavailable, profiling is skipped
  • if Perfbase submission fails, the host application continues
  • if debug is true, profiling exceptions are rethrown to make failures visible during development

The adapter does not implement its own buffering or retry layer. Submission is delegated to the shared SDK.

Example production setup

For a low-overhead production baseline:

<?phpusePerfbase\SDK\FeatureFlags;
return [
'Perfbase' => [
'enabled' => true,
'api_key' => env('PERFBASE_API_KEY'),
'sample_rate' => 0.02,
'timeout' => 5,
'flags' => FeatureFlags::UseCoarseClock | FeatureFlags::TrackCpuTime | FeatureFlags::TrackPdo,
'environment' => env('APP_ENV', 'production'),
'app_version' => env('APP_VERSION', ''),
'exclude' => [
'http' => ['GET /health*', '/metrics'],
],
],
];

That gives you a useful production trace stream with conservative overhead.

Troubleshooting

The extension is unavailable

Check that the extension is loaded:

php -m | grep perfbase
php --ini

If needed, reinstall it:

bash -c "$(curl -fsSL https://cdn.perfbase.com/install.sh)"

Restart any long-lived PHP workers afterwards.

No traces are appearing

Check these first:

  • the plugin is loaded
  • profiling is enabled
  • the API key is present
  • the extension is loaded
  • the current request or command is allowed by your filters
  • the sample rate is not set too low

Overhead is higher than expected

To reduce overhead:

  • lower sample_rate
  • use UseCoarseClock
  • disable feature flags you do not need
  • narrow include filters or widen excludes

Development

Useful commands:

composer install
composer run phpstan
composer run test
composer run lint

The package currently has full PHPUnit coverage and a clean PHPStan pass against the checked-in source.

Documentation

Full documentation is available at perfbase.com/docs.

License

Apache-2.0. See LICENSE.txt.

About

CakePHP integration for Perfbase - the PHP profiling service that helps you understand and optimize your application's performance.

Topics

Resources

Stars

1 star

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Strip utm_, fbclid, gclid, etc. from all links on page (function() { var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content', 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid', 'ref', 'ref_src', 'source', 'medium', 'campaign']; function cleanUrl(url) { try { var u = new URL(url, window.location.origin); var changed = false; trackingParams.forEach(function(p) { if (u.searchParams.has(p)) { u.searchParams.delete(p); changed = true; } }); return changed ? u.toString() : url; } catch (e) { return url; } } function cleanLinks() { document.querySelectorAll('a[href]').forEach(function(a) { var clean = cleanUrl(a.href); if (clean !== a.href) a.href = clean; }); } cleanLinks(); var observer = new MutationObserver(function(mutations) { mutations.forEach(function(m) { m.addedNodes.forEach(function(node) { if (node.nodeType === 1) { if (node.tagName === 'A') cleanLinks(); node.querySelectorAll('a[href]').forEach(function(a) { var clean = cleanUrl(a.href); if (clean !== a.href) a.href = clean; }); } }); }); }); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + ' GitHub - perfbaseorg/cakephp: CakePHP integration for Perfbase - the PHP profiling service that helps you understand and optimize your application's performance. · GitHub
Skip to content

Repository files navigation

Perfbase

Perfbase for CakePHP

CakePHP integration for Perfbase.

Packagist VersionLicenseCIPHP VersionCakePHP Version

This package is a thin adapter over perfbase/php-sdk. It wires CakePHP HTTP requests and command lifecycles into the shared SDK and leaves transport, payload construction, extension handling, and submission to perfbase/php-sdk.

What it profiles

  • HTTP requests on CakePHP 4.4+ and 5.x
  • CakePHP 5 console commands through command lifecycle events
  • CakePHP 4 console commands when they extend ProfiledCommand

Out of scope in v1:

  • Queue profiling
  • Custom buffering, retry, or transport logic

Requirements

  • PHP 7.4 to 8.5
  • CakePHP ^4.4 || ^5.0
  • ext-json
  • perfbase/php-sdk ^1.0
  • The native Perfbase PHP extension in the host runtime if you want traces to be collected

The package fails open when the extension is unavailable. Your CakePHP application keeps running, but no Perfbase trace data is collected until the extension is installed and loaded.

If your application wants manual custom spans outside the automatic HTTP and console integration, depend on and use perfbase/php-sdk directly. This package does not add a separate Cake-specific manual tracing API.

Installation

Install the package from Packagist:

composer require perfbase/cakephp:^1.0

Install the Perfbase PHP extension if it is not already available:

bash -c "$(curl -fsSL https://cdn.perfbase.com/install.sh)"

Restart PHP-FPM, RoadRunner workers, Swoole workers, or your web server after installing the extension.

Load the plugin in your application:

useCake\Http\BaseApplication;
usePerfbase\CakePHP\PerfbasePlugin;
class Application extends BaseApplication
{
publicfunctionbootstrap(): void
{
parent::bootstrap();
$this->addPlugin(PerfbasePlugin::class);
}
}

Once the plugin is loaded:

  • HTTP profiling is enabled automatically through plugin middleware
  • CakePHP 5 command profiling is enabled automatically through command events
  • CakePHP 4 command profiling is available by extending ProfiledCommand

CakePHP 4 does not get automatic command profiling. That path is CakePHP 5 only.

Quick start

Create config/perfbase.php in your application:

<?phpusePerfbase\SDK\FeatureFlags;
return [
'Perfbase' => [
'enabled' => true,
'api_key' => env('PERFBASE_API_KEY'),
'sample_rate' => 0.1,
'profile_http_status_codes' => [...range(200, 299), ...range(500, 599)],
'flags' => FeatureFlags::DefaultFlags,
'environment' => env('APP_ENV', 'production'),
'app_version' => env('APP_VERSION', ''),
],
];

Set your API key in the environment:

export PERFBASE_API_KEY=your-api-key-here

Start with a sample rate like 0.1 or lower in production, then tune based on traffic and overhead.

Configuration model

The plugin ships defaults in config/perfbase.php.

Configuration is resolved in this order:

  1. Package defaults
  2. Application config/perfbase.php if present
  3. Existing Configure::write('Perfbase', ...) values

That means explicit runtime configuration wins over file-based configuration.

Supported configuration

return [
'Perfbase' => [
'enabled' => false,
'debug' => false,
'log_errors' => true,
'api_key' => null,
'api_url' => 'https://ingress.perfbase.cloud',
'sample_rate' => 0.1,
'profile_http_status_codes' => [...range(200, 299), ...range(500, 599)],
'timeout' => 10,
'proxy' => null,
'flags' => \Perfbase\SDK\FeatureFlags::DefaultFlags,
'environment' => 'production',
'app_version' => '',
'include' => [
'http' => ['*'],
'console' => ['*'],
],
'exclude' => [
'http' => [],
'console' => [],
],
],
];

Core settings

SettingDefaultPurpose
enabledfalseGlobal on/off switch
debugfalseRe-throw profiling failures instead of failing open
log_errorstrueLog profiling failures when debug is off
api_keynullPerfbase API key
api_urlhttps://ingress.perfbase.cloudReceiver base URL
sample_rate0.1Sampling rate from 0.0 to 1.0
profile_http_status_codes[...range(200, 299), ...range(500, 599)]HTTP response codes that should be submitted
timeout10Submission timeout in seconds
proxynullOptional outbound proxy
flagsFeatureFlags::DefaultFlagsPerfbase extension feature flags
environmentproductionTrace environment tag
app_version''Application version tag

profile_http_status_codes is configured in CakePHP config rather than an environment variable. The default [...range(200, 299), ...range(500, 599)] submits successful responses and server errors, while dropping common noisy client responses such as 404. Add codes like 404 if you want to keep them.

Runtime config

If you want to override settings programmatically, do it before the plugin uses the config:

useCake\Core\Configure;
Configure::write('Perfbase', [
'enabled' => true,
'api_key' => env('PERFBASE_API_KEY'),
'sample_rate' => 1.0,
]);

Feature flags

The plugin passes feature flags straight through to the Perfbase extension via the shared SDK.

Examples:

usePerfbase\SDK\FeatureFlags;
'flags' => FeatureFlags::DefaultFlags;
'flags' => FeatureFlags::AllFlags;
'flags' => FeatureFlags::TrackCpuTime | FeatureFlags::TrackPdo;

Common flags:

  • UseCoarseClock
  • TrackCpuTime
  • TrackMemoryAllocation
  • TrackPdo
  • TrackHttp
  • TrackCaches
  • TrackMongodb
  • TrackElasticsearch
  • TrackQueues
  • TrackAwsSdk
  • TrackFileOperations
  • TrackFileCompilation
  • TrackFileDefinitions
  • TrackExceptions

Filters

The package supports include and exclude filters for http and console contexts.

return [
'Perfbase' => [
'include' => [
'http' => ['GET /users/*', 'POST /checkout'],
'console' => ['migrations:*', 'cache clear*'],
],
'exclude' => [
'http' => ['GET /health*', '/metrics'],
'console' => ['debug:*'],
],
],
];

Supported pattern styles:

  • * or .* to match all
  • glob patterns such as GET /admin/*
  • regular expressions such as /^POST \/checkout/

The HTTP lifecycle matches against normalized identifiers, not just the raw URL. It prefers route-derived action names and falls back to stable controller/action or path identifiers when needed.

How it behaves

HTTP requests

HTTP profiling is provided by PerfbaseMiddleware. The middleware guarantees lifecycle cleanup with try/finally and attaches response or exception data before submission.

By default, only responses with a status code in profile_http_status_codes are submitted. The shipped default is [...range(200, 299), ...range(500, 599)].

Recorded attributes include:

  • source=http
  • action
  • http_method
  • http_url
  • http_status_code
  • user_ip
  • user_agent
  • user_id when the request identity attribute exposes a scalar identifier
  • environment
  • app_version
  • hostname
  • php_version

Span names follow the format http.{METHOD}.{identifier}.

http_url is recorded without the query string. This is deliberate so tokens, emails, and other sensitive query parameters are not shipped as trace metadata.

CakePHP 5 console commands

CakePHP 5 command profiling is automatic once the plugin is loaded. The plugin registers Cake5ConsoleListener with the global event manager and tracks active command lifecycles by command object hash so repeated or nested commands do not collide.

Recorded attributes include:

  • source=console
  • action
  • exit_code
  • exception when present
  • environment
  • app_version
  • hostname
  • php_version

Span names follow the format console.{command-name}.

CakePHP 4 console commands

CakePHP 4 does not expose the same global command lifecycle events as CakePHP 5. Command profiling is therefore opt-in. Extend ProfiledCommand:

namespaceApp\Command;
useCake\Console\Arguments;
useCake\Console\ConsoleIo;
usePerfbase\CakePHP\Command\ProfiledCommand;
class ExampleCommand extends ProfiledCommand
{
publicfunctionexecute(Arguments$args, ConsoleIo$io)
{
$io->out('Perfbase command profiling is active.');
returnstatic::CODE_SUCCESS;
}
}

Failure behavior

This package is designed to fail open:

  • if the extension is unavailable, profiling is skipped
  • if Perfbase submission fails, the host application continues
  • if debug is true, profiling exceptions are rethrown to make failures visible during development

The adapter does not implement its own buffering or retry layer. Submission is delegated to the shared SDK.

Example production setup

For a low-overhead production baseline:

<?phpusePerfbase\SDK\FeatureFlags;
return [
'Perfbase' => [
'enabled' => true,
'api_key' => env('PERFBASE_API_KEY'),
'sample_rate' => 0.02,
'timeout' => 5,
'flags' => FeatureFlags::UseCoarseClock | FeatureFlags::TrackCpuTime | FeatureFlags::TrackPdo,
'environment' => env('APP_ENV', 'production'),
'app_version' => env('APP_VERSION', ''),
'exclude' => [
'http' => ['GET /health*', '/metrics'],
],
],
];

That gives you a useful production trace stream with conservative overhead.

Troubleshooting

The extension is unavailable

Check that the extension is loaded:

php -m | grep perfbase
php --ini

If needed, reinstall it:

bash -c "$(curl -fsSL https://cdn.perfbase.com/install.sh)"

Restart any long-lived PHP workers afterwards.

No traces are appearing

Check these first:

  • the plugin is loaded
  • profiling is enabled
  • the API key is present
  • the extension is loaded
  • the current request or command is allowed by your filters
  • the sample rate is not set too low

Overhead is higher than expected

To reduce overhead:

  • lower sample_rate
  • use UseCoarseClock
  • disable feature flags you do not need
  • narrow include filters or widen excludes

Development

Useful commands:

composer install
composer run phpstan
composer run test
composer run lint

The package currently has full PHPUnit coverage and a clean PHPStan pass against the checked-in source.

Documentation

Full documentation is available at perfbase.com/docs.

License

Apache-2.0. See LICENSE.txt.

About

CakePHP integration for Perfbase - the PHP profiling service that helps you understand and optimize your application's performance.

Topics

Resources

Stars

1 star

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Auto-enable theater mode on YouTube (function() { function tryTheater() { var btn = document.querySelector('button[aria-label="Theater mode"], ytd-player #player button[title="Theater mode"]'); if (btn && !btn.classList.contains('activated')) { btn.click(); } } // Try immediately tryTheater(); // Try after navigation (SPA) var lastUrl = location.href; setInterval(function() { if (location.href !== lastUrl) { lastUrl = location.href; setTimeout(tryTheater, 500); } }, 1000); // Also try on player load var observer = new MutationObserver(tryTheater); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' GitHub - perfbaseorg/cakephp: CakePHP integration for Perfbase - the PHP profiling service that helps you understand and optimize your application's performance. · GitHub
Skip to content

Repository files navigation

Perfbase

Perfbase for CakePHP

CakePHP integration for Perfbase.

Packagist VersionLicenseCIPHP VersionCakePHP Version

This package is a thin adapter over perfbase/php-sdk. It wires CakePHP HTTP requests and command lifecycles into the shared SDK and leaves transport, payload construction, extension handling, and submission to perfbase/php-sdk.

What it profiles

  • HTTP requests on CakePHP 4.4+ and 5.x
  • CakePHP 5 console commands through command lifecycle events
  • CakePHP 4 console commands when they extend ProfiledCommand

Out of scope in v1:

  • Queue profiling
  • Custom buffering, retry, or transport logic

Requirements

  • PHP 7.4 to 8.5
  • CakePHP ^4.4 || ^5.0
  • ext-json
  • perfbase/php-sdk ^1.0
  • The native Perfbase PHP extension in the host runtime if you want traces to be collected

The package fails open when the extension is unavailable. Your CakePHP application keeps running, but no Perfbase trace data is collected until the extension is installed and loaded.

If your application wants manual custom spans outside the automatic HTTP and console integration, depend on and use perfbase/php-sdk directly. This package does not add a separate Cake-specific manual tracing API.

Installation

Install the package from Packagist:

composer require perfbase/cakephp:^1.0

Install the Perfbase PHP extension if it is not already available:

bash -c "$(curl -fsSL https://cdn.perfbase.com/install.sh)"

Restart PHP-FPM, RoadRunner workers, Swoole workers, or your web server after installing the extension.

Load the plugin in your application:

useCake\Http\BaseApplication;
usePerfbase\CakePHP\PerfbasePlugin;
class Application extends BaseApplication
{
publicfunctionbootstrap(): void
{
parent::bootstrap();
$this->addPlugin(PerfbasePlugin::class);
}
}

Once the plugin is loaded:

  • HTTP profiling is enabled automatically through plugin middleware
  • CakePHP 5 command profiling is enabled automatically through command events
  • CakePHP 4 command profiling is available by extending ProfiledCommand

CakePHP 4 does not get automatic command profiling. That path is CakePHP 5 only.

Quick start

Create config/perfbase.php in your application:

<?phpusePerfbase\SDK\FeatureFlags;
return [
'Perfbase' => [
'enabled' => true,
'api_key' => env('PERFBASE_API_KEY'),
'sample_rate' => 0.1,
'profile_http_status_codes' => [...range(200, 299), ...range(500, 599)],
'flags' => FeatureFlags::DefaultFlags,
'environment' => env('APP_ENV', 'production'),
'app_version' => env('APP_VERSION', ''),
],
];

Set your API key in the environment:

export PERFBASE_API_KEY=your-api-key-here

Start with a sample rate like 0.1 or lower in production, then tune based on traffic and overhead.

Configuration model

The plugin ships defaults in config/perfbase.php.

Configuration is resolved in this order:

  1. Package defaults
  2. Application config/perfbase.php if present
  3. Existing Configure::write('Perfbase', ...) values

That means explicit runtime configuration wins over file-based configuration.

Supported configuration

return [
'Perfbase' => [
'enabled' => false,
'debug' => false,
'log_errors' => true,
'api_key' => null,
'api_url' => 'https://ingress.perfbase.cloud',
'sample_rate' => 0.1,
'profile_http_status_codes' => [...range(200, 299), ...range(500, 599)],
'timeout' => 10,
'proxy' => null,
'flags' => \Perfbase\SDK\FeatureFlags::DefaultFlags,
'environment' => 'production',
'app_version' => '',
'include' => [
'http' => ['*'],
'console' => ['*'],
],
'exclude' => [
'http' => [],
'console' => [],
],
],
];

Core settings

SettingDefaultPurpose
enabledfalseGlobal on/off switch
debugfalseRe-throw profiling failures instead of failing open
log_errorstrueLog profiling failures when debug is off
api_keynullPerfbase API key
api_urlhttps://ingress.perfbase.cloudReceiver base URL
sample_rate0.1Sampling rate from 0.0 to 1.0
profile_http_status_codes[...range(200, 299), ...range(500, 599)]HTTP response codes that should be submitted
timeout10Submission timeout in seconds
proxynullOptional outbound proxy
flagsFeatureFlags::DefaultFlagsPerfbase extension feature flags
environmentproductionTrace environment tag
app_version''Application version tag

profile_http_status_codes is configured in CakePHP config rather than an environment variable. The default [...range(200, 299), ...range(500, 599)] submits successful responses and server errors, while dropping common noisy client responses such as 404. Add codes like 404 if you want to keep them.

Runtime config

If you want to override settings programmatically, do it before the plugin uses the config:

useCake\Core\Configure;
Configure::write('Perfbase', [
'enabled' => true,
'api_key' => env('PERFBASE_API_KEY'),
'sample_rate' => 1.0,
]);

Feature flags

The plugin passes feature flags straight through to the Perfbase extension via the shared SDK.

Examples:

usePerfbase\SDK\FeatureFlags;
'flags' => FeatureFlags::DefaultFlags;
'flags' => FeatureFlags::AllFlags;
'flags' => FeatureFlags::TrackCpuTime | FeatureFlags::TrackPdo;

Common flags:

  • UseCoarseClock
  • TrackCpuTime
  • TrackMemoryAllocation
  • TrackPdo
  • TrackHttp
  • TrackCaches
  • TrackMongodb
  • TrackElasticsearch
  • TrackQueues
  • TrackAwsSdk
  • TrackFileOperations
  • TrackFileCompilation
  • TrackFileDefinitions
  • TrackExceptions

Filters

The package supports include and exclude filters for http and console contexts.

return [
'Perfbase' => [
'include' => [
'http' => ['GET /users/*', 'POST /checkout'],
'console' => ['migrations:*', 'cache clear*'],
],
'exclude' => [
'http' => ['GET /health*', '/metrics'],
'console' => ['debug:*'],
],
],
];

Supported pattern styles:

  • * or .* to match all
  • glob patterns such as GET /admin/*
  • regular expressions such as /^POST \/checkout/

The HTTP lifecycle matches against normalized identifiers, not just the raw URL. It prefers route-derived action names and falls back to stable controller/action or path identifiers when needed.

How it behaves

HTTP requests

HTTP profiling is provided by PerfbaseMiddleware. The middleware guarantees lifecycle cleanup with try/finally and attaches response or exception data before submission.

By default, only responses with a status code in profile_http_status_codes are submitted. The shipped default is [...range(200, 299), ...range(500, 599)].

Recorded attributes include:

  • source=http
  • action
  • http_method
  • http_url
  • http_status_code
  • user_ip
  • user_agent
  • user_id when the request identity attribute exposes a scalar identifier
  • environment
  • app_version
  • hostname
  • php_version

Span names follow the format http.{METHOD}.{identifier}.

http_url is recorded without the query string. This is deliberate so tokens, emails, and other sensitive query parameters are not shipped as trace metadata.

CakePHP 5 console commands

CakePHP 5 command profiling is automatic once the plugin is loaded. The plugin registers Cake5ConsoleListener with the global event manager and tracks active command lifecycles by command object hash so repeated or nested commands do not collide.

Recorded attributes include:

  • source=console
  • action
  • exit_code
  • exception when present
  • environment
  • app_version
  • hostname
  • php_version

Span names follow the format console.{command-name}.

CakePHP 4 console commands

CakePHP 4 does not expose the same global command lifecycle events as CakePHP 5. Command profiling is therefore opt-in. Extend ProfiledCommand:

namespaceApp\Command;
useCake\Console\Arguments;
useCake\Console\ConsoleIo;
usePerfbase\CakePHP\Command\ProfiledCommand;
class ExampleCommand extends ProfiledCommand
{
publicfunctionexecute(Arguments$args, ConsoleIo$io)
{
$io->out('Perfbase command profiling is active.');
returnstatic::CODE_SUCCESS;
}
}

Failure behavior

This package is designed to fail open:

  • if the extension is unavailable, profiling is skipped
  • if Perfbase submission fails, the host application continues
  • if debug is true, profiling exceptions are rethrown to make failures visible during development

The adapter does not implement its own buffering or retry layer. Submission is delegated to the shared SDK.

Example production setup

For a low-overhead production baseline:

<?phpusePerfbase\SDK\FeatureFlags;
return [
'Perfbase' => [
'enabled' => true,
'api_key' => env('PERFBASE_API_KEY'),
'sample_rate' => 0.02,
'timeout' => 5,
'flags' => FeatureFlags::UseCoarseClock | FeatureFlags::TrackCpuTime | FeatureFlags::TrackPdo,
'environment' => env('APP_ENV', 'production'),
'app_version' => env('APP_VERSION', ''),
'exclude' => [
'http' => ['GET /health*', '/metrics'],
],
],
];

That gives you a useful production trace stream with conservative overhead.

Troubleshooting

The extension is unavailable

Check that the extension is loaded:

php -m | grep perfbase
php --ini

If needed, reinstall it:

bash -c "$(curl -fsSL https://cdn.perfbase.com/install.sh)"

Restart any long-lived PHP workers afterwards.

No traces are appearing

Check these first:

  • the plugin is loaded
  • profiling is enabled
  • the API key is present
  • the extension is loaded
  • the current request or command is allowed by your filters
  • the sample rate is not set too low

Overhead is higher than expected

To reduce overhead:

  • lower sample_rate
  • use UseCoarseClock
  • disable feature flags you do not need
  • narrow include filters or widen excludes

Development

Useful commands:

composer install
composer run phpstan
composer run test
composer run lint

The package currently has full PHPUnit coverage and a clean PHPStan pass against the checked-in source.

Documentation

Full documentation is available at perfbase.com/docs.

License

Apache-2.0. See LICENSE.txt.

About

CakePHP integration for Perfbase - the PHP profiling service that helps you understand and optimize your application's performance.

Topics

Resources

Stars

1 star

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Remove or un-stick sticky/fixed headers that block content (function() { function unstick() { document.querySelectorAll('header, nav, [role="banner"], .header, .navbar, .sticky, .fixed-top, [style*="position: fixed"], [style*="position:sticky"]').forEach(function(el) { if (el.style.position === 'fixed' || el.style.position === 'sticky' || getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') { el.style.position = 'static'; el.style.top = 'auto'; el.style.zIndex = 'auto'; } }); } unstick(); var observer = new MutationObserver(unstick); observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] }); })(); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' GitHub - perfbaseorg/cakephp: CakePHP integration for Perfbase - the PHP profiling service that helps you understand and optimize your application's performance. · GitHub
Skip to content

Repository files navigation

Perfbase

Perfbase for CakePHP

CakePHP integration for Perfbase.

Packagist VersionLicenseCIPHP VersionCakePHP Version

This package is a thin adapter over perfbase/php-sdk. It wires CakePHP HTTP requests and command lifecycles into the shared SDK and leaves transport, payload construction, extension handling, and submission to perfbase/php-sdk.

What it profiles

  • HTTP requests on CakePHP 4.4+ and 5.x
  • CakePHP 5 console commands through command lifecycle events
  • CakePHP 4 console commands when they extend ProfiledCommand

Out of scope in v1:

  • Queue profiling
  • Custom buffering, retry, or transport logic

Requirements

  • PHP 7.4 to 8.5
  • CakePHP ^4.4 || ^5.0
  • ext-json
  • perfbase/php-sdk ^1.0
  • The native Perfbase PHP extension in the host runtime if you want traces to be collected

The package fails open when the extension is unavailable. Your CakePHP application keeps running, but no Perfbase trace data is collected until the extension is installed and loaded.

If your application wants manual custom spans outside the automatic HTTP and console integration, depend on and use perfbase/php-sdk directly. This package does not add a separate Cake-specific manual tracing API.

Installation

Install the package from Packagist:

composer require perfbase/cakephp:^1.0

Install the Perfbase PHP extension if it is not already available:

bash -c "$(curl -fsSL https://cdn.perfbase.com/install.sh)"

Restart PHP-FPM, RoadRunner workers, Swoole workers, or your web server after installing the extension.

Load the plugin in your application:

useCake\Http\BaseApplication;
usePerfbase\CakePHP\PerfbasePlugin;
class Application extends BaseApplication
{
publicfunctionbootstrap(): void
{
parent::bootstrap();
$this->addPlugin(PerfbasePlugin::class);
}
}

Once the plugin is loaded:

  • HTTP profiling is enabled automatically through plugin middleware
  • CakePHP 5 command profiling is enabled automatically through command events
  • CakePHP 4 command profiling is available by extending ProfiledCommand

CakePHP 4 does not get automatic command profiling. That path is CakePHP 5 only.

Quick start

Create config/perfbase.php in your application:

<?phpusePerfbase\SDK\FeatureFlags;
return [
'Perfbase' => [
'enabled' => true,
'api_key' => env('PERFBASE_API_KEY'),
'sample_rate' => 0.1,
'profile_http_status_codes' => [...range(200, 299), ...range(500, 599)],
'flags' => FeatureFlags::DefaultFlags,
'environment' => env('APP_ENV', 'production'),
'app_version' => env('APP_VERSION', ''),
],
];

Set your API key in the environment:

export PERFBASE_API_KEY=your-api-key-here

Start with a sample rate like 0.1 or lower in production, then tune based on traffic and overhead.

Configuration model

The plugin ships defaults in config/perfbase.php.

Configuration is resolved in this order:

  1. Package defaults
  2. Application config/perfbase.php if present
  3. Existing Configure::write('Perfbase', ...) values

That means explicit runtime configuration wins over file-based configuration.

Supported configuration

return [
'Perfbase' => [
'enabled' => false,
'debug' => false,
'log_errors' => true,
'api_key' => null,
'api_url' => 'https://ingress.perfbase.cloud',
'sample_rate' => 0.1,
'profile_http_status_codes' => [...range(200, 299), ...range(500, 599)],
'timeout' => 10,
'proxy' => null,
'flags' => \Perfbase\SDK\FeatureFlags::DefaultFlags,
'environment' => 'production',
'app_version' => '',
'include' => [
'http' => ['*'],
'console' => ['*'],
],
'exclude' => [
'http' => [],
'console' => [],
],
],
];

Core settings

SettingDefaultPurpose
enabledfalseGlobal on/off switch
debugfalseRe-throw profiling failures instead of failing open
log_errorstrueLog profiling failures when debug is off
api_keynullPerfbase API key
api_urlhttps://ingress.perfbase.cloudReceiver base URL
sample_rate0.1Sampling rate from 0.0 to 1.0
profile_http_status_codes[...range(200, 299), ...range(500, 599)]HTTP response codes that should be submitted
timeout10Submission timeout in seconds
proxynullOptional outbound proxy
flagsFeatureFlags::DefaultFlagsPerfbase extension feature flags
environmentproductionTrace environment tag
app_version''Application version tag

profile_http_status_codes is configured in CakePHP config rather than an environment variable. The default [...range(200, 299), ...range(500, 599)] submits successful responses and server errors, while dropping common noisy client responses such as 404. Add codes like 404 if you want to keep them.

Runtime config

If you want to override settings programmatically, do it before the plugin uses the config:

useCake\Core\Configure;
Configure::write('Perfbase', [
'enabled' => true,
'api_key' => env('PERFBASE_API_KEY'),
'sample_rate' => 1.0,
]);

Feature flags

The plugin passes feature flags straight through to the Perfbase extension via the shared SDK.

Examples:

usePerfbase\SDK\FeatureFlags;
'flags' => FeatureFlags::DefaultFlags;
'flags' => FeatureFlags::AllFlags;
'flags' => FeatureFlags::TrackCpuTime | FeatureFlags::TrackPdo;

Common flags:

  • UseCoarseClock
  • TrackCpuTime
  • TrackMemoryAllocation
  • TrackPdo
  • TrackHttp
  • TrackCaches
  • TrackMongodb
  • TrackElasticsearch
  • TrackQueues
  • TrackAwsSdk
  • TrackFileOperations
  • TrackFileCompilation
  • TrackFileDefinitions
  • TrackExceptions

Filters

The package supports include and exclude filters for http and console contexts.

return [
'Perfbase' => [
'include' => [
'http' => ['GET /users/*', 'POST /checkout'],
'console' => ['migrations:*', 'cache clear*'],
],
'exclude' => [
'http' => ['GET /health*', '/metrics'],
'console' => ['debug:*'],
],
],
];

Supported pattern styles:

  • * or .* to match all
  • glob patterns such as GET /admin/*
  • regular expressions such as /^POST \/checkout/

The HTTP lifecycle matches against normalized identifiers, not just the raw URL. It prefers route-derived action names and falls back to stable controller/action or path identifiers when needed.

How it behaves

HTTP requests

HTTP profiling is provided by PerfbaseMiddleware. The middleware guarantees lifecycle cleanup with try/finally and attaches response or exception data before submission.

By default, only responses with a status code in profile_http_status_codes are submitted. The shipped default is [...range(200, 299), ...range(500, 599)].

Recorded attributes include:

  • source=http
  • action
  • http_method
  • http_url
  • http_status_code
  • user_ip
  • user_agent
  • user_id when the request identity attribute exposes a scalar identifier
  • environment
  • app_version
  • hostname
  • php_version

Span names follow the format http.{METHOD}.{identifier}.

http_url is recorded without the query string. This is deliberate so tokens, emails, and other sensitive query parameters are not shipped as trace metadata.

CakePHP 5 console commands

CakePHP 5 command profiling is automatic once the plugin is loaded. The plugin registers Cake5ConsoleListener with the global event manager and tracks active command lifecycles by command object hash so repeated or nested commands do not collide.

Recorded attributes include:

  • source=console
  • action
  • exit_code
  • exception when present
  • environment
  • app_version
  • hostname
  • php_version

Span names follow the format console.{command-name}.

CakePHP 4 console commands

CakePHP 4 does not expose the same global command lifecycle events as CakePHP 5. Command profiling is therefore opt-in. Extend ProfiledCommand:

namespaceApp\Command;
useCake\Console\Arguments;
useCake\Console\ConsoleIo;
usePerfbase\CakePHP\Command\ProfiledCommand;
class ExampleCommand extends ProfiledCommand
{
publicfunctionexecute(Arguments$args, ConsoleIo$io)
{
$io->out('Perfbase command profiling is active.');
returnstatic::CODE_SUCCESS;
}
}

Failure behavior

This package is designed to fail open:

  • if the extension is unavailable, profiling is skipped
  • if Perfbase submission fails, the host application continues
  • if debug is true, profiling exceptions are rethrown to make failures visible during development

The adapter does not implement its own buffering or retry layer. Submission is delegated to the shared SDK.

Example production setup

For a low-overhead production baseline:

<?phpusePerfbase\SDK\FeatureFlags;
return [
'Perfbase' => [
'enabled' => true,
'api_key' => env('PERFBASE_API_KEY'),
'sample_rate' => 0.02,
'timeout' => 5,
'flags' => FeatureFlags::UseCoarseClock | FeatureFlags::TrackCpuTime | FeatureFlags::TrackPdo,
'environment' => env('APP_ENV', 'production'),
'app_version' => env('APP_VERSION', ''),
'exclude' => [
'http' => ['GET /health*', '/metrics'],
],
],
];

That gives you a useful production trace stream with conservative overhead.

Troubleshooting

The extension is unavailable

Check that the extension is loaded:

php -m | grep perfbase
php --ini

If needed, reinstall it:

bash -c "$(curl -fsSL https://cdn.perfbase.com/install.sh)"

Restart any long-lived PHP workers afterwards.

No traces are appearing

Check these first:

  • the plugin is loaded
  • profiling is enabled
  • the API key is present
  • the extension is loaded
  • the current request or command is allowed by your filters
  • the sample rate is not set too low

Overhead is higher than expected

To reduce overhead:

  • lower sample_rate
  • use UseCoarseClock
  • disable feature flags you do not need
  • narrow include filters or widen excludes

Development

Useful commands:

composer install
composer run phpstan
composer run test
composer run lint

The package currently has full PHPUnit coverage and a clean PHPStan pass against the checked-in source.

Documentation

Full documentation is available at perfbase.com/docs.

License

Apache-2.0. See LICENSE.txt.

About

CakePHP integration for Perfbase - the PHP profiling service that helps you understand and optimize your application's performance.

Topics

Resources

Stars

1 star

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Universal Dark Mode - works on any site (function() { var enabled = true; function applyDarkMode() { if (!enabled) return; // Create style element if it doesn't exist var style = document.getElementById('universal-dark-mode-style'); if (!style) { style = document.createElement('style'); style.id = 'universal-dark-mode-style'; document.head.appendChild(style); } // Dark mode CSS - inverts colors but preserves images/video style.textContent = ' /* Invert everything except media */ html { filter: invert(1) hue-rotate(180deg) !important; background: #1a1a2e !important; } /* Restore images, videos, iframes, canvas */ img, video, iframe, canvas, svg, picture, [style*="background-image"] { filter: invert(1) hue-rotate(180deg) !important; } /* Preserve specific elements that should not be inverted */ .no-dark-mode, .no-dark-mode *, [data-theme="light"], [data-theme="light"], .ace_editor, .ace_editor *, .CodeMirror, .CodeMirror *, .monaco-editor, .monaco-editor *, .markdown-body pre, .markdown-body pre *, .highlight, .highlight *, pre code, pre code * { filter: none !important; } /* Fix common UI elements */ .modal, .popup, .dropdown-menu, .tooltip, .popover { filter: invert(1) hue-rotate(180deg) !important; background: #2d2d44 !important; border-color: #444 !important; } /* Scrollbars */ ::-webkit-scrollbar { background: #1a1a2e !important; } ::-webkit-scrollbar-thumb { background: #444 !important; } ::-webkit-scrollbar-thumb:hover { background: #555 !important; } /* Selection */ ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; } ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; } '; } function removeDarkMode() { var style = document.getElementById('universal-dark-mode-style'); if (style) style.remove(); } // Toggle with Alt+Shift+D document.addEventListener('keydown', function(e) { if (e.altKey && e.shiftKey && e.key === 'D') { e.preventDefault(); enabled = !enabled; if (enabled) { applyDarkMode(); console.log('[Universal Dark Mode] Enabled'); } else { removeDarkMode(); console.log('[Universal Dark Mode] Disabled'); } } }); // Apply on load applyDarkMode(); // Re-apply on dynamic content var observer = new MutationObserver(function(mutations) { if (enabled && !document.getElementById('universal-dark-mode-style')) { applyDarkMode(); } }); observer.observe(document.head, { childList: true }); console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle'); })(); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })(); GitHub - perfbaseorg/cakephp: CakePHP integration for Perfbase - the PHP profiling service that helps you understand and optimize your application's performance. · GitHub
Skip to content

Repository files navigation

Perfbase

Perfbase for CakePHP

CakePHP integration for Perfbase.

Packagist VersionLicenseCIPHP VersionCakePHP Version

This package is a thin adapter over perfbase/php-sdk. It wires CakePHP HTTP requests and command lifecycles into the shared SDK and leaves transport, payload construction, extension handling, and submission to perfbase/php-sdk.

What it profiles

  • HTTP requests on CakePHP 4.4+ and 5.x
  • CakePHP 5 console commands through command lifecycle events
  • CakePHP 4 console commands when they extend ProfiledCommand

Out of scope in v1:

  • Queue profiling
  • Custom buffering, retry, or transport logic

Requirements

  • PHP 7.4 to 8.5
  • CakePHP ^4.4 || ^5.0
  • ext-json
  • perfbase/php-sdk ^1.0
  • The native Perfbase PHP extension in the host runtime if you want traces to be collected

The package fails open when the extension is unavailable. Your CakePHP application keeps running, but no Perfbase trace data is collected until the extension is installed and loaded.

If your application wants manual custom spans outside the automatic HTTP and console integration, depend on and use perfbase/php-sdk directly. This package does not add a separate Cake-specific manual tracing API.

Installation

Install the package from Packagist:

composer require perfbase/cakephp:^1.0

Install the Perfbase PHP extension if it is not already available:

bash -c "$(curl -fsSL https://cdn.perfbase.com/install.sh)"

Restart PHP-FPM, RoadRunner workers, Swoole workers, or your web server after installing the extension.

Load the plugin in your application:

useCake\Http\BaseApplication;
usePerfbase\CakePHP\PerfbasePlugin;
class Application extends BaseApplication
{
publicfunctionbootstrap(): void
{
parent::bootstrap();
$this->addPlugin(PerfbasePlugin::class);
}
}

Once the plugin is loaded:

  • HTTP profiling is enabled automatically through plugin middleware
  • CakePHP 5 command profiling is enabled automatically through command events
  • CakePHP 4 command profiling is available by extending ProfiledCommand

CakePHP 4 does not get automatic command profiling. That path is CakePHP 5 only.

Quick start

Create config/perfbase.php in your application:

<?phpusePerfbase\SDK\FeatureFlags;
return [
'Perfbase' => [
'enabled' => true,
'api_key' => env('PERFBASE_API_KEY'),
'sample_rate' => 0.1,
'profile_http_status_codes' => [...range(200, 299), ...range(500, 599)],
'flags' => FeatureFlags::DefaultFlags,
'environment' => env('APP_ENV', 'production'),
'app_version' => env('APP_VERSION', ''),
],
];

Set your API key in the environment:

export PERFBASE_API_KEY=your-api-key-here

Start with a sample rate like 0.1 or lower in production, then tune based on traffic and overhead.

Configuration model

The plugin ships defaults in config/perfbase.php.

Configuration is resolved in this order:

  1. Package defaults
  2. Application config/perfbase.php if present
  3. Existing Configure::write('Perfbase', ...) values

That means explicit runtime configuration wins over file-based configuration.

Supported configuration

return [
'Perfbase' => [
'enabled' => false,
'debug' => false,
'log_errors' => true,
'api_key' => null,
'api_url' => 'https://ingress.perfbase.cloud',
'sample_rate' => 0.1,
'profile_http_status_codes' => [...range(200, 299), ...range(500, 599)],
'timeout' => 10,
'proxy' => null,
'flags' => \Perfbase\SDK\FeatureFlags::DefaultFlags,
'environment' => 'production',
'app_version' => '',
'include' => [
'http' => ['*'],
'console' => ['*'],
],
'exclude' => [
'http' => [],
'console' => [],
],
],
];

Core settings

SettingDefaultPurpose
enabledfalseGlobal on/off switch
debugfalseRe-throw profiling failures instead of failing open
log_errorstrueLog profiling failures when debug is off
api_keynullPerfbase API key
api_urlhttps://ingress.perfbase.cloudReceiver base URL
sample_rate0.1Sampling rate from 0.0 to 1.0
profile_http_status_codes[...range(200, 299), ...range(500, 599)]HTTP response codes that should be submitted
timeout10Submission timeout in seconds
proxynullOptional outbound proxy
flagsFeatureFlags::DefaultFlagsPerfbase extension feature flags
environmentproductionTrace environment tag
app_version''Application version tag

profile_http_status_codes is configured in CakePHP config rather than an environment variable. The default [...range(200, 299), ...range(500, 599)] submits successful responses and server errors, while dropping common noisy client responses such as 404. Add codes like 404 if you want to keep them.

Runtime config

If you want to override settings programmatically, do it before the plugin uses the config:

useCake\Core\Configure;
Configure::write('Perfbase', [
'enabled' => true,
'api_key' => env('PERFBASE_API_KEY'),
'sample_rate' => 1.0,
]);

Feature flags

The plugin passes feature flags straight through to the Perfbase extension via the shared SDK.

Examples:

usePerfbase\SDK\FeatureFlags;
'flags' => FeatureFlags::DefaultFlags;
'flags' => FeatureFlags::AllFlags;
'flags' => FeatureFlags::TrackCpuTime | FeatureFlags::TrackPdo;

Common flags:

  • UseCoarseClock
  • TrackCpuTime
  • TrackMemoryAllocation
  • TrackPdo
  • TrackHttp
  • TrackCaches
  • TrackMongodb
  • TrackElasticsearch
  • TrackQueues
  • TrackAwsSdk
  • TrackFileOperations
  • TrackFileCompilation
  • TrackFileDefinitions
  • TrackExceptions

Filters

The package supports include and exclude filters for http and console contexts.

return [
'Perfbase' => [
'include' => [
'http' => ['GET /users/*', 'POST /checkout'],
'console' => ['migrations:*', 'cache clear*'],
],
'exclude' => [
'http' => ['GET /health*', '/metrics'],
'console' => ['debug:*'],
],
],
];

Supported pattern styles:

  • * or .* to match all
  • glob patterns such as GET /admin/*
  • regular expressions such as /^POST \/checkout/

The HTTP lifecycle matches against normalized identifiers, not just the raw URL. It prefers route-derived action names and falls back to stable controller/action or path identifiers when needed.

How it behaves

HTTP requests

HTTP profiling is provided by PerfbaseMiddleware. The middleware guarantees lifecycle cleanup with try/finally and attaches response or exception data before submission.

By default, only responses with a status code in profile_http_status_codes are submitted. The shipped default is [...range(200, 299), ...range(500, 599)].

Recorded attributes include:

  • source=http
  • action
  • http_method
  • http_url
  • http_status_code
  • user_ip
  • user_agent
  • user_id when the request identity attribute exposes a scalar identifier
  • environment
  • app_version
  • hostname
  • php_version

Span names follow the format http.{METHOD}.{identifier}.

http_url is recorded without the query string. This is deliberate so tokens, emails, and other sensitive query parameters are not shipped as trace metadata.

CakePHP 5 console commands

CakePHP 5 command profiling is automatic once the plugin is loaded. The plugin registers Cake5ConsoleListener with the global event manager and tracks active command lifecycles by command object hash so repeated or nested commands do not collide.

Recorded attributes include:

  • source=console
  • action
  • exit_code
  • exception when present
  • environment
  • app_version
  • hostname
  • php_version

Span names follow the format console.{command-name}.

CakePHP 4 console commands

CakePHP 4 does not expose the same global command lifecycle events as CakePHP 5. Command profiling is therefore opt-in. Extend ProfiledCommand:

namespaceApp\Command;
useCake\Console\Arguments;
useCake\Console\ConsoleIo;
usePerfbase\CakePHP\Command\ProfiledCommand;
class ExampleCommand extends ProfiledCommand
{
publicfunctionexecute(Arguments$args, ConsoleIo$io)
{
$io->out('Perfbase command profiling is active.');
returnstatic::CODE_SUCCESS;
}
}

Failure behavior

This package is designed to fail open:

  • if the extension is unavailable, profiling is skipped
  • if Perfbase submission fails, the host application continues
  • if debug is true, profiling exceptions are rethrown to make failures visible during development

The adapter does not implement its own buffering or retry layer. Submission is delegated to the shared SDK.

Example production setup

For a low-overhead production baseline:

<?phpusePerfbase\SDK\FeatureFlags;
return [
'Perfbase' => [
'enabled' => true,
'api_key' => env('PERFBASE_API_KEY'),
'sample_rate' => 0.02,
'timeout' => 5,
'flags' => FeatureFlags::UseCoarseClock | FeatureFlags::TrackCpuTime | FeatureFlags::TrackPdo,
'environment' => env('APP_ENV', 'production'),
'app_version' => env('APP_VERSION', ''),
'exclude' => [
'http' => ['GET /health*', '/metrics'],
],
],
];

That gives you a useful production trace stream with conservative overhead.

Troubleshooting

The extension is unavailable

Check that the extension is loaded:

php -m | grep perfbase
php --ini

If needed, reinstall it:

bash -c "$(curl -fsSL https://cdn.perfbase.com/install.sh)"

Restart any long-lived PHP workers afterwards.

No traces are appearing

Check these first:

  • the plugin is loaded
  • profiling is enabled
  • the API key is present
  • the extension is loaded
  • the current request or command is allowed by your filters
  • the sample rate is not set too low

Overhead is higher than expected

To reduce overhead:

  • lower sample_rate
  • use UseCoarseClock
  • disable feature flags you do not need
  • narrow include filters or widen excludes

Development

Useful commands:

composer install
composer run phpstan
composer run test
composer run lint

The package currently has full PHPUnit coverage and a clean PHPStan pass against the checked-in source.

Documentation

Full documentation is available at perfbase.com/docs.

License

Apache-2.0. See LICENSE.txt.

About

CakePHP integration for Perfbase - the PHP profiling service that helps you understand and optimize your application's performance.

Topics

Resources

Stars

1 star

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages