You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

自定义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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.29 16:52:46