diff --git a/app/Http/Controllers/MetaGerSearch.php b/app/Http/Controllers/MetaGerSearch.php index 22289cad828c7a27ab621c1c9282239cdd9944cf..025be641dc3dff49d37d850274e470679da031fd 100644 --- a/app/Http/Controllers/MetaGerSearch.php +++ b/app/Http/Controllers/MetaGerSearch.php @@ -76,10 +76,21 @@ class MetaGerSearch extends Controller return response($responseContent); } + $quicktips = $metager->createQuicktips(); + if (!empty($timings)) { + $timings["createQuicktips"] = microtime(true) - $time; + } + # Suche für alle zu verwendenden Suchmaschinen als Job erstellen, # auf Ergebnisse warten und die Ergebnisse laden $metager->createSearchEngines($request, $timings); + # Versuchen die Ergebnisse der Quicktips zu laden + $quicktipResults = $quicktips->loadResults(); + if (!empty($timings)) { + $timings["loadResults"] = microtime(true) - $time; + } + $metager->startSearch($timings); $metager->waitForMainResults(); @@ -128,7 +139,7 @@ class MetaGerSearch extends Controller } # Die Ausgabe erstellen: - $resultpage = $metager->createView(); + $resultpage = $metager->createView($quicktipResults); if ($spamEntry !== null) { try { Cache::put('spam.' . $metager->getFokus() . "." . md5($spamEntry), $resultpage->render(), 604800); diff --git a/app/MetaGer.php b/app/MetaGer.php index 0a3be40d6add9ba73c0a2c905d69706d27f83df3..5834d96dfaa63a70e56ccb76c8f80b00a1fee560 100644 --- a/app/MetaGer.php +++ b/app/MetaGer.php @@ -135,7 +135,7 @@ class MetaGer } # Erstellt aus den gesammelten Ergebnissen den View - public function createView() + public function createView($quicktipResults = []) { # Hiermit werden die evtl. ausgewählten SuMas extrahiert, damit die Input-Boxen richtig gesetzt werden können $focusPages = []; @@ -175,7 +175,7 @@ class MetaGer ->with('apiAuthorized', $this->apiAuthorized) ->with('metager', $this) ->with('browser', (new Agent())->browser()) - ->with('quicktips', action('MetaGerSearch@quicktips', ["search" => $this->eingabe])) + ->with('quicktips', $quicktipResults) ->with('focus', $this->fokus) ->with('resultcount', count($this->results)); } @@ -248,7 +248,7 @@ class MetaGer ->with('apiAuthorized', $this->apiAuthorized) ->with('metager', $this) ->with('browser', (new Agent())->browser()) - ->with('quicktips', action('MetaGerSearch@quicktips', ["search" => $this->eingabe, "quotes" => $this->sprueche])) + ->with('quicktips', $quicktipResults) ->with('resultcount', count($this->results)) ->with('focus', $this->fokus); break; @@ -1213,6 +1213,15 @@ class MetaGer } } + public function createQuicktips() + { + # Die quicktips werden als job erstellt und zur Abarbeitung freigegeben + $quicktips = new \App\Models\Quicktips\Quicktips($this->q, LaravelLocalization::getCurrentLocale(), $this->getTime()); + return $quicktips; + } + + + private function anonymizeIp($ip) { if (str_contains($ip, ":")) { diff --git a/app/Models/Quicktips/Quicktips.php b/app/Models/Quicktips/Quicktips.php index 1210568fe193be1f0f8295598e6249d8627d0fba..976e3d4cc18b3c73207d7139ab9056729d59aa51 100644 --- a/app/Models/Quicktips/Quicktips.php +++ b/app/Models/Quicktips/Quicktips.php @@ -3,53 +3,55 @@ namespace App\Models\Quicktips; use Cache; -use LaravelLocalization; +use Illuminate\Foundation\Bus\DispatchesJobs; +use Illuminate\Support\Facades\Redis; use Log; class Quicktips { + use DispatchesJobs; private $quicktipUrl = "/1.1/quicktips.xml"; - private $results = []; const QUICKTIP_NAME = "quicktips"; - const CACHE_DURATION = 60 * 60; + const CACHE_DURATION = 60; private $hash; - public function __construct($search, $quotes) + public function __construct($search, $locale, $max_time) { - $locale = LaravelLocalization::getCurrentLocale(); if (env("APP_ENV") === "production") { $this->quicktipUrl = "https://quicktips.metager.de" . $this->quicktipUrl; } else { $this->quicktipUrl = "https://dev.quicktips.metager.de" . $this->quicktipUrl; } - $this->startSearch($search, $quotes, $locale); + $this->startSearch($search, $locale, $max_time); } - public function startSearch($search, $quotes, $locale) + public function startSearch($search, $locale, $max_time) { - $url = $this->quicktipUrl . "?search=" . $this->normalize_search($search) . "&locale=" . $locale . ""es=" . $quotes; + $url = $this->quicktipUrl . "?search=" . $this->normalize_search($search) . "&locale=" . $locale; $this->hash = md5($url); - $results = null; + if (!Cache::has($this->hash)) { + if (!Redis::exists($this->hash)) { - try { - if (!Cache::has($this->hash)) { - $results = file_get_contents($url); - Cache::put($this->hash, $results, Quicktips::CACHE_DURATION); - } else { - $results = Cache::get($this->hash); - } - } catch (\Exception $e) { - Log::error($e->getMessage()); - } + // Queue this search + $mission = [ + "resulthash" => $this->hash, + "url" => $url, + "useragent" => "", + "username" => null, + "password" => null, + "headers" => [], + "cacheDuration" => self::CACHE_DURATION, + "name" => "Quicktips", + ]; - if ($results === null) { - $results = file_get_contents($url); - } + $mission = json_encode($mission); - $this->results = $this->loadResults($results); + Redis::rpush(\App\MetaGer::FETCHQUEUE_KEY, $mission); + } + } } /** @@ -58,8 +60,9 @@ class Quicktips * 2. Parse the results * Returns an empty array if no results are found */ - public function loadResults($resultsRaw) + public function loadResults() { + $resultsRaw = $this->retrieveResults($this->hash); if ($resultsRaw) { $results = $this->parseResults($resultsRaw); return $results; @@ -72,8 +75,27 @@ class Quicktips { $body = null; + $startTime = microtime(true); + if (Cache::has($this->hash)) { - $body = Cache::get($this->hash); + return Cache::get($this->hash, false); + } + + while (microtime(true) - $startTime < 0.5) { + $body = Redis::rpoplpush($this->hash, $this->hash); + if ($body === false || $body === null) { + usleep(50 * 1000); + } else { + break; + } + } + + if ($body === false) { + return false; + } + + if ($body === "no-result") { + return false; } if ($body !== null) { @@ -176,9 +198,4 @@ class Quicktips { return urlencode($search); } - - public function getResults() - { - return $this->results; - } } diff --git a/resources/less/metager/pages/resultpage.less b/resources/less/metager/pages/resultpage.less index a2a703ea1965582827ae6a5a7ecdf2f0dc31a7ca..a7b8077d7c9338de645c5531361d6c94c52380fb 100644 --- a/resources/less/metager/pages/resultpage.less +++ b/resources/less/metager/pages/resultpage.less @@ -1,5 +1,6 @@ @import "./resultpage/result-page.less"; @import "./resultpage/result.less"; +@import "./resultpage/quicktips.less"; @import "./resultpage/product.less"; @import "./resultpage/result-saver.less"; @import "./resultpage/keyboard-nav.less"; \ No newline at end of file diff --git a/resources/less/metager/pages/resultpage/quicktips.less b/resources/less/metager/pages/resultpage/quicktips.less index f7f3eb879083fa2a4d5f19dcd3a29e7936e60c2d..1627559d9565e280897db335b0fd4c8e5ac7325b 100644 --- a/resources/less/metager/pages/resultpage/quicktips.less +++ b/resources/less/metager/pages/resultpage/quicktips.less @@ -1,7 +1,7 @@ /* Quicktips */ -@import "../../variables.less"; -@import "../../general/cards.less"; -@import "../../general/general.less"; +// @import "../../variables.less"; +// @import "../../general/cards.less"; +// @import "../../general/general.less"; @quicktip-font-large: @result-font-large; @quicktip-font-medium: @result-font-medium; @quicktip-font-small: @result-font-small; diff --git a/resources/views/layouts/researchandtabs.blade.php b/resources/views/layouts/researchandtabs.blade.php index 17a26ccd3eae3913021bea12859c68c075c6baac..b0c59b3a9de4ad8caeeb4b02d96dfe43085ec044 100644 --- a/resources/views/layouts/researchandtabs.blade.php +++ b/resources/views/layouts/researchandtabs.blade.php @@ -34,11 +34,11 @@ </div> <div id="additions-container"> @include('layouts.keyboardNavBox') + <div id="quicktips"> @if( $metager->showQuicktips() ) - <div id="quicktips"> - <iframe src="{{ $quicktips }}" frameborder="0"></iframe> - </div> + @include('quicktips', ['quicktips', $quicktips]) @endif + </div> </div> @include('parts.footer', ['type' => 'resultpage', 'id' => 'resultPageFooter']) </div> diff --git a/resources/views/quicktips.blade.php b/resources/views/quicktips.blade.php index 6fa679cf65fd25ab3e02af788260f55783900250..f354bda8b7ff7dadefffc7704e3bf4325b39b28b 100644 --- a/resources/views/quicktips.blade.php +++ b/resources/views/quicktips.blade.php @@ -1,19 +1,5 @@ -<!DOCTYPE html> -<html lang="{{ LaravelLocalization::getCurrentLocale() }}"> -<head> - <meta charset="UTF-8"> - <meta name="viewport" content="width=device-width, initial-scale=1.0"> - <title>{{ $search }} - MetaGer Quicktips</title> - <link type="text/css" rel="stylesheet" href="{{ mix('css/quicktips.css') }}" /> - <link href="/fonts/liberationsans/stylesheet.css" rel="stylesheet"> - <link type="text/css" rel="stylesheet" href="{{ mix('css/fontawesome.css') }}" /> - <link type="text/css" rel="stylesheet" href="{{ mix('css/fontawesome-solid.css') }}" /> -</head> -<body id="quicktips"> @foreach($quicktips as $quicktip) <div class="quicktip" type="{{ $quicktip->type }}"> @include('parts.quicktip', ['quicktip' => $quicktip]) </div> -@endforeach -</body> -</html> +@endforeach \ No newline at end of file diff --git a/webpack.mix.js b/webpack.mix.js index 91565c2e243bffdfc366fe10fe028ee96cc9c072..30e9bbf50b657057402c542a335a9e3b89ef58f6 100644 --- a/webpack.mix.js +++ b/webpack.mix.js @@ -25,9 +25,6 @@ mix .less("resources/less/metager/metager-dark.less", "public/css/themes/metager-dark.css", { strictMath: true }) - .less("resources/less/metager/pages/resultpage/quicktips.less", "public/css/quicktips.css", { - strictMath: true - }) .less("resources/less/font-awesome/fontawesome.less", "public/css/fontawesome.css", { strictMath: true })