Zend_Date i Zend_Config w Zend Framework

Mamy święta i dużo wolnego czasu, dlatego dzisiaj będziemy zajmo­wać się modu­łem Zend Frame­work odpo­wie­dzial­nym za czas – Zend_Date. Propo­nuję prze­czy­tać moje gryzmoły zamiast obja­dać się nadmier­nie karpiem czy co tam macie. Dodat­kowo zaha­czymy o Zend_Config w postaci odczytu, mody­fi­ka­cji i zapisu nowych danych do pliku .ini.

Będziemy robić moduł odpo­wie­dzialny za auto­ma­tyczne usuwa­nie dawno otwar­tych (a zatem niepo­trzeb­nych) jakichś plików na serwe­rze. Mogłyby to być pliki minia­tu­rek obraz­ków, które kiedyś nam system wyge­ne­ro­wał i są już niepotrzebne.

Domyśl­nie każda apli­ka­cja w ZF ma plik konfi­gu­ra­cyjny application.ini zapi­sany w /application/configs/. Dla naszych celów zało­żymy sobie plik thumbs.ini, który będziemy mordo­wać czytaj: ciągle nadpi­sy­wać. W pliku zapi­szemy sobie 4 linijki:

[production]
cleanafter = "Dec 25, 2010 6:26:09 PM"
checkinterval = "5"
intervalunit = "MINUTE"

Wyraz w nawia­sie ozna­cza środo­wi­sko, w którym pracu­jemy, cleanafter to data zapi­sana w forma­cie DATETIME. Checkintervalintervalunit to zmienne służące nam do wyge­ne­ro­wa­nia nowej daty cleanafter.

Kod, który podam poni­żej można sobie zapi­sać w jakimś kontro­le­rze albo jako plugin.

// ważne jest ustawienie opcji 'allowModifications' na true,
// bo inaczej konfiguracja będzie w trybie tylko do odczytu
$config = new Zend_Config_Ini(ROOT_DIR.'/application/configs/thumbs.ini','production',
   array('allowModifications' => true));
// konstruujemy obiekt Zend_Date na podstawie danych z
// konfiguracji i podajemy format, w jakim dostarczymy dane nt. daty
$cleanAfter = new Zend_Date($config->cleanafter, Zend_Date::DATETIME);
// jeżeli nic nie podamy to Zend weźmie sobie datę i czas obecny
$currentDate = new Zend_Date();
// bardzo fajna funkcja isEarlier() porównująca daty
if ($cleanAfter->isEarlier($currentDate)) {
   echo 'coś robię';
   // wyznaczamy nową datę do wpisania do konfiguracji;
   // myślę, że sklonowanie obiektu daty powoduje trochę mniejszy
   // narzut zasobów niż tworzenie od nowa obiektu
   $newCleanDate = clone $currentDate;
   // dodajemy datę; funkcja add() ma 2 argumenty: ile dodać i co dodać;
   $newCleanDate->add(
      $config->checkinterval,
      constant('Zend_Date::' . $config->intervalunit)
      );
   // przypisujemy do configa datę w formacie DATETIME
   $config->cleanafter = $newCleanDate->get(Zend_Date::DATETIME);
   // tworzymy obiekt służący do zapisu configów
   $writer = new Zend_Config_Writer_Ini();
   $writer->setConfig($config);
   $writer->setFilename(ROOT_DIR.'/application/configs/thumbs.ini');
   $writer->write();
 
   // przygotowujemy obiekt daty, z którym będziemy
   // porównywać czas ostatniego otwarcia plików
   $deleteOlderThan = clone $currentDate;
   // add() dodawało, sub() odejmuje; my odejmiemy 1 tydzień
   $deleteOlderThan->sub(1, Zend_Date::WEEK);
   // tworzymy iterator podając katalog z miniaturkami do sprawdzenia
   $dirIterator = new DirectoryIterator(APPLICATION_PATH  . '/../public/thumbs');
   foreach ($dirIterator as $file) {
      // $getATime() podaje czas ostatniego otwarcia pliku
      // w formacie TIMESTAMP, z którego skonstruujemy datę
      $fileOpenDate = new Zend_Date($file->getATime(), Zend_Date::TIMESTAMP);
      // jeżeli data ostatniego otwarcia jest wcześniejsza
      // niż przyjęty przez nas limit 1 tygodnia to wywalamy plik
      // wygłuszając ewentualne komunikaty poprzez @
      if ($fileOpenDate->isEarlier($deleteOlderThan)) {
         @unlink($file->getRealPath());
      }
   }
}

Pole­cam zwró­cić uwagę na constant(), który w locie na podsta­wie nazwy odwoła się do stałej obiektu. Konstruk­cja typu ${'jakas' . $zmienna} prawi­dłowa dla zmien­nych nie jest dostępna dla stałych i należy użyć funk­cji constant().

A poza tym to Weso­łych Świąt :-D

Podobne wpisy:

  1. Zend Frame­work i podświe­tla­nie wybra­nego elementu menu
  2. Własny wali­da­tor w Zend Framework
  3. Łącze­nie zapy­tań Zend_Db_Select w Zend Frame­work [cz. 1/2]
  4. Łącze­nie zapy­tań Zend_Db_Select w Zend Frame­work [cz. 2/2]

One comment

  • mrok
    26 grudnia 2010 - 14:19 | Permalink

    Zend_Date jest rozwią­za­niem bardzo potęż­nym i .… bardzo wolnym (nieste­tey). Tak, że jeśli ktoś chciałby użyć go często w rozbu­do­wa­nym syste­mie to pole­cam prze­pro­wa­dzić najpierw jakieś testy i użyć stan­dar­do­wych funk­cji php.

  • Dodaj komentarz

    Twój adres e-mail nie zostanie opublikowany.

    Możesz użyć następujących tagów oraz atrybutów HTML-a: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <p> <pre lang="" line="" escaped=""> <q cite=""> <strike> <strong>