Autor wpisu: Śpiechu, dodany: 26.12.2010 00:27, tagi: zend_framework, php
Mamy święta i dużo wolnego czasu, dlatego dzisiaj będziemy zajmować się modułem Zend Framework odpowiedzialnym za czas – Zend_Date. Proponuję przeczytać moje gryzmoły zamiast objadać się nadmiernie karpiem czy co tam macie. Dodatkowo zahaczymy o Zend_Config w postaci odczytu, modyfikacji i zapisu nowych danych do pliku .ini.
Będziemy robić moduł odpowiedzialny za automatyczne usuwanie dawno otwartych (a zatem niepotrzebnych) jakichś plików na serwerze. Mogłyby to być pliki miniaturek obrazków, które kiedyś nam system wygenerował i są już niepotrzebne.
Domyślnie każda aplikacja w ZF ma plik konfiguracyjny application.ini zapisany w /application/configs/. Dla naszych celów założymy sobie plik thumbs.ini, który będziemy mordować czytaj: ciągle nadpisywać. W pliku zapiszemy sobie 4 linijki:
[production] cleanafter = "Dec 25, 2010 6:26:09 PM" checkinterval = "5" intervalunit = "MINUTE"
Wyraz w nawiasie oznacza środowisko, w którym pracujemy, cleanafter
to data zapisana w formacie DATETIME. Checkinterval
i intervalunit
to zmienne służące nam do wygenerowania nowej daty cleanafter
.
Kod, który podam poniżej można sobie zapisać w jakimś kontrolerze 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()); } } }
Polecam zwrócić uwagę na constant()
, który w locie na podstawie nazwy odwoła się do stałej obiektu. Konstrukcja typu ${'jakas' . $zmienna}
prawidłowa dla zmiennych nie jest dostępna dla stałych i należy użyć funkcji constant()
.
A poza tym to Wesołych Świąt