Meilisearch-laravel-scout: Comment paramétrer un timeout personnalisé pour une recherche ?

Créé le 26 avr. 2021  ·  8Commentaires  ·  Source: meilisearch/meilisearch-laravel-scout

J'ai créé une droplet DigitalOcean en suivant votre excellent tutoriel, et je l'utilise avec succès avec Laravel 👌

Le seul problème que j'ai est lorsque le serveur est en panne (arrêté manuellement ou CPU à plus de 100%).
Je ne trouve pas où définir un court délai d'attente pour afficher une erreur ?
En ce moment, il se charge indéfiniment en attendant une réponse du serveur mort.

Commentaire le plus utile

Bonjour @desaintflorent ,

Je ne suis pas sûr que ce soit ce que vous avez demandé, mais d'après ce que @ hi019 a dit, vous pouvez remplacer le MeilisearchServiceProvider pour utiliser un client http personnalisé.

Exemple:

php artisan make:provider MeilisearchServiceProvider
<?php

namespace App\Providers;

use MeiliSearch\Client;

class MeilisearchServiceProvider extends \Meilisearch\Scout\MeilisearchServiceProvider
{
    public function register()
    {
        parent::register();

        $this->app->singleton(Client::class, function () {
            return new Client(config('meilisearch.host'), config('meilisearch.key'), new \GuzzleHttp\Client(['timeout' => 0.01]));
        });
    }
}

En toi config/app.php

'providers' => [
    // Other Service Providers

    App\Providers\MeilisearchServiceProvider::class,
],

Ensuite, vous devez désactiver la découverte automatique de Meilisearch en ajoutant ce qui suit à votre composer.json

   ...
    "extra": {
        "laravel": {
            "dont-discover": [
                "meilisearch/meilisearch-laravel-scout"
            ]
        }
    },
   ...

Et si je ne manque pas quelque chose, tu devrais être bon, le délai d'attente lancera un MeiliSearch\Exceptions\CommunicationException

try {
    $movies = Movie::search('b')->get();
} catch (\MeiliSearch\Exceptions\CommunicationException $e) {
    // do something
}

Si quelqu'un a une meilleure option, je serai heureux de le lire :sourire:

Tous les 8 commentaires

Bonjour @desaintflorent , si je ne me trompe pas, ce package ne fournit pas d'option pour définir un délai d'attente. Je ne suis pas un utilisateur de laravel, je ne peux donc pas proposer de solution de contournement avec laravel.
Si quelqu'un connaît une solution de contournement, n'hésitez pas à la partager sur ce problème 🙂

Heureux de lire que vous avez aimé le didacticiel DO sur nos documents, nous faisons de notre mieux pour fournir des intégrations avec une belle documentation !

Je pense que cela devrait être fait au niveau du client PHP Meilisearch en transmettant une instance GuzzleHTTP personnalisée au client : https://github.com/meilisearch/meilisearch-php#customize -your-http-client

Il n'y a aucun moyen de faire cela avec le moment. Peut-être pourrions-nous autoriser l'utilisateur à passer un client PHP Meilisearch personnalisé dans la configuration

Ce serait un excellent ajout. Cependant, d'après ce numéro où j'explique le contexte, ce repo n'aura pas de nouvel ajout qui ne sera pas cohérent avec larvel/scout
Nous pourrions créer un nouveau repo qui sera plus un plugin meilisearch-laravel-scout-extended, et nous y intégrerons ce genre de possibilité. Je laisse ce problème ouvert car c'est une bonne idée d'amélioration pour le prochain dépôt (ou la prochaine version de ce dépôt).

Bonjour @desaintflorent ,

Je ne suis pas sûr que ce soit ce que vous avez demandé, mais d'après ce que @ hi019 a dit, vous pouvez remplacer le MeilisearchServiceProvider pour utiliser un client http personnalisé.

Exemple:

php artisan make:provider MeilisearchServiceProvider
<?php

namespace App\Providers;

use MeiliSearch\Client;

class MeilisearchServiceProvider extends \Meilisearch\Scout\MeilisearchServiceProvider
{
    public function register()
    {
        parent::register();

        $this->app->singleton(Client::class, function () {
            return new Client(config('meilisearch.host'), config('meilisearch.key'), new \GuzzleHttp\Client(['timeout' => 0.01]));
        });
    }
}

En toi config/app.php

'providers' => [
    // Other Service Providers

    App\Providers\MeilisearchServiceProvider::class,
],

Ensuite, vous devez désactiver la découverte automatique de Meilisearch en ajoutant ce qui suit à votre composer.json

   ...
    "extra": {
        "laravel": {
            "dont-discover": [
                "meilisearch/meilisearch-laravel-scout"
            ]
        }
    },
   ...

Et si je ne manque pas quelque chose, tu devrais être bon, le délai d'attente lancera un MeiliSearch\Exceptions\CommunicationException

try {
    $movies = Movie::search('b')->get();
} catch (\MeiliSearch\Exceptions\CommunicationException $e) {
    // do something
}

Si quelqu'un a une meilleure option, je serai heureux de le lire :sourire:

@shokme , vous devriez probablement enregistrer le fournisseur dans app.php à la place : https://laravel.com/docs/8.x/providers#registering -providers

@shokme , vous devriez probablement enregistrer le fournisseur dans app.php à la place : https://laravel.com/docs/8.x/providers#registering -providers

En effet, j'ai pris l'exemple de l'installation locale du télescope mais vous avez raison, je pense aussi que c'est mieux.

Merci à tous pour votre aide !

@shokme votre exemple fonctionne parfaitement, j'ai compris votre code mais il m'aurait fallu beaucoup de temps pour comprendre cela :) Alors merci beaucoup pour votre aide.

Juste une chose, lorsque j'ai désactivé la découverte automatique de Meilisearch, j'ai eu une erreur lors de l'exécution d'une recherche ("Pilote [meilisearch] non pris en charge.")
Mais en ne le désactivant pas, cela fonctionne sur mon environnement local. Je vais essayer en production bientôt.
Pourquoi est-il important de le désactiver ?

J'ai essayé de reproduire votre erreur et le seul moyen était de ne pas étendre \Meilisearch\Scout\MeilisearchServiceProvider partir de App\Providers\MeilisearchServiceProvider .

Mais, le code que je vous ai montré provient principalement du package du télescope. Ainsi, "dont-discover" n'enregistrera pas le package par défaut et vous permettra de le charger en cas de besoin. mon erreur, vous pouvez éviter cela .

Maintenant, environ App\Providers\MeilisearchServiceProvider , Si j'ai raison et que vous n'étendez pas le fournisseur du package, cela fonctionne, bien. Mais pour être honnête, je ne sais pas comment cela sera géré dans les coulisses.
Je suppose que le package Meilisearch sera enregistré, puis le fournisseur personnalisé sera enregistré et remplacera le singleton client. Votre choix d'étendre ou non sur celui-là car je ne suis pas en mesure de donner une réponse claire.

Au fait, aujourd'hui, laravel-scout 9 a été publié avec le support de meilisearch en tant que package propriétaire, vous voudrez peut-être l'utiliser, le code de ce package a été fusionné à l'intérieur de scout afin qu'il ne change rien pour vous.

Cette page vous a été utile?
0 / 5 - 0 notes