Zrychlení generování odkazů

Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
dada-amater
Bronze Partner | 52
+
0
-

Hledal jsem jak zrychlit generování odkazů a protože jsem toho moc nenašel (krom rady cachuj co muzes), vytvoril jsem si novou funkci link().

<?php
	private static $linkCache;
	public function link($destination,$arg=array()){
		if($destination=='this' || substr($destination, -1)=="*")
			return parent::link($destination,$arg);
        $search=$arg;
        $i=0;
        $cache_key=$destination;
        foreach ($search as $key => $value) {
        	$i++;
        	$search[$key]='0000'.$i;	//nektere presentery chteji jako parametr numeric string, proto se neda pouzit hezci __$key__
        	$cache_key.="-".$key;
        }

		if(!isset(self::$linkCache[$cache_key])){
			$data=parent::link($destination,$search);
            self::$linkCache[$cache_key]=parent::link($destination,$search);
        }
        return str_replace($search,$arg,self::$linkCache[$cache_key]);
	}
?>

Je to primitivni „cachovani“, pokud mate na strance vice odkazu jednoho typu (tabulky, vypisy), dost to pomuze. Meril jsem rychlost (3 routy, 1 z toho jednosmerna):

  • normalni generovany odkaz typu Homepage:default bez cache: 0.0004s
  • normalni odkaz pri zapnute cache (cache miss): 0.0006
  • dalsi dotaz se stejnymi parametry (rozumej stejne promenne, ne hodnoty): 0.0001s

Pokud tedy nekde vyuzivate odkazy stejneho typu, tak to dokaze dost pomoci. Pouzivam to v basepresenteru a basecontrolu, takze mi pres to jedou veskere dotazy. Kazdy at si zmeri, jak mu to pomuze, u me je to zrychleni znat dost.

Zkousel jsem to cele ukladat do pernamentni cache (file,memcache), takze pak nedojde ani na prvni generovani pri requestu a jede to rovnou z cache. Jeste to trochu zrychli, ale musi se tam pak resit na kterem jste modulu/presenteru/komponenteu jste a nakonec ta rezie tu vyhodu castecne smaze.

Dotaz do publika:
Proc latte makro {ifCurrent} vola metodu link()? Cili {ifCurrent Homepage:*} vola link(„Homepage:*“), coz je podle me zbytecny. Zdrojaky jsem jeste neprochazel.

Editoval dada-amater (14. 3. 2013 13:16)