Skip to main content
skill CX Codex

sentry-php-sdk — Claude Code skill: what it does, how to install

Sets up Sentry monitoring in plain PHP, Laravel, or Symfony applications. It inspects your project dependencies and schedules to recommend the right SDK packages and config.

Install into Claude Code · Skills CLI (Vercel) All methods and platforms ↓
npx skills add getsentry/sentry-for-ai --skill sentry-php-sdk -a claude-code
Open on GitHub

What sentry-php-sdk does

The skill acts as an onboarding wizard. First, it inspects composer.json, composer.lock, and directory markers to determine the application type. It spots Laravel by finding artisan, Symfony by checking bin/console, or treats the codebase as plain PHP. The workflow also looks for queue runners like Horizon or Messenger, background cron tasks, and AI integrations.

Recommendations follow the scan results. Error handling and Monolog logging are selected by default. Web frameworks get automated distributed tracing for HTTP requests and database queries. If the project contains laravel/ai, the skill selects sentry/sentry-laravel version 4.27.0 or newer to record model spans automatically.

Base setup requires PHP 7.2 or later with ext-json, ext-mbstring, and ext-curl. Profiling will fail on Windows environments because it strictly depends on the excimer PECL extension, which runs only on Linux and macOS. Check your host setup before enabling performance sampling.

What it helps with

  • configure Sentry error monitoring in Laravel, Symfony, or plain PHP
  • route application logs through Monolog integrations
  • enable execution profiling using the excimer PECL extension
  • instrument queue jobs across Horizon and Symfony Messenger
  • track AI calls automatically in laravel/ai projects

Example prompts for the agent

  • add Sentry to PHP and configure error monitoring
  • setup Sentry in a Laravel project with queue monitoring
  • install sentry/sentry-symfony and configure tracing

How to install sentry-php-sdk

1Skills CLI (Vercel)

npx skills add getsentry/sentry-for-ai --skill sentry-php-sdk -a claude-code

2Manually: put the files in place

~/.claude/skills/sentry-php-sdk/SKILL.md

Copy the whole skill folder; for one project use .claude/skills/sentry-php-sdk/

Step by step, with commands for each platform: How to install skills in Claude Code: five ways

Questions about sentry-php-sdk

How to install sentry-php-sdk in Claude Code?

Run npx skills add getsentry/sentry-for-ai --skill sentry-php-sdk -a claude-code in your terminal.

What does sentry-php-sdk do?

It inspects your PHP repository to detect frameworks, queues, and schedulers. Then it suggests the appropriate Sentry SDK packages and writes the initialization code.

What are the system requirements for Sentry profiling in PHP?

Profiling requires PHP 7.2 or higher and the excimer PECL extension. This extension is available only on Linux and macOS.

Source text

SKILL.md · Apache-2.0
---
name: sentry-php-sdk
description: Full Sentry SDK setup for PHP. Use when asked to "add Sentry to PHP", "install sentry/sentry", "setup Sentry in PHP", or configure error monitoring, tracing, profiling, logging, metrics, crons, or AI monitoring for PHP applications. Supports plain PHP, Laravel, and Symfony.
license: Apache-2.0
category: sdk-setup
parent: sentry-sdk-setup
disable-model-invocation: true
---

> [All Skills](../../SKILL_TREE.md) > [SDK Setup](../sentry-sdk-setup/SKILL.md) > PHP SDK

# Sentry PHP SDK

Opinionated wizard that scans your PHP project and guides you through complete Sentry setup.

## Invoke This Skill When

- User asks to "add Sentry to PHP" or "setup Sentry" in a PHP app
- User wants error monitoring, tracing, profiling, logging, metrics, or crons in PHP
- User mentions `sentry/sentry`, `sentry/sentry-laravel`, `sentry/sentry-symfony`, or Sentry + any PHP framework
- User wants to monitor Laravel routes, Symfony controllers, queues, scheduled tasks, or plain PHP scripts

> **Note:** SDK versions and APIs below reflect Sentry docs at time of writing (sentry/sentry 4.x, sentry/sentry-laravel 4.x, sentry/sentry-symfony 5.x).
> Always verify against [docs.sentry.io/platforms/php/](https://docs.sentry.io/platforms/php/) before implementing.

---

## Phase 1: Detect

Run these commands to understand the project before making recommendations:

```bash
# Check existing Sentry
grep -i sentry composer.json composer.lock 2>/dev/null

# Detect framework
cat composer.json | grep -E '"laravel/framework"|"symfony/framework-bundle"|"illuminate/'

# Confirm framework via filesystem markers
ls artisan 2>/dev/null && echo "Laravel detected"
ls bin/console 2>/dev/null && echo "Symfony detected"

# Detect queue systems
grep -E '"laravel/horizon"|"symfony/messenger"' composer.json 2>/dev/null

# Detect AI libraries
grep -E '"(laravel/ai|openai-php|openai/|anthropic|llm)' composer.json 2>/dev/null

# Check for companion frontend
ls frontend/ resources/js/ assets/ 2>/dev/null
cat package.json 2>/dev/null | grep -E '"react"|"svelte"|"vue"|"next"'
```

**What to note:**
- Is `sentry/sentry` (or `-laravel` / `-symfony`) already in `composer.json`? If yes, check if the init call exists — may just need feature config.
- Framework detected? **Laravel** (has `artisan` + `laravel/framework` in composer.json), **Symfony** (has `bin/console` + `symfony/framework-bundle`), or **plain PHP**.
- Queue system? (Laravel Queue / Horizon, Symfony Messenger need queue worker configuration.)
- AI libraries? (`laravel/ai` is auto-instrumented by `sentry/sentry-laravel >= 4.27.0` when tracing is enabled; other PHP AI libraries need manual spans.)
- Companion frontend? (Triggers Phase 4 cross-link.)

---

## Phase 2: Recommend

Based on what you found, present a concrete proposal. Don't ask open-ended questions — lead with a recommendation:

**Always recommended (core coverage):**
- ✅ **Error Monitoring** — captures unhandled exceptions and PHP errors
- ✅ **Logging** — Monolog integration (Laravel/Symfony auto-configure; plain PHP uses `MonologHandler`)

**Recommend when detected:**
- ✅ **Tracing** — web framework detected (Laravel/Symfony auto-instrument HTTP, DB, Twig/Blade, cache)
- ⚡ **Profiling** — production apps where performance matters (requires `excimer` PHP extension, Linux/macOS only)
- ⚡ **Crons** — scheduler patterns detected (Laravel Scheduler, Symfony Scheduler, custom cron jobs)
- ⚡ **Metrics** — business KPIs or SLO tracking (uses `TraceMetrics` API)
- ✅ **AI Monitoring** — `laravel/ai` detected in a Laravel app (auto-instrumented in `sentry/sentry-laravel >= 4.27.0`)

**Recommendation matrix:**

| Feature | Recommend when... | Reference |
|---------|------------------|-----------|
| Error Monitoring | **Always** — non-negotiable baseline | `${SKILL_ROOT}/references/error-monitoring.md` |
| Tracing | Laravel/Symfony detected, or manual spans needed | `${SKILL_ROOT}/references/tracing.md` |
| Profiling | Production + `excimer` extension available | `${SKILL_ROOT}/references/profiling.md` |
| Logging | **Always**; Monolog for Laravel/Symfony | `${SKILL_ROOT}/references/logging.md` |
| Metrics | Business events or SLO tracking needed | `${SKILL_ROOT}/references/metrics.md` |
| Crons | Scheduler or cron patterns detected | `${SKILL_ROOT}/references/crons.md` |
| AI Monitoring | `laravel/ai` detected in a Laravel app, or manual PHP AI spans needed | `${SKILL_ROOT}/references/ai-monitoring.md` |

Propose: *"I recommend Error Monitoring + Tracing [+ Logging]. Want Profiling, Crons, Metrics, or AI Monitoring too?"*

---

## Phase 3: Guide

### Install

```bash
# Plain PHP
composer require sentry/sentry "^4.0"

# Laravel
composer require sentry/sentry-laravel "^4.0"

# Laravel with Laravel AI monitoring
composer require sentry/sentry-laravel "^4.27.0"

# Symfony
composer require sentry/sentry-symfony "^5.0"
```

**System requirements:**
- PHP 7.2 or later
- Extensions: `ext-json`, `ext-mbstring`, `ext-curl` (all required)
- `excimer` PECL extension (Linux/macOS only — required for profiling)

### Framework-Specific Initialization

#### Plain PHP

Place `\Sentry\init()` at the top of your entry point (`index.php`, `bootstrap.php`, or equivalent), before any application code:

```php
<?php

require_once 'vendor/autoload.php';

\Sentry\init([
    'dsn'                  => $_SERVER['SENTRY_DSN'] ?? '',
    'environment'          => $_SERVER['SENTRY_ENVIRONMENT'] ?? 'production',
    'release'              => $_SERVER['SENTRY_RELEASE'] ?? null,
    'send_default_pii'     => true,
    'traces_sample_rate'   => 1.0,
    'profiles_sample_rate' => 1.0,
    'enable_logs'          => true,
]);

// rest of application...
```

#### Laravel

**Step 1 — Register exception handler** in `bootstrap/app.php`:

```php
use Sentry\Laravel\Integration;

return Application::configure(basePath: dirname(__DIR__))
    ->withExceptions(function (Exceptions $exceptions) {
        Integration::handles($exceptions);
    })->create();
```

**Step 2 — Publish config and set DSN:**

```bash
php artisan sentry:publish --dsn=YOUR_DSN
```

This creates `config/sentry.php` and adds `SENTRY_LARAVEL_DSN` to `.env`.

**Step 3 — Configure `.env`:**

```ini
SENTRY_LARAVEL_DSN=https://[email protected]/0
SENTRY_TRACES_SAMPLE_RATE=1.0
SENTRY_PROFILES_SAMPLE_RATE=1.0
```

> For full Laravel configuration options, read `${SKILL_ROOT}/references/laravel.md`.

#### Symfony

**Step 1 — Register the bundle** in `config/bundles.php` (auto-done by Symfony Flex):

```php
Sentry\SentryBundle\SentryBundle::class => ['all' => true],
```

**Step 2 — Create `config/packages/sentry.yaml`:**

```yaml
sentry:
    dsn: '%env(SENTRY_DSN)%'
    options:
        environment: '%env(APP_ENV)%'
        release: '%env(SENTRY_RELEASE)%'
        send_default_pii: true
        traces_sample_rate: 1.0
        profiles_sample_rate: 1.0
        enable_logs: true
```

**Step 3 — Set the DSN in `.env`:**

```ini
SENTRY_DSN=https://[email protected]/0
```

> For full Symfony configuration options, read `${SKILL_ROOT}/references/symfony.md`.

### Quick Start — Recommended Init (Plain PHP)

Full init enabling the most features with sensible defaults:

```php
\Sentry\init([
    'dsn'                     => $_SERVER['SENTRY_DSN'] ?? '',
    'environment'             => $_SERVER['SENTRY_ENVIRONMENT'] ?? 'production',
    'release'                 => $_SERVER['SENTRY_RELEASE'] ?? null,
    'send_default_pii'        => true,

    // Tracing (lower to 0.1–0.2 in high-traffic production)
    'traces_sample_rate'      => 1.0,

    // Profiling — requires excimer extension (Linux/macOS only)
    'profiles_sample_rate'    => 1.0,

    // Structured logs (sentry/sentry >=4.12.0)
    'enable_logs'             => true,
]);
```

### For Each Agreed Feature

Walk through features one at a time. Load the reference, follow its steps, verify before moving on:

| Feature | Reference file | Load when... |
|---------|---------------|-------------|
| Error Monitoring | `${SKILL_ROOT}/references/error-monitoring.md` | Always (baseline) |
| Tracing | `${SKILL_ROOT}/references/tracing.md` | HTTP handlers / distributed tracing |
| Profiling | `${SKILL_ROOT}/references/profiling.md` | Performance-sensitive production |
| Logging | `${SKILL_ROOT}/references/logging.md` | Always; Monolog for Laravel/Symfony |
| Metrics | `${SKILL_ROOT}/references/metrics.md` | Business KPIs / SLO tracking |
| Crons | `${SKILL_ROOT}/references/crons.md` | Scheduler / cron patterns detected |
| AI Monitoring | `${SKILL_ROOT}/references/ai-monitoring.md` | `laravel/ai` detected in Laravel, or manual PHP AI spans needed |

For each feature: `Read ${SKILL_ROOT}/references/<feature>.md`, follow steps exactly, verify it works.

---

## Configuration Reference

### Key `\Sentry\init()` Options (Plain PHP)

| Option | Type | Default | Purpose |
|--------|------|---------|---------|
| `dsn` | `string\|bool\|null` | `$_SERVER['SENTRY_DSN']` | SDK disabled if empty or `false` |
| `environment` | `string\|null` | `$_SERVER['SENTRY_ENVIRONMENT']` | e.g., `"staging"` |
| `release` | `string\|null` | `$_SERVER['SENTRY_RELEASE']` | e.g., `"[email protected]"` |
| `send_default_pii` | `bool` | `false` | Include request headers, cookies, IP |
| `sample_rate` | `float` | `1.0` | Error event sample rate (0.0–1.0) |
| `traces_sample_rate` | `float\|null` | `null` | Transaction sample rate; `null` disables tracing |
| `traces_sampler` | `callable\|null` | `null` | Custom per-transaction sampling (overrides rate) |
| `profiles_sample_rate` | `float\|null` | `null` | Profiling rate relative to traces; requires `excimer` |
| `enable_logs` | `bool` | `false` | Send structured logs to Sentry (>=4.12.0) |
| `max_breadcrumbs` | `int` | `100` | Max breadcrumbs per event |
| `attach_stacktrace` | `bool` | `false` | Stack traces on `captureMessage()` |
| `in_app_include` | `string[]` | `[]` | Path prefixes belonging to your app |
| `in_app_exclude` | `string[]` | `[]` | Path prefixes for third-party code (hidden in traces) |
| `ignore_exceptions` | `string[]` | `[]` | Exception FQCNs to never report |
| `ignore_transactions` | `string[]` | `[]` | Transaction names to never report |
| `error_types` | `int\|null` | `error_reporting()` | PHP error bitmask (e.g., `E_ALL & ~E_NOTICE`) |
| `capture_silenced_errors` | `bool` | `false` | Capture errors suppressed by `@` operator |
| `max_request_body_size` | `string` | `"medium"` | `"none"` / `"small"` / `"medium"` / `"always"` |
| `before_send` | `callable` | identity | `fn(Event $event, ?EventHint $hint): ?Event` — return `null` to drop |
| `before_breadcrumb` | `callable` | identity | `fn(Breadcrumb $b): ?Breadcrumb` — return `null` to discard |
| `trace_propagation_targets` | `string[]\|null` | `null` | Downstream hosts to inject `sentry-trace` headers into; `null` = all, `[]` = none |
| `strict_trace_continuation` | `bool` | `false` | Only continue an incoming distributed trace if the `sentry-org_id` baggage matches the SDK's org ID; prevents trace contamination from third-party Sentry-instrumented services (>=4.21.0) |
| `debug` | `bool` | `false` | Verbose SDK output (use a PSR-3 `logger` option instead for structured output) |

### Environment Variables

| Variable | Maps to | Notes |
|----------|---------|-------|
| `SENTRY_DSN` | `dsn` | Also `$_SERVER['SENTRY_DSN']` |
| `SENTRY_ENVIRONMENT` | `environment` | |
| `SENTRY_RELEASE` | `release` | Also reads `$_SERVER['AWS_LAMBDA_FUNCTION_VERSION']` |
| `SENTRY_SPOTLIGHT` | `spotlight` | |

> **Laravel note:** Uses `SENTRY_LARAVEL_DSN` (falls back to `SENTRY_DSN`). Other options follow `SENTRY_TRACES_SAMPLE_RATE`, `SENTRY_PROFILES_SAMPLE_RATE`, etc.

---

## Verification

Test that Sentry is receiving events:

```php
// Trigger a real error event — check the Sentry dashboard within seconds
throw new \Exception('Sentry PHP SDK test');
```

Or for a non-crashing check:

```php
\Sentry\captureMessage('Sentry PHP SDK test');
```

**Laravel:**
```bash
php artisan sentry:test
```

If nothing appears:
1. Enable debug output:
   ```php
   \Sentry\init([
       'dsn' => '...',
       'logger' => new \Sentry\Logger\DebugStdOutLogger(),
   ]);
   ```
2. Verify the DSN is correct (format: `https://<key>@o<org>.ingest.sentry.io/<project>`)
3. Check `SENTRY_DSN` (or `SENTRY_LARAVEL_DSN`) env var is set in the running process
4. For queue workers: ensure Sentry is initialized **inside the worker process**, not just the web process

---

## Phase 4: Cross-Link

After completing PHP setup, check for a companion frontend missing Sentry:

```bash
ls frontend/ resources/js/ assets/ public/ 2>/dev/null
cat package.json frontend/package.json 2>/dev/null \
  | grep -E '"react"|"svelte"|"vue"|"next"|"nuxt"'
```

If a frontend exists without Sentry, suggest the matching skill:

| Frontend detected | Suggest skill |
|-------------------|--------------|
| React / Next.js | `sentry-react-sdk` |
| Svelte / SvelteKit | `sentry-svelte-sdk` |
| Vue / Nuxt | Use `@sentry/vue` — see [docs.sentry.io/platforms/javascript/guides/vue/](https://docs.sentry.io/platforms/javascript/guides/vue/) |
| Other JS/TS | `sentry-react-sdk` (covers generic browser JS patterns) |

---

## Troubleshooting

| Issue | Solution |
|-------|----------|
| Events not appearing | Enable `logger` option (`DebugStdOutLogger`), verify DSN, check env vars in the running process |
| Malformed DSN error | Format: `https://<key>@o<org>.ingest.sentry.io/<project>` |
| Laravel exceptions not captured | Ensure `Integration::handles($exceptions)` is in `bootstrap/app.php` |
| Symfony exceptions not captured | Verify `SentryBundle` is registered in `config/bundles.php` |
| No traces appearing | Set `traces_sample_rate` (not `null`); confirm auto-instrumentation is enabled |
| Profiling not working | `excimer` extension required (Linux/macOS only; not available on Windows); requires `traces_sample_rate > 0` |
| `enable_logs` not working | Requires `sentry/sentry >= 4.12.0`, `sentry/sentry-laravel >= 4.15.0`, or `sentry/sentry-symfony >= 5.4.0` |
| Queue worker errors missing | Init Sentry in the worker process itself, not just the web process; for Laravel use `SENTRY_LARAVEL_DSN` in worker `.env` |
| Too many transactions | Lower `traces_sample_rate` or use `traces_sampler` to drop health check routes |
| PII not captured | Set `send_default_pii: true`; for Laravel set `send_default_pii: true` in `config/sentry.php` |
| `@`-suppressed errors missing | Set `capture_silenced_errors: true` |
| Cross-service traces broken | Check `trace_propagation_targets`; ensure downstream services have Sentry installed |
| Trace contamination from third-party services | Set `strict_trace_continuation: true` to only continue traces where the incoming `sentry-org_id` baggage matches your SDK's org ID (>=4.21.0) |

© getsentry · Apache-2.0 · getsentry/sentry-for-ai

Similar skills

Everything for Backend and APIs →

From the same set31

sentry-dotnet-sdk Walks you through a full Sentry setup in a .NET project: errors, tracing, logs, profiling and crons. Handy when you need monitoring in ASP.NET Core, MAUI, WPF or Blazor. CX Codex +1 2,300installs sentry-android-sdk Scans your Android project to set up Sentry crash reporting, tracing, and session replays. Supports Kotlin and Java codebases using Gradle or version catalogs. CX Codex +1 2,300installs sentry-go-sdk The skill scans your Go project and walks you through wiring up Sentry: errors, tracing, logs, metrics, crons. CX Codex +1 2,200installs sentry-flutter-sdk A skill that walks you through full Sentry setup in a Flutter or Dart app: it scans the project, proposes a feature set and guides the install. CX Codex +1 2,200installs sentry-ruby-sdk Inspects your Ruby stack and configures Sentry error monitoring. It also handles migration away from older monitoring services. CX Codex +1 2,100installs sentry-svelte-sdk A skill that walks your agent through full Sentry setup in Svelte and SvelteKit: it scans the project, proposes a feature set and writes the config files. CX Codex +1 2,100installs sentry-elixir-sdk A skill that walks you through Sentry setup in an Elixir project: it scans mix.exs, proposes a feature set and hands you the configs. CX Codex +1 2,000installs sentry-tanstack-start-sdk Configures Sentry SDK in TanStack Start React applications. It inspects project files to set up error monitoring, tracing, logs, and session replay across browser and server. CX Codex +1 1,900installs

Project sponsors

Companies that keep this analytics open
Gold sponsor

Impressions, clicks and code copies — open statistics. We keep the numbers public for the same reason NeBlask itself is public. Become a sponsor