TwitchTV API Performance

error_on

Mitglied
Ich soll für einen Bekannten ein Script schreiben welches Daten von einer Streamingplattform holt und dort überprüft ob ein Stream online ist oder nicht.

Die API (von Twitch) ist recht simpel und ausreichend dafür, jedoch hab ich ein paar große Performanceprobleme und weiß nicht wie ich das Problem richtig angehe.

Zuerst hole ich mir den Streamernamen aus einer Datenbank, jetzt wirds schon "kniffelig".
Ich bekomme pro Stream folgenden Datensatz geliefert:
Channelname | Status
Status ist ein Wert von 0-2. 0 Steht für Auto, 1 für Online und 2 für Offline.
Jeder Channel der auf 0 steht muss überprüft werden ob er online oder offline ist.
Jeder Channel der auf 1 steht muss überprüft werden ob er online ist, wenn er offline ist, dann soll der Status auf 0 gesetzt werden.
Sinn der Sache dahinter ist, dass der User bestimmen kann ob sein Stream jedesmal angezeigt wird, wenn er seinen Stream online setzt, dafür der Modus 1 und 2. Leider wird nicht jeder User daran denken und seinen Stream auch wieder offline setzen wenn er offline geht. Wenn er auf 0 (Auto) steht, dann wird er immer angezeigt, wenn er online ist.

Folgendes ist bereits vorhanden:
PHP:
// [...]
$qry = mysql_query("SELECT * FROM streams WHERE status = 1 OR status = 0");
		while($row = mysql_fetch_array($qry)) {
	                  // Hier müsste ich jetzt für jeden Stream noch prüfen ob er online oder offline ist und dann ein UPDATE auf den status machen  
                                $streams[] = $row['channel']
                            }
                                $response = 'http://api.justin.tv/api/stream/list.json?channel='.implode(',', $streams']);
	                  $json_file = @file_get_contents($response, 0, null, null);

Grundsätzlich ist das kein Problem, die Streams die den Status 1 haben zu überprüfen ob online oder nicht, wenn ich aber in der while-Schleife jeden Stream abgrase, dann befürchte ich, dass die Performance stark drunter leidet.

Ich weiß leider nicht ob die Frage jetzt zu speziell ist oder ob sich jemand mit dem Problem vllt auch schon befasst hat, ansonsten bleibt mir nur das Twitch-Forum.
 
Wie oft muss den dieses Skript ausgeführt werden? Möglicherweise kann man es in regelmäßigen Abständen im Hintergrund via CronJobs ausführen lassen. Somit wären die Daten immer aktuell, würden aber die Auslieferung der Webseite an den Klienten nicht verzögern.
 
Aber dein Problem ist doch, dass in den Fällen, in denen es ausgeführt wird, die Auslieferung der Webseite zu stark verzögert wird? Insofern kannst du das doch auslagern in einen CronJob. Oder du aktualisierst bei jedem Skriptaufruf immer einen bestimmten Intervall von Streams, so dass du dies nicht mit allen gleichzeitig machen musst.
 
danke für den tipp, so hab ichs jetzt gemacht!

eine weitere frage hätte ich noch, leider etwas anderes.
Wenn ich ein mehrdimensionales Array habe, würde ich gerne einen gewissen teil wählen welcher einen bestimmten Wert hat.
Hier ein Beispiel:
PHP:
// Das hier ist mein Array
$array['zahl']['wert1']['name'];

// Ich möchte jetzt folgende Arrays haben
$array['zahl']['wert1'][...];
// bei dem Teil wo der Wert name z.b. Hans ist

// z.b.:
/*
0
->berlin
-->hans

1
->Hamburg
--->Helmut
*/
Also er soll mir in diesem Fall nur den Array auswählen der bei Zahl = 0 ist, weil dort im Feld Name der Wert Hans steht.
 
Wie jetzt? Du willst den Array haben, der bspw. hinter $array[0] steckt? Dann musst du doch nur folgendes machen:
PHP:
$result = $array[0];
 
Code:
[0] => Array
        (
            [title] => Overview 
            [channel] => Array
                (
                    [name] => Hans
                )
         )
[1] => Array
        (
            [title] => Mix 
            [channel] => Array
                (
                    [name] => Helmut
                )

Das ist die Ausgabe Arrays (gekürzt), ich möchte jetzt alles was hinter dem $array[0] steckt, weil dort der name den Wert Hans hat.
Wenn im zweiten Teil als Wert Hans unter name stünde, dann hätte ich natürlich gerne diesen.
)
 
So?
PHP:
$filter = function ($array, $term) {
  foreach ($array as $item)
  {
    if ($item["channel"]["name"] == $term)
    {
      return $item;
    }
  }
};

$callback($array, "Hans");
 
genau, bin leider mit deiner schreibweise nicht ganz zurecht gekommen, aber ich habs leicht geändert und jetzt funktioniert es, danke.
hab zwar gehofft es gibt bereits eine funktion von php, aber so gehts auch.
 
Ich könnte mich erinnern, dass es mal eine Funktion gab, die dieses Problem in etwa gelöst hat. Jedoch habe ich mit PHP nicht mehr so viel zu tun, weshalb ich solche spezielle Funktionen nicht mehr weiß, also ihren Namen. Aber ansonsten kannst du das hier auch mit array_filter lösen:
PHP:
$term = "Hans";
$result = array_filter($array, function ($value) use ($term) {
  return ($value["channel"]["name"] === $term);
});
 

Neue Beiträge

Zurück