From fda1ccd38e222e109e4dcad5b837b4a1bf73995d Mon Sep 17 00:00:00 2001
From: Dominik Pfennig <dominik@suma-ev.de>
Date: Wed, 8 Jun 2016 13:25:54 +0200
Subject: [PATCH] =?UTF-8?q?=C3=84nderungen=20in=20der=20Auswertung=20des?=
 =?UTF-8?q?=20Parameters=20"time"=20Wie=20lange=20auf=20alle=20Suchmaschin?=
 =?UTF-8?q?en=20gewartet=20wird=20entscheidet=20sich=20jetzt=20anhand=20vo?=
 =?UTF-8?q?n=203=20Parametern:=20Wenn=20die=20bisherige=20Zeit=20<=20500?=
 =?UTF-8?q?=20ms=20ist:=20=09Wird=20das=20Warten=20nur=20abgebrochen,=20fa?=
 =?UTF-8?q?lls=20alle=20Suchmaschinen=20geantwortet=20haben=20Wenn=20die?=
 =?UTF-8?q?=20bisherige=20Zeit=20>=3D=20500=20ms,=20aber=20kleiner=20der?=
 =?UTF-8?q?=20eingestellten=20Suchzeit=20ist:=20=09Wird=20das=20Warten=20a?=
 =?UTF-8?q?bgebrochen,=20falls=20mindestens=2080%=20der=20Suchmaschinen=20?=
 =?UTF-8?q?geantwortet=20haben.=20Wenn=20die=20bisherige=20Zeit=20>=3D=20d?=
 =?UTF-8?q?er=20eingestellten=20Suchzeit=20ist:=20=09Wird=20in=20jedem=20F?=
 =?UTF-8?q?all=20abgebrochen.?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

Dies sollte einige Probleme beheben, bei dem Suchergebnisse nicht geladen wurden.
---
 app/MetaGer.php             | 65 +++++++++++++++++++++++++++----------
 app/Models/Searchengine.php | 12 +++++--
 2 files changed, 57 insertions(+), 20 deletions(-)

diff --git a/app/MetaGer.php b/app/MetaGer.php
index 5206bd9ca..163987a73 100644
--- a/app/MetaGer.php
+++ b/app/MetaGer.php
@@ -218,7 +218,6 @@ class MetaGer
 
         #die(SocketRocket::get("tls", "dominik-pfennig.de", "", 443));
 
-
 		# Überprüfe, welche Sumas eingeschaltet sind
         $xml = simplexml_load_file($this->sumaFile);
         $enabledSearchengines = [];
@@ -239,12 +238,12 @@ class MetaGer
             foreach($sumas as $suma)
             {
                 if($request->has($suma["service"]) 
-                	|| ( $this->fokus !== "bilder" 
-                		&& ($suma["name"]->__toString() === "qualigo" 
-                			|| $suma["name"]->__toString() === "similar_product_ads" 
-                			|| ( !$overtureEnabled && $suma["name"]->__toString() === "overtureAds" )
-                			)
-                		)
+                	#|| ( $this->fokus !== "bilder" 
+                	#	&& ($suma["name"]->__toString() === "qualigo" 
+                	#		|| $suma["name"]->__toString() === "similar_product_ads" 
+                	#		|| ( !$overtureEnabled && $suma["name"]->__toString() === "overtureAds" )
+                	#		)
+                	#	)
                     #|| 1 === 1  #Todo: entfernen
                 	){
 
@@ -286,7 +285,7 @@ class MetaGer
             }
         }
 
-        if( ( $this->fokus !== "bilder" && $countSumas <= 0 ) || ( $this->fokus === "bilder" && sizeof($enabledSearchengines) === 0) )
+        if( $countSumas <= 0 )
         {
             $this->errors[] = "Achtung: Sie haben in ihren Einstellungen keine Suchmaschine ausgewählt.";
         }
@@ -316,19 +315,48 @@ class MetaGer
                 $this->sockets[$tmp->name] = $tmp->fp;
             }
 		}
-
         # Nun passiert ein elementarer Schritt.
         # Wir warten auf die Antwort der Suchmaschinen, da wir vorher nicht weiter machen können.
         # aber natürlich nicht ewig.
         # Die Verbindung steht zu diesem Zeitpunkt und auch unsere Request wurde schon gesendet.
         # Wir geben der Suchmaschine nun bis zu 500ms Zeit zu antworten.
-        usleep(500000);
+
         # Jetzt lesen wir alles aus, was da ist und verwerfen den Rest:
-        foreach($engines as $engine)
+        $enginesToLoad = count($engines);
+        $loadedEngines = 0;
+        $time = 0;
+        while( true )
         {
-            $engine->retrieveResults();
+            # Abbruchbedingung
+            if($time < 500)
+            {
+                if($loadedEngines >= $enginesToLoad)
+                    break;
+            }elseif( $time >= 500 && $time < $this->time)
+            {
+                if( ($loadedEngines / ($enginesToLoad * 1.0)) >= 0.8 )
+                    break;
+            }else
+            {
+                break;
+            }
+            foreach($engines as $engine)
+            {
+                if(!$engine->loaded)
+                {
+                    $success = $engine->retrieveResults();
+                    if($engine->loaded)
+                        $loadedEngines += 1;
+                }
+            }
+            usleep(50000);
+            $time += 50;
+        }
+        foreach( $engines as $engine )
+        {
+            if( !$engine->loaded )
+                $engine->shutdown();
         }
-
 
         $this->engines = $engines;
 	}
@@ -393,7 +421,8 @@ class MetaGer
         # Category
         $this->category = $request->input('category', '');
         # Request Times:
-        $this->time = $request->input('time', 1);
+        $this->time = $request->input('time', 1000);
+       
         # Page
         $this->page = $request->input('page', 1);
         # Lang
@@ -416,12 +445,12 @@ class MetaGer
         # Manchmal müssen wir Parameter anpassen um den Sucheinstellungen gerecht zu werden:
         if( $request->has('dart') )
         {
-        	$this->time = 10;
+        	$this->time = 10000;
         	$this->warnings[] = "Hinweis: Sie haben Dart-Europe aktiviert. Die Suche kann deshalb länger dauern und die maximale Suchzeit wurde auf 10 Sekunden hochgesetzt.";
         }
-        if( $this->time < 0 || $this->time > 20 )
+        if( $this->time <= 500 || $this->time > 20000 )
         {
-        	$this->time = 1;
+        	$this->time = 1000;
         }
         if( $request->has('minism') && ( $request->has('fportal') || $request->has('harvest') ) )
         {
@@ -438,7 +467,7 @@ class MetaGer
         }
         if( $request->has('ebay') )
         {
-        	$this->time = 2;
+        	$this->time = 2000;
         	$this->warnings[] = "Hinweis: Sie haben Ebay aktiviert. Die Suche kann deshalb länger dauern und die maximale Suchzeit wurde auf 2 Sekunden hochgesetzt.";
         }
         if( App::isLocale("en") )
diff --git a/app/Models/Searchengine.php b/app/Models/Searchengine.php
index 7763487e2..3feafc222 100644
--- a/app/Models/Searchengine.php
+++ b/app/Models/Searchengine.php
@@ -19,6 +19,7 @@ abstract class Searchengine
 	public $ads = [];
 	public $write_time = 0;
 	public $connection_time = 0;
+	public $loaded = false;
 
 	function __construct(\SimpleXMLElement $engine, MetaGer $metager)
 	{
@@ -231,6 +232,7 @@ abstract class Searchengine
 		// end of headers
 		if(sizeof($headers) > 1){
 			$bodySize = 0;
+			stream_set_blocking($this->fp, 1);
 			if( isset($headers["Transfer-Encoding"]) && $headers["Transfer-Encoding"] === "chunked" )
 			{
 				$body = $this->readChunked();
@@ -245,9 +247,10 @@ abstract class Searchengine
 			{
 				die("Konnte nicht herausfinden, wie ich die Serverantwort von: " . $this->name . " auslesen soll. Header war: " . print_r($headers));
 			}
+			$this->loaded = true;
 		}else
 		{
-			fclose($this->fp);
+			return;
 		}
 
 		Redis::del($this->host . "." . $this->socketNumber);
@@ -256,7 +259,6 @@ abstract class Searchengine
 		{
 			$body = $this->gunzip($body);
 		}
-
 		#print_r($headers);
 		#print($body);
 		#print("\r\n". $bodySize);
@@ -268,6 +270,12 @@ abstract class Searchengine
 		#exit;
 	}
 
+	public function shutdown()
+	{
+		fclose($this->fp);
+		Redis::del($this->host . "." . $this->socketNumber);
+	}
+
 	private function readBody($length)
 	{
 		$theData = '';
-- 
GitLab