Um die Performance einer Webseite zu steigern, ist es in Mode gekommen statische Inhalte auf ein CDN (Content Delivery Network) auszulagern. Diese Server sind speziell für die Auslieferung von statischen Inhalten konfiguriert. Natürlich könnte man jetzt jedes Bild/Stylesheet/etc. mit einem absoluten Link auf den Content Delivery Network Server versehen. Dies schränkt allerdings unsere Flexibilität bei der Entwicklung und bei eventuellen Änderungen an der CDN Url ein.

Eine Variante ist der Einsatz des folgenden View Helper für das Zend Framework:

<?php
/**
 * View_Helper_StaticDomain
 *
 * @category PHP
 * @package  View_Helper
 */
class View_Helper_StaticDomain extends Zend_View_Helper_Abstract {
	const FOLDER_SUFFIX = '/';
	/**
	 * Current domain index.
	 *
	 * @var integer
	 * @since 1.0.0
	 */
	protected $currentDomainIndex = -1;
	/**
	 * Available domains.
	 *
	 * @var string
	 * @since 1.0.0
	 */
	protected static $domains = array();
	/**
	 * Cache.
	 *
	 * @var string
	 * @since 1.0.0
	 */
	protected static $cache = array();
	/**
	 * Add static domain to domain pool
	 *
	 * @param string $domain Domain in format: http://www.example.com
	 *
	 * @return void
	 */
	public static function addCdnDomain( $domain ) {
		// Add ending slash.
		if ( substr( $domain, -1 ) !== '/' ) {
			$domain = $domain . self::FOLDER_SUFFIX;
		}
		self::$domains[] = $domain;
	}
	/**
	 * Clear all known cdn domains
	 *
	 * @return void
	 */
	public static function clearAllCdnDomains() {
		self::$domains = array();
	}
	/**
	 * Return a static domain out of static domain pool.
	 *
	 * @param string $resource Resource to serve via static domain
	 *
	 * @return string
	 */
	public function staticDomain( $resource ) {
		// Remove leading slash.
		if ( substr( $resource, 0, 1 ) === '/' ) {
			$resource = substr( $resource, 1 );
		}
		// Prevents delivery of resource under different hostnames.
		if ( isset( self::$cache[$resource] ) === true ) {
			return self::$cache[$resource];
		}
		// Deliver the resource when no cdn domains are configured.
		if ( is_array( self::$domains ) === false
			|| count( self::$domains ) === 0
		) {
			return $resource;
		}
		// Incrementing the array index.
		$this->currentDomainIndex = ( $this->currentDomainIndex + 1 );
		// End of array?
		if ( isset( self::$domains[$this->currentDomainIndex] ) === false ) {
			$this->currentDomainIndex = 0;
		}
		// Cache element and deliver.
		self::$cache[$resource]
			= self::$domains[$this->currentDomainIndex] . $resource;
		return self::$cache[$resource];
	}
}

Bevor wir den View Helper einsetzen können, müssen wir ihm mitteilen hinter welcher/n Domain/s unser CDN zu finden ist. Dies kann während des Bootstrap Processes passieren:

// Wir haben mehrere Hostnames die auf unser CDN zeigen,
// um den parallelen Download von Ressourcen zu ermöglichen.
// Idealerweise kommen die Domains aus einer Konfigurationsdatei.
View_Helper_StaticDomain::addCdnDomain( 'http://cdn1.example.de' );
View_Helper_StaticDomain::addCdnDomain( 'http://cdn2.example.de' );

Dem View Helper wird in eurem Template die Ressource übergeben, die über das CDN ausgeliefert werden soll:

<img src="<?php echo $this->staticDomain( '/images/mein_bild.jpg' ); ?>" width="50" height="50" alt="Mein tolles Bild" />

Bei jeder Ressource wird der interne Counter hochgezählt. Existiert zu einem Wert kein Eintrag im Array, fangen wir wieder bei 0 an. Habt ihr keine Domain(s) konfiguriert, wird die Ressource ohne Veränderung zurückgegeben. Dies ist gerade während der Entwicklung sehr praktisch. Die statische Domain wird der Ressource vorangestellt. Bevor die Ressource zurückgegeben wird, speichern wie den Eintrag in unserem internen Cache Array. Das  Cache Array verhindert, das eine Ressource die mehrfach auf der Seite verwendet wird, unter unterschiedlichen Hostnames eingebunden wird.

1 Kommentar zu „CDN View Helper für Zend Framework“

  1. [...] http://antwerpes.it/cdn-view-helper-fur-zend-framework/2010/11/ [...]

Kommentieren

Code bitte mit [code]...[/code] markieren.