metrixwire / php
Zero-config APM SDK for PHP — native, Laravel, Symfony, Slim/PSR-15 & WordPress. Detects N+1 queries, slow endpoints & slow queries.
Requires
- php: >=8.1
Requires (Dev)
- doctrine/dbal: ^3.0
- illuminate/support: ^10.0 || ^11.0 || ^12.0
- psr/http-server-middleware: ^1.0
- symfony/event-dispatcher: ^6.0 || ^7.0
- symfony/http-kernel: ^6.0 || ^7.0
Suggests
- doctrine/dbal: Capture Doctrine queries via MetrixWire\Symfony\DoctrineSqlLogger (DBAL 2/3)
- psr/http-server-middleware: Auto-trace Slim/Mezzio/any PSR-15 app via MetrixWire\Psr15\MetrixWireMiddleware
- symfony/http-kernel: Auto-trace Symfony requests via MetrixWire\Symfony\MetrixWireSubscriber
Provides
None
Conflicts
None
Replaces
None
README
Zero-config APM SDK for PHP — native, Laravel, Symfony, Slim/PSR-15 and WordPress. Captures endpoint duration, database queries, transactions and uncaught exceptions, then sends them to MetrixWire at the end of the request — non-blocking, errors are silently swallowed.
Installation
composer require metrixwire/php
Add to your environment:
METRIXWIRE_KEY=mw_xxx METRIXWIRE_ENDPOINT=https://metrixwire.com
Then pick the integration for your stack — each one is automatic once wired.
Laravel
Nothing to do. Thanks to package auto-discovery, the service provider activates immediately: it installs a DB::listen hook, transaction tracking, queue-job tracing, and a global middleware that opens/closes a trace per request.
Symfony
Register the subscriber as a service (autoconfigure tags it automatically):
# config/services.yaml MetrixWire\Symfony\MetrixWireSubscriber: ~
For Doctrine query capture (DBAL 2/3):
$config->setSQLLogger(new \MetrixWire\Symfony\DoctrineSqlLogger());
On DBAL 4 (which removed SQLLogger), use the drop-in PDO below instead.
Slim / Mezzio / any PSR-15
Add the middleware as the outermost layer:
$app->add(new \MetrixWire\Psr15\MetrixWireMiddleware());
WordPress
Two options, same underlying SDK:
-
Installable plugin (recommended) —
wordpress-plugin/metrixwire-apm/is a standalone plugin with no Composer dependency (the SDK core is vendored in). Upload themetrixwire-apmfolder towp-content/plugins/, activate it, then configure the API key and endpoint under Settings → MetrixWire (includes a "Test Connection" check). Seewordpress-plugin/metrixwire-apm/readme.txt. -
Must-use plugin — for the earliest possible trace start (before regular plugins load) or when you already manage the SDK via Composer, copy
wordpress/metrixwire.phpintowp-content/mu-plugins/and set inwp-config.php:define('METRIXWIRE_KEY', 'mw_xxx'); define('METRIXWIRE_ENDPOINT', 'https://metrixwire.com'); define('SAVEQUERIES', true); // required for per-query spans
Both variants read SAVEQUERIES the same way — it must be a wp-config.php constant, since WordPress
reads it before any plugin (mu or regular) loads.
Native PHP (no framework) — fully automatic
Point PHP's auto_prepend_file at the bundled bootstrap and every request is traced with no code change:
; php.ini auto_prepend_file = /path/to/vendor/metrixwire/php/src/auto.php
It opens a trace, records duration / peak memory / uncaught exceptions, and flushes on shutdown — for native scripts and any framework alike.
Automatic database queries anywhere
For non-Laravel/Symfony code, swap the PDO class — every direct and prepared query is then captured automatically:
$pdo = new \MetrixWire\PDO($dsn, $user, $pass); // instead of new \PDO(...)
Configuration
| Env | Default | Notes |
|---|---|---|
METRIXWIRE_KEY |
(empty) | Project API key. Empty = SDK disabled. |
METRIXWIRE_ENDPOINT |
https://metrixwire.com |
API base URL (a full /ingest URL also works). |
METRIXWIRE_ENABLED |
true |
Set to false to disable entirely. |
Non-blocking
The transport uses cURL with a short timeout and swallows all errors. Sending happens on shutdown / terminate() — after the response has reached the client — so it adds no latency the user can perceive.