spiral/profiler

Spiral Xhprof Profiler

Installs: 64 438

Dependents: 1

Suggesters: 0

Security: 0

Stars: 7

Watchers: 4

Forks: 4

Open Issues: 4

Type:module

v3.2.0 2023-09-26 05:16 UTC

This package is auto-updated.

Last update: 2024-03-26 06:36:02 UTC


README

PHP Version Require Latest Stable Version phpunit psalm Codecov Total Downloads StyleCI 68747470733a2f2f696d672e736869656c64732e696f2f62616467652f646973636f72642d636861742d6d6167656e74612e737667

Requirements

Make sure that your server is configured with following PHP version and extensions:

  • PHP 8.1+
  • Spiral framework 3.0+

Installation

To install the package:

composer require spiral/profiler

After package install you need to add bootloader from the package in your application.

use Spiral\RoadRunnerBridge\Bootloader as RoadRunnerBridge;

protected const LOAD = [
    // ...
    Spiral\Profiler\ProfilerBootloader::class,
    // ...
];

Define env variables:

PROFILER_ENABLE=true
PROFILER_ENDPOINT=http://127.0.0.1:8080/api/profiler/store
PROFILER_APP_NAME="My super app"
PROFILER_MIDDLEWARE_DEFAULT_ENABLED=true

Usage

There are two ways to use profiler:

  • Profiler as a middleware
  • Profiler as an interceptor

Profiler as an interceptor

Interceptor will be useful if you want to profile some specific part of your application which supports using interceptors.

  • Controllers,
  • GRPC,
  • Queue jobs,
  • TCP
  • Events.
namespace App\Bootloader;

use App\Interceptor\CustomInterceptor;
use Spiral\Bootloader\DomainBootloader;
use Spiral\Core\CoreInterface;

class AppBootloader extends DomainBootloader
{
    protected const SINGLETONS = [
        CoreInterface::class => [self::class, 'domainCore']
    ];

    protected const INTERCEPTORS = [
        \Spiral\Profiler\ProfilerInterceptor::class
    ];
}

Read more about interceptors here.

Profiler as a middleware

To use profiler as a middleware you need to add it to your router.

Global middleware

namespace App\Bootloader;

use Spiral\Bootloader\Http\RoutesBootloader as BaseRoutesBootloader;
use Spiral\Profiler\ProfilerMiddleware;

final class RoutesBootloader extends BaseRoutesBootloader
{
    protected function globalMiddleware(): array
    {
        return [
            ProfilerMiddleware::class,  // <================
            LocaleSelector::class,
            ErrorHandlerMiddleware::class,
            JsonPayloadMiddleware::class,
            HttpCollector::class,
        ];
    }
    
    // ...
}

Route group middleware

namespace App\Bootloader;

use Spiral\Bootloader\Http\RoutesBootloader as BaseRoutesBootloader;
use Spiral\Profiler\ProfilerMiddleware;

final class RoutesBootloader extends BaseRoutesBootloader
{
    // ...

    protected function middlewareGroups(): array
    {
        return [
            'web' => [
                CookiesMiddleware::class,
                SessionMiddleware::class,
                CsrfMiddleware::class,
            ],
            'profiler' => [                  // <================
                ProfilerMiddleware::class,
                'middleware:web',
            ],
        ];
    }
    
    // ...
}

Route middleware

class HomeController implements SingletonInterface
{
    #[Route(route: '/', name: 'index.page', methods: ['GET'], middleware: 'profiler')]
    public function index(...): void 
    {
        // ...
    }
    
    #[Route(route: '/', name: 'index.page', methods: ['GET'], middleware: \Spiral\Profiler\ProfilerMiddleware::class)]
    public function index(...): void 
    {
        // ...
    }
}

Profiling strategy.

By default, middleware start profiling on every request. Н You can configure profiling to be enabled only for certain requests.

  1. Set env variable PROFILER_MIDDLEWARE_DEFAULT_ENABLED to false.
PROFILER_MIDDLEWARE_DEFAULT_ENABLED=false
  1. Pass Http header X-Spiral-Profiler-Enable=1 for request you want to profile.