Ich bastel aktuell mal wieder an meiner eigenen Seite bißchen blog und so und musste jetzt einfach feststellen, dass Zend_Navigation wenn man es für die Sitemap oder Breadcrumb benutzt in der Praxis extrem viel Speicher frisst. Die aktuellen Testdaten sind ca 200 Artikel in Form von Texten, Blogeinträgen und Codeschnipseln und ca 400 Tags, was da jeder Tag ja auch über eine Seite gelistet wird zu einer ~ 600 großen Zend_Navigation führt. Und das ist der Start-Stand, das wird ja sobald ich das ganze betreibe noch
mehr.
Das Objekt cache ich natürlich (apc), weil das jedes mal zum erstellen inklusive Datenbankabrufen etc zu lange dauern würde, aber das Objekt ist halt jetzt schon sehr groß, in apc serialisiert belegt es ~ 540kb, sobald ich es aus dem Cache Hole braucht der PHP-Prozess dafür 3,5 MB
mehr Speicher. ~ 600 KB gehen dabei für die ganzen Zend_Navigation_*-Klassen die geladen werden drauf und der Rest für die Daten selbst.
Manche meiner Seiten brauchen daher aktuell schon zwischen 7 und 11 MB speicher, was ich doch etwas viel finde. Neben dem ZF kommt halt noch Doctrine zum Einsatz, was natürlich auch seinen Teil dazu beiträgt.
Um jetzt z.b. das Zend_Navigation-Objekt nicht
mehr laden zu müssen hab ich angefangen in den Views selbst (unschön ich weis)
Navigationen und Breadcrumbs zu cachen bzw. aus dem Cache zu holen.
z.b. so
PHP-Code:
<?php
$id = 'FrontendBreadcrumb' . sha1($_SERVER['REQUEST_URI']);
$cache = CacheModel::getCache('system');
$breadcrumb = $cache->load($id);
if (!$breadcrumb) {
$breadcrumb = (string)$this->navigation(NavigationModel::getCompleteNavigationCached())
->breadcrumbs()
->setLinkLast(false)
->setMinDepth(0)
->setSeparator(' ?' . PHP_EOL);
$cache->save($breadcrumb, $id);
}
echo $breadcrumb;
?>
Das ganze werde ich wohl noch in einen View-Helper packen.
Hat vielleicht noch jemand eine bessere Idee wie man sich dem hohen Speicherverbrauch entgegenstellen kann, weil auch wenn das ganze auf nem Root-server laufen wird, so ist der doch schon etwas kleiner und älter (2200er mit 512 RAM) und neben dem Apache, mysql und co laufen dort auch noch ein Mailserver, Jabberserver, VPN und ein paar andere Dienste, da ist also schon einiges an Speicher belegt.
Der Ansatz des Cachens kompletter Seiten hab ich auch schon einfließen lassen, allerdings nur z.b. für die Tags-Seiten und die "statischeren" Seiten, weil alle anderen Seiten meist Kommentar-Formulare die auch via Cookie/Session-Daten befüllt werden sollen enthalten, aber das mit $_SESSION / $_COOKIE löst ja Zend_Cache_Frontend_Page von sich aus und nutzt dort keinen Cache.
Falls also noch jemand ne Idee hat wie man z.b. die Speicherverbrauch des Zend_Navigation-Objektes veringern kann oder wie man das mit den gecachten Navs etwas feiner löst, würde ich mich über ein paar Ideen freuen.