PHP APC Zwischenspeichern oder nicht cachen?

8

Ich habe überhaupt keine Erfahrung mit Caching, also mag das wie eine dumme Frage erscheinen, aber woher weißt du, wann du deine Daten zwischenspeichern sollst? Ich war nicht einmal in der Lage, eine Seite zu finden, die darüber sprach, aber es könnten nur meine Suchfähigkeiten oder vielleicht zu viele Variablen sein, die ich berücksichtigen sollte.

Ich werde wahrscheinlich APC verwenden. Hat jemand Beispiele dafür, was die geringste Menge an Daten wäre, die Sie benötigen, um es zu cachen? Angenommen, Sie haben ein Array mit 100 Elementen, und Sie verwenden eine foreach-Schleife und führen eine einfache Array-Manipulation durch, sollten Sie das Ergebnis zwischenspeichern? Wie wäre es, wenn es 1000 Artikel, 10000 Artikel, etc. hätte?

Sollten Sie die Ergebnisse Ihrer Datenbankabfrage zwischenspeichern? Welche Art von Abfragen sollten Sie im Cache speichern? Ich nehme an, eine einfache Auswahl und vielleicht ein Paar Joins-Anweisung zu einer MySQL-Datenbank muss nicht zwischengespeichert werden, oder tut es? Angenommen, der mysql-Abfragecache ist aktiviert, bedeutet das, dass Sie nicht in der Anwendungsebene zwischenspeichern müssen, oder sollten Sie das noch tun?

Wenn Sie ein Objekt instanziieren, sollten Sie es zwischenspeichern? Wie man bestimmt, ob es zwischengespeichert werden sollte oder nicht? Also eine allgemeine Anleitung, was zu cachen wäre nett, Beispiele wären auch sehr hilfreich, danke.

    
Joker 02.02.2011, 06:37
quelle

2 Antworten

10

Wenn Sie Daten zwischenspeichern, die in APC / memcache / WinCache / redis / etc aus der Datenbank gelesen wurden, sollten Sie beachten, dass sie nicht aktualisiert werden, wenn die Datenbank aktualisiert wird, es sei denn, Sie behalten explizit den Code ein die Datenbank und der Cache synchron Daher ist Caching am effektivsten, wenn sich die Daten aus der Datenbank nicht häufig ändern, sondern auch eine komplexere und / oder kostspieligere Abfrage erfordert, um diese Daten aus der Datenbank abzurufen (andernfalls können Sie sie auch aus der Datenbank lesen, wenn Sie brauche es) ... so teuer Join-Abfragen, die die gleichen Datensätze zurückgeben, wenn sie ausgeführt werden, sind Hauptkandidaten. Und testen Sie immer, ob Abfragen schneller aus der Datenbank gelesen werden als aus dem Cache. Korrekte Datenbankindizierung kann die Zugriffszeiten auf Datenbanken erheblich verbessern, zumal die meisten Datenbanken auch ihren eigenen internen Cache behalten. Verwenden Sie daher keine APC oder äquivalente Daten, um Daten zwischenzuspeichern, es sei denn, die Datenbanküberschüsse rechtfertigen dies.

Sie müssen auch die Speicherplatzbelegung im Cache beachten. Die meisten Caches haben eine feste Größe und Sie möchten sie nicht überfüllen ... Verwenden Sie sie daher nicht zum Speichern großer Datenmengen. Verwenden Sie das apc.php-Skript, das mit APC verfügbar ist, um die Cache-Nutzung zu überwachen (stellen Sie jedoch sicher, dass es für niemanden und jeden zugänglich ist, der auf Ihre Website zugreift .... schlechte Sicherheit).

Wenn Objekte im Cache gehalten werden, wird das Objekt beim Speichern serialisiert () und beim Abrufen serialisiert (), so dass ein Overhead entsteht. Objekte mit Ressourcenattributen verlieren diese Ressource; Speichern Sie daher Ihre Datenbankzugriffsobjekte nicht.

Es ist sinnvoll, nur den Cache zu verwenden, um Informationen zu speichern, auf die viele / alle Benutzer zugreifen, anstatt benutzerspezifische Daten. Speichern Sie für Benutzersitzungsinformationen bei normalen PHP-Sitzungen.

    
Mark Baker 02.02.2011, 09:35
quelle
0

Die einfache Antwort ist, dass Sie Daten zwischenspeichern, wenn es langsam wird. Offensichtlich müssen Sie für jede mittelgroße bis große Anwendung viel mehr planen als nur einen abwartenden Ansatz. Aber für die überwiegende Mehrheit der Websites da draußen stellt sich die Frage, "Sind Sie mit der Ladezeit zufrieden". Natürlich, wenn Sie über die Ladezeit, wie ich, obsessiv sind, werden Sie versuchen wollen, es sogar noch schneller zu machen.

Als nächstes müssen Sie herausfinden, was genau die Ursache für die Langsamkeit ist. Sie haben angenommen, dass Ihr Anwendungscode die Quelle war, aber es lohnt sich, diese zu untersuchen, wenn andere externe Faktoren wie große Seitengröße, übermäßige Anforderungen, kein gzip usw. vorhanden sind. Verwenden Sie eine Website wie Ссылка oder eine Erweiterung wie yslow als Anfang dafür. (Quick-Tipp stellen Sie sicher, dass Keepalives und Gzip funktionieren).

Angenommen, das Problem ist die Dauer der Ausführung Ihres Anwendungscodes, werden Sie Ihren Code mit etwas wie xdebug (http://www.xdebug.org/) profilieren und die Ausgabe mit kcachegrind oder wincachegrind anzeigen wollen. Dadurch erfahren Sie, welche Teile Ihres Codes lange dauern. Von dort aus treffen Sie Entscheidungen darüber, was Sie zwischenspeichern und wie Sie es zwischenspeichern (oder die Logik Ihres Codes verbessern).

Es gibt so viele Möglichkeiten für das Problem und die damit verbundenen Lösungen, dass es sich nicht lohnt zu erraten. Sobald Sie das Problem erkannt haben, möchten Sie möglicherweise eine neue Frage zur Lösung dieses Problems stellen. Ich werde sagen, dass der mysql-Abfragecache kontraproduktiv sein kann, wenn er nicht richtig verwendet wird. Außerdem vermeide ich generell den APC-Benutzercache zugunsten von memcached.

    
Sameer Parwani 15.03.2011 03:51
quelle

Tags und Links