Meilisearch-laravel-scout: Wie richte ich ein benutzerdefiniertes Zeitlimit für eine Suche ein?

Erstellt am 26. Apr. 2021  ·  8Kommentare  ·  Quelle: meilisearch/meilisearch-laravel-scout

Ich habe nach Ihrem großartigen Tutorial ein DigitalOcean-Droplet erstellt und verwende es erfolgreich mit Laravel 👌

Das einzige Problem, das ich habe, ist, wenn der Server heruntergefahren ist (manuell gestoppt oder CPU bei mehr als 100%).
Ich kann nicht finden, wo ich ein kurzes Timeout einstellen könnte, damit ich einen Fehler anzeigen könnte?
Im Moment lädt es auf unbestimmte Zeit und wartet auf eine Antwort vom toten Server.

Hilfreichster Kommentar

Hallo @desaintflorent ,

Ich bin mir nicht sicher, ob Sie danach gefragt haben, aber basierend auf dem, was @hi019 gesagt hat, können Sie den MeilisearchServiceProvider überschreiben, um einen benutzerdefinierten HTTP-Client zu verwenden.

Beispiel:

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]));
        });
    }
}

In dir config/app.php

'providers' => [
    // Other Service Providers

    App\Providers\MeilisearchServiceProvider::class,
],

Dann sollten Sie die automatische Erkennung von Meilisearch deaktivieren, indem Sie Folgendes zu Ihrer composer.json hinzufügen

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

Und wenn ich nichts verpasse, solltest du brav sein, die Auszeit wirft ein MeiliSearch\Exceptions\CommunicationException

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

Wenn jemand eine bessere Option hat, lese ich sie gerne :smile:

Alle 8 Kommentare

Hallo @desaintflorent , wenn ich mich nicht irre, bietet dieses Paket keine Option zum Festlegen eines Timeouts. Ich bin kein Laravel-Benutzer, daher kann ich mit Laravel keine Problemumgehung bereitstellen.
Wenn jemand einen Workaround kennt, kann er ihn gerne zu diesem Thema teilen 🙂

Ich freue mich zu lesen, dass Ihnen das DO-Tutorial in unserer Dokumentation gefallen hat. Wir tun unser Bestes, um Integrationen mit ansprechender Dokumentation bereitzustellen!

Ich glaube, dies müsste auf der Ebene des Meilisearch-PHP-Clients erfolgen, indem eine benutzerdefinierte GuzzleHTTP-Instanz an den Client übergeben wird: https://github.com/meilisearch/meilisearch-php#customize -your-http-client

Es gibt keine Möglichkeit, dies mit dem aktuellen zu tun. Vielleicht könnten wir dem Benutzer erlauben, einen benutzerdefinierten Meilisearch-PHP-Client in der Konfiguration zu übergeben

Dies wäre eine großartige Ergänzung. Laut dieser Ausgabe , in der ich den Kontext erkläre, wird dieses Repo jedoch keine neuen Ergänzungen haben, die nicht mit larvel/scout übereinstimmen
Wir könnten ein neues Repo erstellen, das eher ein Meilisearch-Laravel-Scout-erweitertes Plugin sein wird, und wir werden diese Art von Möglichkeit darin integrieren. Ich habe dieses Problem offen gelassen, da es eine gute Verbesserungsidee für das nächste Repo (oder die nächste Version dieses Repos) ist.

Hallo @desaintflorent ,

Ich bin mir nicht sicher, ob Sie danach gefragt haben, aber basierend auf dem, was @hi019 gesagt hat, können Sie den MeilisearchServiceProvider überschreiben, um einen benutzerdefinierten HTTP-Client zu verwenden.

Beispiel:

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]));
        });
    }
}

In dir config/app.php

'providers' => [
    // Other Service Providers

    App\Providers\MeilisearchServiceProvider::class,
],

Dann sollten Sie die automatische Erkennung von Meilisearch deaktivieren, indem Sie Folgendes zu Ihrer composer.json hinzufügen

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

Und wenn ich nichts verpasse, solltest du brav sein, die Auszeit wirft ein MeiliSearch\Exceptions\CommunicationException

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

Wenn jemand eine bessere Option hat, lese ich sie gerne :smile:

@shokme Sie sollten den Anbieter wahrscheinlich stattdessen in app.php registrieren: https://laravel.com/docs/8.x/providers#registering -providers

@shokme Sie sollten den Anbieter wahrscheinlich stattdessen in app.php registrieren: https://laravel.com/docs/8.x/providers#registering -providers

In der Tat habe ich das Beispiel von der lokalen Installation des Teleskops genommen, aber Sie haben Recht, ich denke auch, dass dies besser ist.

Vielen Dank für Ihre Hilfe!

@shokme dein Beispiel funktioniert perfekt, ich habe deinen Code verstanden, aber es hätte mich viel Zeit gekostet, das herauszufinden :) Also vielen Dank für deine Hilfe.

Nur eine Sache: Wenn ich die automatische Erkennung von Meilisearch deaktiviere, trat beim Ausführen einer Suche ein Fehler auf ("Treiber [meilisearch] wird nicht unterstützt." ).
Aber wenn ich es nicht deaktiviere, funktioniert es in meiner lokalen Umgebung. Werde es demnächst in der Produktion versuchen.
Warum ist es wichtig, es zu deaktivieren?

Ich habe versucht, Ihren Fehler zu reproduzieren, und die einzige Möglichkeit bestand darin, \Meilisearch\Scout\MeilisearchServiceProvider nicht von App\Providers\MeilisearchServiceProvider zu erweitern.

Aber der Code, den ich Ihnen gezeigt habe, stammt hauptsächlich aus dem Teleskoppaket. "Dont-Discover" wird das Paket also standardmäßig nicht registrieren und Ihnen erlauben, es bei Bedarf zu laden. Mein Fehler, das kannst du vermeiden .

Nun zu App\Providers\MeilisearchServiceProvider , wenn ich richtig liege und du den Anbieter aus dem Paket nicht erweiterst, funktioniert es, gut. Aber um ehrlich zu sein, bin ich mir nicht sicher, wie es hinter den Kulissen gehandhabt wird.
Meine Vermutung ist, dass das Meilisearch-Paket registriert wird und dann der benutzerdefinierte Anbieter registriert wird und das Client-Singleton überschreibt. Sie haben die Wahl, dies zu erweitern oder nicht, da ich keine klare Antwort geben kann.

Übrigens, heute wurde Laravel-Scout 9 mit der Unterstützung von Meilisearch als First-Party-Paket veröffentlicht, vielleicht möchten Sie es verwenden, der Code dieses Pakets wurde in Scout zusammengeführt, sodass sich für Sie nichts ändert.

War diese Seite hilfreich?
0 / 5 - 0 Bewertungen

Verwandte Themen

Cannonb4ll picture Cannonb4ll  ·  6Kommentare

elfeffe picture elfeffe  ·  30Kommentare

dmyers picture dmyers  ·  14Kommentare

husonghua picture husonghua  ·  5Kommentare

milosevicn picture milosevicn  ·  5Kommentare