Zum Inhalt springen

Probleme mit Cach

Erstellt am 6. Oktober 2017 · 6 Antworten · letzte Antwort am 9. Oktober 2017

Tags: Cache & Performance, Frage

Power-Poler ·

Guten Tag,
Habe da ein Problem mit dem Typo3 Cache System.
Und zwar habe ich eine Frontend Extension erstellt, welches das Erstellen von Nachrichten ermöglicht.
Es funktioniert alles soweit gut, bis ich zum Testen denn Typo3 Cache wieder aktiv geschalten habe.

public function createAction(array $newEntry) {
		$objectManager = GeneralUtility::makeInstance('TYPO3\\CMS\\Extbase\\Object\\ObjectManager');
		$this->bulletinboardRepository = $objectManager->get('MyVendor\\Bulletinboard\\Domain\\Repository\\BulletinboardRepository');
		
		if($GLOBALS['TSFE']->fe_user->user['uid'] !== NULL){
			$this->bulletinboardEntry = new \MyVendor\Bulletinboard\Domain\Model\Bulletinboard($newEntry[title],$newEntry[bodytext],$GLOBALS['TSFE']->fe_user->user['username'], '0', '0', (string)($GLOBALS['TSFE']->fe_user->user['uid']), time(),time(),time()+(604800*$newEntry['weeks']));
			$this->bulletinboardRepository->add($this->bulletinboardEntry);
		}
        $this->cacheService->clearPageCache(95);
	return header('Location:'.$_SERVER['HTTP_REFERER']);
    }

Leider scheint hier der Cache nicht geleert zu werden, die neue Nachricht wird nicht angezeigt.
Wenn ich die Funktion in der listAction aufrufe (beim Laden der Seite) dauert es gefühlt 1min bis der Beitrag Angezeigt wird (F5 im Browser)
Das kuriose, für das Löschen von Beiträgen verwände ich dieselbe Funktion. Diese greift sofort, der Beitrag wird nicht mehr angezeigt.

public function deleteAction(){
		$objectManager = GeneralUtility::makeInstance('TYPO3\\CMS\\Extbase\\Object\\ObjectManager');
		$this->bulletinboardRepository = $objectManager->get('MyVendor\\Bulletinboard\\Domain\\Repository\\BulletinboardRepository');
		if($this->request->getArgument('bulletin')){
			$uid = $this->request->getArgument('bulletin');
		}
		else{
			$uid = '-1';
		}
		$entry = $this->bulletinboardEntry = new \MyVendor\Bulletinboard\Domain\Model\Bulletinboard();
		$entry = $this->bulletinboardRepository->findByUid($uid);
		$entry->setDeleted("1");
		$this->bulletinboardRepository->update($entry);
		$this->cacheService->clearPageCache(95);
		return header('Location:index.php?id=95');
	}

Gibt es noch eine andere Möglichkeit den Cache neu laden zu lassen?
Schon mal Danke für eine Antwort
Mfg
Power-Poler

freeatweb ·

Hallo,

ich würde diese Anforderung via Page TS-Config lösen.

Im Backend in den Seiteneigeschaften der Seite oder des Sysfolders folgendes Page TS-config eintragen:

TCEMAIN.clearCacheCmd = page-uid der ausgabeseite(n)

Mit dieser Einstellung wird der Cache der jeweiligen Ausgabeseite(n) immer dann gelöscht, wenn es in den Inhalten Änderungen gibt

Lg

Power-Poler ·

Danke für den Hinweis. Dies befindet sich aber bereits in der TSConfig der Seite. (Und vorsichtshalber auch im Ordner) Leider bringt dies keine Veränderung.
Habe es jetzt auch mal über "$GLOBALS['TSFE']->clearPageCacheContent_pidList('95');"
versucht. auch dies bringt keinen Erfolg.
Bisher war das einzige was geholfen hat, es in die ListAction Aufzunehmen, und bei jedem laden der Seite den Cache zu löschen. Dies kann doch aber nicht Sinn der Sache sein.

Und wie gesagt. Das Löschen eines Beitrages wird direkt übernommen. Scheinbar ist es so, dass der Inhalt der aus der Datenbank geladen wird, nicht mit gelöscht wird.

Pingbeat ·

Wie sieht es denn aus wenn du die Action in der Pluginkonfiguration in der ext_localconf.php zu den non-cacheable-actions hinzufügst?

in etwa so:

\TYPO3\CMS\Extbase\Utility\ExtensionUtility::configurePlugin(
            'vend.extension',
            'ext',
            [
                'Plugin' => 'create'
            ],
            // non-cacheable actions
            [
                'Plugin' => 'create'
            ]
);
Power-Poler ·

Habe ich gemacht.
Hab jetzt aber vorerst eine "Lösung" gefunden, auch wenn ich noch nicht zufrieden damit mit, allerdings leidet die Performance der Seite nicht darunter.
Habe jetzt die list Action als non cache deklariert.
Alle anderen Caches sind aktiv.
Nach dem Erstellen eines Beitrages dauert es 15-30s bis dieser Global erscheint. (Mit IE erstellt und in Firefox F5 gedrückt, bis der Beitrag erschien.)
Habe auch, zum Testen, die Funktion $this->cacheService->clearPageCache(95); aus der löschen Action entfernt. Das gleiche verhalten wie mit. Der Beitrag verschwindet sofort... Kann mir das ganze nur so erklären, dass das updaten eines Datenbank Eintrages, gleichzeitig denn Cache beeinflusst. Das adden allerdings nicht, und somit irgendein Timer, denn ich noch nicht ausfindig gemacht habe, ablaufen muss, bis die Beiträge erneut aus der Datenbank gezogen werden.
Wenn list Action gecacht wird, erscheint der Beitrag übrigens gar nicht (außer ich lösche den Cache bei jedem Aufruf der list Action, dies sorgt aber wiederrum nur dafür, dass es erneut 15-30s dauert, bis der Beitrag erscheint. Und das Laden der Seite verzögert wird.
EDIT:
Habe jetzt meinen eigenen Datenbank Zugriff geschrieben:

	public function getAllBulletin(){
		$query = $this->createQuery();
		$sql = 'SELECT * FROM tx_bulletinboard_domain_model_bulletinboard WHERE deleted = "0" AND hidden = "0" AND endtime > "'.time().'"';
		$query->statement($sql);
		return $query->execute();
	}

Also umgehe ich quasi die findAll Methode. Das funktioniert jetzt, der Beitrag erscheint sofort.
Allerdings besteht jetzt das "Problem" bei gleichzeitigem Abschicken einer Nachricht, und neu laden der Seite in einem anderen Browser, bekomme ich die Meldung: " page is being generated"
Wie mans macht, man macht es falsch... 🙁

EDIT:
Pids vergessen
public function getAllBulletin(){
$query = $this->createQuery();
$Pids = $query->getQuerySettings()->getStoragePageIds();
$Pid = '(';
$i = 0;
while ($i<(count($Pids)-1)){
$Pid.='"'.$Pids[$i].'",';
$i++;
}
$Pid.='"'.$Pids[$i].'")';
$sql = 'SELECT * FROM tx_bulletinboard_domain_model_bulletinboard WHERE deleted = "0" AND hidden = "0" AND endtime > "'.time().'" AND pid IN '.$Pid;
$query->statement($sql);

return $query->execute();
}
Jetzt wird Pid berücksichtigt.