Prosty CDN Zend

Korzystanie z CDN staje się co raz popularniejsze. Duże firmy oferują gotowe rozwiązania wraz ze sposobami ich implementacji. Co mamy zrobić w sytuacji, w której nie chcemy korzystać z usług zewnętrznego dostawcy lub po prostu chcemy rozdzielić dostarczanie treści statycznych na kilka domen bez geolokalizacji? Po stronie skryptów strony w frameworku Zend można to zrobić przy pomocy odpowiedniego helpera.


W specyfikacji Zend (tutaj) możemy przeczytać, że helper to klasa zawierająca metody, które mogą być wykorzystywane w skryptach widoków. Pominę sposób definiowania tej klasy – jest on szerzej opisany w artykule, do którego prowadzi link i oczywiście zgodny z ogólną specyfikacją PHP.

Budowę klasy rozpoczynamy od utworzenia statycznej tablicy wg następującego wzorca:

static $_types = array(
    'default' => array('http://domain.com','/'),
    'images'  => array('http://static.domain.net','/public/images/user/'),
    'scripts' => array('http://static0.domain.net','/public/scripts/'),   
    'styles' => array('http://static1.domain.net','/public/styles/'),      
    'cache' => array('http://cache.domain.net','/library/tmp/cache/')
);

każdy z elementów tablicy zawiera etykietę (ta asocjacja zostanie później użyta do określenia, którą domenę chcemy otrzymać), pod którą znajduje się dwuelementowa tablica zawierająca właściwą domenę dla treści statycznych oraz ścieżkę, wskazującą gdzie treści się znajdują.

Podanie w  konfiguracji tych dwóch elementów pozwoli nam w przyszłości w szybki i prosty sposób zmieniać nie tylko domenę dla treści statycznych, ale także ich umiejscowienie w obrębie projektu (bądź systemu).

Zgodnie ze specyfikacją Zend helper musi zawierać co najmniej jedną metodę. W naszym wypadku pojedyncza metoda wystarczy, gdyż zadaniem tego helpera jest co do zasady jedynie generowanie adresu. Definiujemy więc metodę:

        public function cdn($_type = 'default', $_trailing = 1, $_domOnly = 0) {
            if (!isset(self::$_types[$_type])) {
				throw new Exception('No CDN set for resource type ' . $_type);
            }

			$url = self::$_types[$_type][0];

			if(!$_domOnly) {
				$url .= self::$_types[$_type][1];
			} else {
				$url .= '/';
			}

			if(!$_trailing) {
				$url = preg_replace('/\\/$/','',$url);
			}
          return $url;
        }

zdefiniowana metoda, dla wygody i uniwersalności użytkowania obsługuje trzy paramatry:

  1. $_type – asocjacja z etykietą w tablicy, domena CDN do pobrania
  2. $_trailing – umieszczanie „/” na końcu generowanego adresu
  3. $_domOnly – generowanie adresu tylko z domeną, bez ścieżki do danych

taka kombinacja parametrów umożliwia nam bezproblemowe użycie helpera w większości zastosowań. W zależności od kombinacji użytych parametrów możemy uzyskać adresy w następujących formatach:

http://cache.domain.net/library/tmp/cache
http://cache.domain.net/library/tmp/cache/
http://cache.domain.net
http://cache.domain.net/

Teraz wystarczy użyć helpera w interesujących nas widokach z zgodnie z wytycznymi dokumentacji Zend np.:

<img src="<?php echo $this->cdn('cache',0,0);?>/img.jpg" />

Cała klasa została załączona poniżej. Ze względów bezpieczeństwa plik ma rozszerzenie *.txt, w związku z tym należy zmienić je na *.php przed dołączeniem do projektu.

Podziel się:

Mikołaj Niedbała

I'm a Poland based IT administrator, linux administrator and IT engineer creating professional IT infrastructure solutions based on Linux and virtual environments.

Dodaj komentarz

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *