2 Stimmen

Kann jemand diesen Code beschleunigen?

Ich habe hier dieses Stück PHP, das sehr träge ist. Nicht Millisekunden-langsam, sondern verursacht eine Verzögerung beim Laden der Seite von 8 Sekunden.

Es zieht Schauspieler- und Regisseurinformationen aus einer externen Filmdatenbank mit einem JSON-String für jeden der 20 Filme auf der Seite.

Ich habe einige Tests gemacht und festgestellt, dass mein Code hier in Ordnung sein muss. Das Problem ist das 20-malige Verbinden mit der Datenbank.

Also, außer der Reduzierung der Anzahl von Filmen auf der Seite von 20, gibt es noch etwas, was ich tun könnte?

echo 'In den Hauptrollen
      ';
$num_actors = 0;
$films_result = $tmdb->getMovie($film->id);
$films = json_decode($films_result);
foreach ($films as $film) {
foreach ($film->cast as $cast) {
  if ($cast->job == 'Actor') {
    echo '' . $cast->name . ' ';
    $num_actors++;
    if ($num_actors == 5)
    break;
}
}
echo '
      Regisseur
      ';
foreach ($film->cast as $cast) {
  if ($cast->job == 'Director') {
    echo '' . $cast->name . ' ';
  }
}
echo '';

Ich weiß nicht, ob es hilft, aber hier ist die Dokumentationsseite der Datenbank zum Aufruf, den ich mache - http://api.themoviedb.org/2.1/methods/Movie.getInfo

1voto

webbiedave Punkte 47260

Durchlaufen Sie nicht zweimal die $film->cast Objekte (Schauspieler und Regisseur). Durchlaufen Sie stattdessen einmal, speichern Sie das HTML-Ergebnis in einer Variablen und geben Sie diese Variable am Ende der Schleife aus.

1voto

sirbrialliance Punkte 3552

Es gibt ein paar Möglichkeiten:

  1. Führen Sie die Aufrufe an die entfernte Datenbank parallel aus. Schauen Sie sich curl_multi an. Es ermöglicht Ihnen, mehrere Anfragen an entfernte Seiten gleichzeitig zu stellen.
  2. Da es sich so anhört, als ob der langsamste Teil der Zugriff auf die entfernte Datenbank ist, sollten Sie auch die Verwendung eines Zwischenspeicher-Mechanismus für die zurückgegebenen Datenbankergebnisse in Betracht ziehen, wie z.B. memcached oder apc, um die Ergebnisse für einen bestimmten Film aus einer vorherigen Anfrage zu speichern.
  3. Wenn 1 und/oder 2 nicht gut genug für Sie funktionieren, können Sie auch in Erwägung ziehen, die Film-Datenbank (wenn erlaubt) täglich oder wöchentlich in eine lokale sqlite/MySQL-Datenbank herunterzuladen und Ihre Ergebnisse von dort aus zu lesen.

0voto

Ian Wood Punkte 6429

Kann man davon ausgehen, dass getMovie nur Ergebnisse für 1 Film zurückgibt? Falls ja, könnten Sie die foreach-Schleife für $films entfernen, aber das lassen wir jetzt erstmal so.

Nicht zweimal schleifen - wenn Sie den Regisseur finden, gehen Sie zum nächsten Durchlauf über...

echo 'Mitwirkende
      ';

$films_result = $tmdb->getMovie($film->id);
$films = json_decode($films_result);
foreach ($films as $film) {
    $i=0;
    foreach ($film->cast as $cast) {
        if ($cast->job == 'Director') {
            $dir = $cast;
            continue;
        }
        if ($cast->job == 'Actor') {
            echo '' . $cast->name . ' ';

            if ($i%5 == 5) break;
        }
        $i++;
    }
    echo '
          Regisseur
          ';
    echo '' . $dir->name . ' ';
    echo '';

Dieses Skript zeigt maximal 5 Schauspieler - beachten Sie, dass dies möglicherweise nicht das ist, was Sie beabsichtigt haben.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X