自定义PHP应用集成Sentry时出现Http\Discovery\Exception\DiscoveryFailedException错误求助
解决自定义PHP应用集成Sentry时的DiscoveryFailedException错误
你遇到的问题根源在于PHP HTTP组件的自动发现机制找不到所需的PSR-17消息工厂实现——Sentry底层依赖php-http库处理请求,而它必须找到明确的PSR-17(HTTP消息工厂)实现才能正常工作。下面给你两个实用的解决方案:
方案一:安装轻量的PSR-17实现包
最简单的解决方式是安装一个被php-http/discovery机制优先识别的PSR-17实现,比如nyholm/psr7——这是一个轻量、高性能的PSR-7和PSR-17兼容库,能被自动发现机制轻松识别。
执行以下composer命令安装:
composer require nyholm/psr7
安装完成后重启应用,Sentry就能自动找到所需的工厂类,错误会直接消失。
方案二:手动配置传输与工厂(绕过自动发现)
如果你不想额外增加依赖,或者自动发现机制仍然异常,可以手动指定Guzzle客户端和对应的PSR-17工厂,完全绕过自动发现流程。这种方式更适合自定义应用,可控性更强。
修改你的Sentry初始化代码如下:
use Sentry\ClientBuilder; use Sentry\Options; use GuzzleHttp\Client as GuzzleClient; use GuzzleHttp\Psr7\HttpFactory; use Sentry\HttpClient\GuzzleHttpClient; // 1. 初始化Guzzle客户端(可按需添加Guzzle配置) $guzzleClient = new GuzzleClient([ // 可选:添加超时等Guzzle配置项 'timeout' => 5, ]); // 2. 使用Guzzle 7内置的PSR-17工厂 $httpFactory = new HttpFactory(); // 3. 设置Sentry基础配置 $sentryOptions = new Options(); $sentryOptions->setDsn('你的Sentry DSN地址'); // 可选:补充环境、版本等配置 $sentryOptions->setEnvironment('production'); $sentryOptions->setRelease('v1.0.0'); // 4. 手动构建Sentry客户端并指定传输组件 $clientBuilder = ClientBuilder::create($sentryOptions); $clientBuilder->setHttpTransport(new GuzzleHttpClient( $guzzleClient, $httpFactory, // RequestFactory $httpFactory, // StreamFactory $httpFactory // UriFactory )); // 5. 完成Sentry初始化 $client = $clientBuilder->getClient(); \Sentry\init(['client' => $client]);
错误原因补充说明
你遇到的DiscoveryFailedException,是因为php-http的自动发现机制在当前依赖中没有找到符合要求的PSR-17实现。虽然Guzzle 7自带了兼容的工厂类,但由于discovery策略优先级或自动加载的问题,没有被正确识别。通过上述两种方式,要么补充一个易被识别的实现,要么手动指定所需组件,都能彻底解决这个问题。
内容的提问来源于stack exchange,提问作者GlennM
相关产品推荐
相关产品推荐

