Zum Inhalt springen

Cache von page x durch eigene EXT löschen

Erstellt am 8. März 2005 · 3 Antworten · letzte Antwort am 9. März 2005

Tags: Cache & Performance, Frage

escapedPrisoner ·

Hallo!

ich möchte eine eigene Extension flotter machen und das Typo3-Caching NICHT mehr abschalten. Dazu hätte ich gern Euren Rat.

Wenn ein Benutzer die Seite ansieht, haben sich die Daten meist nicht geändert, ich würde deshalb gern den Cache selbst löschen, wenn tatsächlich Daten geUPDATet bzw. geINSERTet 8-) wurden.

Man könnte es "händisch" machen, in dem man wohl ein
* DELETE FROM cache_pages where page_id = x und ein
* DELETE FROM cache_pagesection where page_id = x abschickt.

Aber ich würde natürlich lieber die API direkt aufrufen (Also eine 3.5-Installation, und eine 3.6.2-Installation).
In welcher Typo3-Klasse steckt das denn?

Please help 😃

Greetz
Daniel

Spyker ·

suchst du das hier?

/**
02338          * Clearing the cache based on a page being updated
02339          * If the $table is 'pages' then cache is cleared for all pages on the same level (and subsequent?)
02340          * Else just clear the cache for the parent page of the record.
02341          *
02342          * @param       string          Table name of record that was just updated.
02343          * @param       integer         UID of updated / inserted record
02344          * @return      void
02345          */
02346         function clear_cache($table,$uid) {
02347                 global $TCA;
02348 
02349                 $uid = intval($uid);
02350                 if (is_array($TCA[$table]) && $uid > 0) {
02351 
02352                                 // If table is "pages":
02353                         if (t3lib_extMgm::isLoaded('cms'))      {
02354                                 if ($table=='pages')    {
02355 
02356                                                 // Builds list of pages on the SAME level as this page:
02357                                         $res_tmp = $GLOBALS['TYPO3_DB']->exec_SELECTquery(
02358                                                                         'A.pid AS pid, B.uid AS uid, B.title AS title',
02359                                                                         $table.' AS A, '.$table.' AS  B',
02360                                                                         'A.uid='.intval($uid).' AND B.pid=A.pid'
02361                                                                 );
02362 
02363                                         $list_cache = array();
02364                                         $pid_tmp = 0;
02365                                         while ($row_tmp = $GLOBALS['TYPO3_DB']->sql_fetch_assoc($res_tmp)) {
02366                                                 $list_cache[] = $row_tmp['uid'];
02367                                                 $pid_tmp = $row_tmp['pid'];
02368                                         }
02369                                         $list_cache[] = $pid_tmp;
02370 
02371                                                 // Delete cache for selected pages:
02372                                         $GLOBALS['TYPO3_DB']->exec_DELETEquery('cache_pages','page_id IN ('.implode(',',$GLOBALS['TYPO3_DB']->cleanIntArray($list_cache)).')');
02373                                         $GLOBALS['TYPO3_DB']->exec_DELETEquery('cache_pagesection', 'page_id IN ('.implode(',',$GLOBALS['TYPO3_DB']->cleanIntArray($list_cache)).')');
02374                                 } else {        // For other tables than "pages", delete cache for the records "parent page".
02375                                         $uid_page = $this->getPID($table,$uid);
02376                                         if ($uid_page>0)        {
02377                                                 $GLOBALS['TYPO3_DB']->exec_DELETEquery('cache_pages', 'page_id='.intval($uid_page));
02378                                                 $GLOBALS['TYPO3_DB']->exec_DELETEquery('cache_pagesection', 'page_id='.intval($uid_page));
02379                                         }
02380                                 }
02381                         }
02382 
02383                                 // Clear cache for pages entered in TSconfig:
02384                         list($tscPID) = t3lib_BEfunc::getTSCpid($table,$uid,'');
02385                         $TSConfig = $this->getTCEMAIN_TSconfig($tscPID);
02386                         if ($TSConfig['clearCacheCmd']) {
02387                                 $Commands = t3lib_div::trimExplode(',',strtolower($TSConfig['clearCacheCmd']),1);
02388                                 $Commands = array_unique($Commands);
02389                                 foreach($Commands as $cmdPart)  {
02390                                         $this->clear_cacheCmd($cmdPart);
02391                                 }
02392                         }
02393 
02394                                 // Call post processing function for clear-cache:
02395                         global $TYPO3_CONF_VARS;
02396                         if (is_array($TYPO3_CONF_VARS['SC_OPTIONS']['t3lib/class.t3lib_tcemain.php']['clearCachePostProc']))    {
02397                                 $_params = array('table' => $table,'uid' => $uid,'uid_page' => $uid_page);
02398                                 foreach($TYPO3_CONF_VARS['SC_OPTIONS']['t3lib/class.t3lib_tcemain.php']['clearCachePostProc'] as $_funcRef)     {
02399                                         t3lib_div::callUserFunction($_funcRef,$_params,$this);
02400                                 }
02401                         }               
02402                 }
02403         }

Aus der Datei class.t3lib_tcemain.php Zeilen stehen ja vor :-)

MfG Tim

escapedPrisoner ·

Thanx! :-)

das ist ein harter Brocken. :o Hm, hoffentlich ist die Nutzung nicht auf die CoreEngine beschränkt.

Hat das denn schon mal jemand in ner EXT angesprochen?

Hab mal kurz reingespickt - Also eigentlich müssten die folgen Dinge ja während dem Extension-Abarbeiten schon korrekt gesetzt sein (hoffe ich):

$TCA und $GLOBALS['TYPO3_DB']
t3lib_BEfunc::getTSCpid($table,$uid,'') // for pages entered in TSconfig
$TSConfig['clearCacheCmd']
$TYPO3_CONF_VARS
$TYPO3_CONF_VARS['SC_OPTIONS']

Pech nur, wenn die Umgebung für eine Frontend-EXT doch nicht ganz da ist (denn t3lib_BEfunc::getTSCpid riecht nach Backend).

Greetz
Daniel

escapedPrisoner ·

So, also wenn jemand den GANZEN cache löschen will klappt das damit:

// man muss aber in dem Moment als Admin eingeloggt sein!
// oder als ein BE-User der den cache löschen darf
$tce = t3lib_div::makeInstance('t3lib_TCEmain');
$tce->start(Array(),Array());
$tce->clear_cacheCmd('all');

Um den cache für page 123 also zu löschen macht man das so (eigentlich recht cool!!):

// man muss aber in dem Moment als Admin eingeloggt sein!
// oder als ein BE-User der den cache löschen darf
$tce = t3lib_div::makeInstance('t3lib_TCEmain');
$tce->start(Array(),Array());
$tce->clear_cacheCmd(123);

=> Tja, und wenn man es vom FE her tun möchte bleibt also momentan nur der "händische" Weg. Denn selbst WENN es momentan möglich sein sollte wäre das ein "verstecktes Feature" auf das deshalb nicht setzen kann. Denn die Sicherheitsbeschränkung die Kasper eigentlich möchte (Admin-Rechte) wären umgangen. Tja, schade.

Super wäre also die pibase um so eine cache-Ansteuerung zu erweitern.

Oder hab ich da nen Denkfehler drin?
Greetz
Daniel