Scout APM 的 PHP Agent 安装不必须用 Composer但强烈建议,因其仅通过 Composer 分发,本质是用户态 PSR-15 中间件,依赖自动加载和生命周期钩子。
Scout APM 的 PHP Agent 安装是否必须用 Composer?
不是必须,但强烈建议。Scout 官方 PHP Agent(
)仅通过 Composer 分发,不提供独立 .so 扩展或手动下载 zip 包。直接改
加载扩展行不通——它本质是用户态的 PSR-15 兼容中间件 + 自动钩子注入器,依赖 Composer 的自动加载和生命周期钩子。
常见错误:试图把
编译进 PHP(它根本不存在),或把
目录硬拷到生产环境却不运行
,导致 autoload 失败、
类找不到。
执行
(Laravel 8+ 可省略,因 Scout 已内置适配)
确保
在入口文件(如
)中被最先引入
不要删掉
—— Laravel Scout 集成靠它启动
Laravel 中如何正确配置 SCOUT_KEY 和监控开关?
Scout APM 不读取
里的
,而是认
和
。漏配
是最常见“没数据”原因——即使 key 正确,Agent 默认静默不采集。
配置项必须写在
里,不能只写在
中:Agent 初始化早于 Laravel Config 加载,它直读环境变量。
立即学习
“
PHP免费学习笔记(深入)
”;
PHP 8.5.5
PHP 8.5.5 是 PHP 8.5 分支的维护更新版本。该版本延续了“小步快跑”的迭代逻辑,通过深度错误修复、底层性能微调以及安全加固,旨在为开发者提供一个更健壮、更高效的运行环境。该版本严格遵守语义化版本规范,不包含破坏性变更。
下载
(从 https://scoutapm.com/ 右上角 Account → API Keys 复制)
(开发环境也建议设为
,否则本地看不到 trace)
(建议带环境后缀,如
,方便 Dashboard 区分)
避免在
写
—— 这个键名 Scout PHP Agent 完全不识别
为什么 Laravel 请求在 Scout Dashboard 显示为 “Unknown Route”?
这是 Laravel 路由未被 Scout 正确识别的典型表现,根源在于 Scout 的路由解析依赖 Laravel 的
实例,而某些场景下它拿不到有效 route 对象。
常见触发点:使用了自定义中间件提前返回响应(如 JWT 鉴权失败直接
)、在
的
数组里放了非标准中间件、或用了 Swoole/Swoft 等常驻内存模型但没调用
。
检查中间件是否在
中提前
,若有,确保在 return 前调用
确认
的
没混入非 HTTP 中间件(比如数据库连接池初始化类)
Swoole 场景下,在每次请求开始时加
,否则旧 trace 数据会污染新请求
Scout APM 报错 “Unable to connect to ScoutAPM server” 怎么查?
这个错误不是网络连不上外网,而是 Agent 尝试连接本地 Unix socket 或 fallback 到 UDP 时失败。默认行为是先连
,失败后改用
UDP 发送数据。但很多 Docker 环境或无 root 权限的 shared hosting 根本没有
写权限,或防火墙禁了 UDP 6590。
解决方式不是开防火墙,而是强制走 HTTP 回调——虽然性能略低,但 100% 可控。
在
加
(注意不是
)
确保能访问
(可 curl 测:
)
如果用 Cloudflare 或企业代理,需放行
的 SNI 和证书验证(Scout 使用 Let’s Encrypt,不接受自签名)
别碰
和
—— 它们只对本地 agent 进程有效,PHP Agent 不读这两个
Scout APM 的 PHP 集成深度依赖 Laravel 的请求生命周期钩子,一旦中间件顺序、响应提前终止、或常驻进程复用状态,trace 就容易断裂。最易忽略的是
环境变量缺失,以及 Swoole 环境下忘记
。
scoutapp/scout-apm-phpphp.iniscoutapm.sovendor/scoutapp/...composer install --no-devScoutApm\ScoutApmAgentcomposer require scoutapp/scout-apm-phpvendor/autoload.phppublic/index.phpvendor/scoutapp/scout-apm-php/src/ScoutApm/Agent.php.envSCOUT_KEYSCOUT_MONITORSCOUT_NAMESCOUT_MONITOR=true.envconfig/scout.phpSCOUT_KEY=your-real-key-from-scout-dashboardSCOUT_MONITOR=truetrueSCOUT_NAME=my-laravel-appmy-laravel-app-prod.envSCOUT_ENABLED=trueIlluminate\Routing\Routereturn response()->json(...)Kernel.php$middlewareScoutApm\ScoutApmAgent::reset()handle()return\ScoutApm\ScoutApmAgent::getInstance()->trackRequest();App\Http\Kernel$middlewareGroups['web']\ScoutApm\ScoutApmAgent::getInstance()->reset();/tmp/scoutapm.sock127.0.0.1:6590/tmp.envSCOUT_CORE_AGENT_SOCKET=falseSCOUT_SOCKET=falsehttps://agent.scoutapp.comcurl -I https://agent.scoutapp.comagent.scoutapp.comSCOUT_CORE_AGENT_HOSTSCOUT_CORE_AGENT_PORTSCOUT_MONITORreset()