【问题标题】:Guzzlehttp\Exception\ConnectionException: cURL error 28 resolving timeout after 2851 milisecondGuzzlehttp\Exception\ConnectException:cURL 错误 28 解析在 2851 毫秒后超时
【发布时间】:2019-05-23 17:59:25
【问题描述】:

我最近使用 Laravel-Scout 库将 Algolia 与我的 laravel 应用程序集成。每当我尝试使用 algolia 搜索任何产品时,都会得到 GuzzelHttp\Exception\Connection\Exception。以下是响应的屏幕输出。当我将我的数据库与 Algolia 的服务器同步时,也会出现同样的问题。我在我的项目中双重检查了我的 Algolia 凭据,它们匹配正确。我在 linux mint-18.04 LTS 中运行这个项目,使用默认的 laravel 服务器(既不是 Apache 也不是 Nginx)和 MySQL 服务器。

【问题讨论】:

    标签: php laravel-5 search-engine guzzle algolia


    【解决方案1】:

    如果您已经将 Scout 添加到您的项目中,则可以通过以下方式解决:

    1. 创建您自己的app\Scout\EngineManager.php:
    <?php declare(strict_types = 1);
    
    namespace App\Scout;
    
    use Algolia\AlgoliaSearch\Config\SearchConfig;
    use Algolia\AlgoliaSearch\SearchClient as Algolia;
    use Algolia\AlgoliaSearch\Support\UserAgent;
    use Laravel\Scout\EngineManager as BaseEngineManager;
    use Laravel\Scout\Engines\AlgoliaEngine;
    
    class EngineManager extends BaseEngineManager
    {
        /**
         * Create an Algolia engine instance.
         *
         * @return \Laravel\Scout\Engines\AlgoliaEngine
         */
        public function createAlgoliaDriver()
        {
            $this->ensureAlgoliaClientIsInstalled();
    
            UserAgent::addCustomUserAgent('Laravel Scout', '7.0.0');
    
            $config = SearchConfig::create(config('scout.algolia.id'), config('scout.algolia.secret'));
            $config->setConnectTimeout(10);
    
            $algolia = Algolia::createWithConfig($config);
    
            return new AlgoliaEngine(
                $algolia,
                config('scout.soft_delete')
            );
        }
    }
    
    1. 创建您自己的app\Scout\Searchable.php:
    <?php declare(strict_types = 1);
    
    namespace App\Scout;
    
    use Laravel\Scout\Searchable as BaseSearchable;
    
    trait Searchable
    {
        use BaseSearchable;
    
        /**
         * Get the Scout engine for the model.
         *
         * @return mixed
         */
        public function searchableUsing()
        {
            return app(EngineManager::class)->engine();
        }
    }
    
    1. 创建您自己的app\Providers\ScoutServiceProvider.php:
    <?php declare(strict_types = 1);
    
    namespace App\Providers;
    
    use App\Scout\EngineManager;
    use Laravel\Scout\ScoutServiceProvider as BaseScoutServiceProvider;
    
    class ScoutServiceProvider extends BaseScoutServiceProvider
    {
        /**
         * Register the service provider.
         *
         * @return void
         */
        public function register()
        {
            $this->app->singleton(EngineManager::class, function ($app) {
                return new EngineManager($app);
            });
    
            parent::register();
        }
    }
    
    1. 从您的composer.json 中的包发现中排除默认的侦察包:
    "extra": {
        "laravel": {
            "dont-discover": [
                "laravel/scout"
            ]
        }
    },
    
    1. 将您的ScoutServiceProvider 添加到config/app.php 的提供商列表中。

    2. 运行composer dumpautoload

    3. 每当向模型添加 Searchable 特征时,请添加您自己的特征而不是 Scout 的。

    如果您想让超时环境依赖于环境,可以将其提取到配置设置中。另外请记住,以上是使Searchable trait 在更长的超时下工作的最低要求,其他类可能还需要被覆盖才能使其他功能正常工作。

    【讨论】:

    • 我会试试这个。
    • @TAM 很好,我很好奇它是怎么回事。
    • 更新:我尝试了你的方法,但它也不起作用。相反,我将 Laravel Scout 版本从 2.0 降级到 1.27。现在它显然工作正常。
    • @TAM 这很有趣,我使用 Laravel 5.8 和最新的 Scout (7.1.2) 让它正常工作。您提到您使用的是 Scout 2,这是一个非常旧的版本,它的代码与当前版本相比看起来非常不同。为了下次能够提供一个可行的解决方案,您能否在您的问题中也发布各种库的版本?谢谢。
    • 在文档中,提到了 2.0 版进行安装。我以为这是最新的。我不知道侦察兵的版本是问题的根源。不过,我下次会提到相关的库版本。
    【解决方案2】:

    Algolia 有default timeouts,当请求超过默认值时会弹出此错误(我相信 2 秒)。您可以通过以下方式查看请求可能需要多长时间:time host [ALGOLIA_ID].algolia.net。不幸的是,Laravel Scout 没有能力覆盖它,我也没有找到好的解决方法。

    【讨论】:

      猜你喜欢
      • 2017-10-20
      • 2018-07-06
      • 2021-02-20
      • 2023-01-18
      • 1970-01-01
      • 2017-07-27
      • 1970-01-01
      • 2017-05-18
      • 2017-07-01
      相关资源
      最近更新 更多