Skip to content

Healthcheck ​

The plugin provides a healthcheck stack that you can use to check the status of your application and its services. It runs both from the web and from the CLI.

WebCLI
HealthcheckHealthcheck CLI

With -v in CLI you can also see all the detail information.

Configuration ​

The simplest way to configure the checks is via the Setup.Healthcheck.checks Configure key:

php
'Setup' => [
    'Healthcheck' => [
        'checks' => [
            \Setup\Healthcheck\Check\Environment\PhpVersionCheck::class,
            \Setup\Healthcheck\Check\Core\CakeVersionCheck::class,
            // ...
        ],
    ],
],

Once defined, this replaces the defaults. You can also use the Setup.Healthcheck.checks config to add your own checks.

Merging with the defaults ​

To replace only the ones you need, merge with the defaults:

php
'Setup' => [
    'Healthcheck' => [
        'checks' => [
            \Setup\Healthcheck\Check\Environment\PhpUploadLimitCheck::class => [
                'min' => 64,
            ],
            // ...
        ] + \Setup\Healthcheck\HealthcheckCollector::defaultChecks(),
    ],
],

If you need to pass config to a check, make sure the value is an array whose keys match the parameter names.

Passing instances ​

You can pass an instance of a check class instead of the class-name string when needed:

php
'Setup' => [
    'Healthcheck' => [
        'checks' => [
            new \Setup\Healthcheck\Check\Core\CakeVersionCheck(
                overrideComparisonChar: '^',
            ),
            // ...
        ],
    ],
],

Priority ​

You can set a priority (1...10) for each check to control the execution order:

php
    protected int $priority = 6;

The higher the priority (towards 1), the earlier the check runs.

Scope ​

If you want to set a specific scope, adjust the property directly or define the method. The method form is needed for a dynamic scope through a closure:

php
    /**
     * @return array<string|callable>
     */
    public function scope(): array {
        return [
            // Only run in debug mode
            function () {
                return Configure::read('debug');
            },
        ];
    }

Adjusting checks at runtime ​

To adjust an existing check at runtime, instantiate it first:

php
$check = new \Setup\Healthcheck\Check\Core\CakeVersionCheck();
$check
    ->adjustPriority(6)
    ->adjustScope([...]);

Usage ​

Access the /setup/healthcheck endpoint in your application to view the healthcheck. In debug mode you can see issues in detail; in production mode only the status is shown.

For CLI, run the command:

bash
bin/cake healthcheck

Scheduled monitoring

You can write a queue task to run the healthcheck periodically — logging the results or alerting the admins directly on errors. With the QueueScheduler plugin you can add a scheduled task for it from the backend, for example every hour.

Default checks ​

The following checks are included by default.

Environment checks ​

  • PhpVersionCheck: Validates the PHP version meets requirements.
  • PhpExtensionsCheck: Checks that required PHP extensions are loaded.
  • PhpUploadLimitCheck: Validates the upload_max_filesize setting.
  • MemoryLimitCheck: Checks that the PHP memory_limit is adequate.
  • MaxExecutionTimeCheck: Validates the max_execution_time setting.
  • MaxInputVarsCheck: Checks the max_input_vars limit.
  • TimezoneCheck: Validates the timezone configuration.
  • OpcacheEnabledCheck: Checks that OPcache is enabled in production.
  • RealpathCacheCheck: Validates the realpath cache settings.
  • XdebugDisabledCheck: Warns if Xdebug is enabled in production.
  • AssertionsCheck: Checks assertion settings for production.
  • PhpErrorDisplayCheck: Validates that display_errors is off in production.
  • ExposePhpCheck: Checks that expose_php is disabled.
  • AllowUrlIncludeCheck: Validates that allow_url_include is off.
  • DisableFunctionsCheck: Checks that dangerous functions are disabled.

Core/application checks ​

  • CakeVersionCheck: Validates the CakePHP version.
  • CakeSaltCheck: Ensures the security salt is properly configured.
  • CakeCacheCheck: Validates that cache configurations are set up.
  • FullBaseUrlCheck: Validates the App.fullBaseUrl configuration.
  • DebugModeDisabledCheck: Warns if debug mode is on in production.
  • DebugKitDisabledCheck: Checks that DebugKit is disabled in production.
  • SessionLifetimeCheck: Validates session lifetime settings.
  • SessionCleanupCheck: Checks session garbage-collection settings.
  • FilePermissionsCheck: Validates that tmp/ and logs/ are writable.
  • ComposerOptimizationCheck: Checks that the Composer autoloader is optimized.
  • SecurityHeadersCheck: Validates security-related HTTP headers.
  • CookieSecurityCheck: Checks cookie security settings (Secure, HttpOnly, SameSite).

Database checks ​

  • ConnectCheck: Validates the database connection.
  • DatabaseCharsetCheck: Checks the database charset/collation settings.

Opt-in checks ​

The following checks are available but not enabled by default, due to specific requirements or potential side effects.

Environment checks ​

  • DiskSpaceCheck: Monitors disk usage with configurable thresholds (warning at 80%, error at 95%). Not enabled by default because disk paths and thresholds are environment-specific.
php
'Setup' => [
    'Healthcheck' => [
        'checks' => [
            \Setup\Healthcheck\Check\Environment\DiskSpaceCheck::class => [],
            // Or with custom thresholds and paths:
            \Setup\Healthcheck\Check\Environment\DiskSpaceCheck::class => [
                'warningThresholdPercent' => 70,
                'errorThresholdPercent' => 90,
            ],
        ] + \Setup\Healthcheck\HealthcheckCollector::defaultChecks(),
    ],
],

Network checks ​

  • SslCertificateExpiryCheck: Checks the SSL certificate expiry for the application's host. Web-only (not available in CLI). Not enabled by default because it requires network access and may not apply to local/non-SSL environments.
php
'Setup' => [
    'Healthcheck' => [
        'checks' => [
            \Setup\Healthcheck\Check\Network\SslCertificateExpiryCheck::class => [],
            // Or with custom thresholds:
            \Setup\Healthcheck\Check\Network\SslCertificateExpiryCheck::class => [
                'warningDays' => 60,
                'errorDays' => 14,
                'host' => 'api.example.com',
            ],
        ] + \Setup\Healthcheck\HealthcheckCollector::defaultChecks(),
    ],
],

Creating custom checks ​

You can create your own checks by implementing Setup\Healthcheck\Check\CheckInterface (or extending AbstractCheck):

php
namespace App\Healthcheck\Check;

use Setup\Healthcheck\Check\AbstractCheck;
use Setup\Healthcheck\HealthcheckResult;

class MyCustomCheck extends AbstractCheck {

    public function run(): HealthcheckResult {
        // Your check logic here
        if ($everythingOk) {
            return HealthcheckResult::success('All good!');
        }

        return HealthcheckResult::error('Something is wrong');
    }

    public function name(): string {
        return 'My Custom Check';
    }

    public function domain(): string {
        return 'Application';
    }

}

Then add it to your configuration:

php
'Setup' => [
    'Healthcheck' => [
        'checks' => [
            \App\Healthcheck\Check\MyCustomCheck::class,
        ] + \Setup\Healthcheck\HealthcheckCollector::defaultChecks(),
    ],
],

See also ​

Released under the MIT License.