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.
composer require metrixwire/phpAdd to your environment:
METRIXWIRE_KEY=mw_xxx
METRIXWIRE_ENDPOINT=http://localhost:3000Then pick the integration for your stack — each one is automatic once wired.
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.
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.
Add the middleware as the outermost layer:
$app->add(new \MetrixWire\Psr15\MetrixWireMiddleware());Copy wordpress/metrixwire.php into wp-content/mu-plugins/ and set in wp-config.php:
define('METRIXWIRE_KEY', 'mw_xxx');
define('METRIXWIRE_ENDPOINT', 'http://localhost:3000');
define('SAVEQUERIES', true); // required for per-query spansPoint 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.phpIt opens a trace, records duration / peak memory / uncaught exceptions, and flushes on shutdown — for native scripts and any framework alike.
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(...)| Env | Default | Notes |
|---|---|---|
METRIXWIRE_KEY |
(empty) | Project API key. Empty = SDK disabled. |
METRIXWIRE_ENDPOINT |
http://localhost:3000 |
API base URL (a full /ingest URL also works). |
METRIXWIRE_ENABLED |
true |
Set to false to disable entirely. |
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.