Znalezione gdzieś w Internecie, dostosowane do współpracy z Zendem.
Artykuły w archiwum
Razem artykułów: 34
Wydajność Zend Framework - cz. 1
Tworząc aplikację bazującą na frameworku szybko zauważymy, że działa ona dużo wolniej niż odpowiednik napisany w czystym PHP. Czy powinniśmy się tym przejmować?
Im bardziej rozbudowany projekt, tym proporcjonalnie mniejszy narzut wynikający z zastosowania biblioteki. W większych aplikacjach problemem nie jest framework, lecz (najczęściej) baza danych.
Mimo tego, warto wiedzieć co ma wpływ na tak niską wydajność. A także to, że niewielkim kosztem można ją poprawić.
Dzisiejszy wpis to pierwsza część krótkiej serii artykułów o wydajności frameworku. Zaczniemy od podstaw - pokażę kilka sposobów na pomiar prędkości.
"Resetujący" CSS i Firebug

Używanie "resetującego" arkusza CSS jest dosyć dobrą metodą na uzyskanie identycznego wyglądu we wszystkich przeglądarkach. Niestety, znacznie utrudnia badanie styli przy pomocy Firebuga - w widoku CSS resetujące reguły powtarzają się kilkakrotnie, skutecznie zaciemniając obraz całości.
Spróbuj "zbadać" któryś z odnośników w tym blogu - w zakładce CSS zobaczysz coś takiego:
Usunięcie reguł z pliku reset.css jest proste, jednak wymaga grzebania w kodzie Firebuga - nie da się tego wyklikać.
Migracja z Apache do Nginx

Serwer na którym postawiony jest ten blog to "słaby" dedyk z oferty OVH, z zainstalowanym Debianem. Aktualnie obsługuje kilkanaście stron z dość małym natężeniem ruchu (głównie proste, statyczne wizytówki). Całość śmiga na serwerze Apache i mod_php. Ostatnio, spodziewając się zwiększonego ruchu na jednej z tych stron, postanowiłem zwiększyć wydajność poprzez instalację serwera WWW Nginx.
Przykład zastosowania Zend_Auth i Zend_Acl - cz. 2
W poprzednim wpisie pokazałem jak można zastosować Zend_Auth do obsługi uwierzytelniania. Dzisiaj przykładowa aplikacja zostanie wzbogacona o kontrolę dostępu użytkowników, zrealizowaną z wykorzystaniem Zend_Acl.
Kopiowanie plików z serwera na serwer
Ze zdalnego serwera do bieżącego katalogu, poprzez SSH
rsync -av -e 'ssh -p PORT' uzytkownik@host1:/stara/sciezka/ ./
Tyle w skrócie. Więcej informacji można znaleźć tutaj:
http://www.cyberciti.biz/tips/linux-use-rsync-transfer-mirror-files-directories.html
Przykład zastosowania Zend_Auth i Zend_Acl - cz. 1
W artykule przedstawię "przepis" na zbudowanie prostej aplikacji wykorzystującej Zend_Auth do logowania, oraz - w drugiej części - Zend_Acl do kontroli dostępu użytkowników.
Zend_Mail: wysyłanie poczty w Zend Framework

Wysyłanie poczty w czystym PHP nigdy nie należało do przyjemności. Funkcja mail() może i sprawdza się gdy chcemy wysłać krótką wiadomość tekstową do jednego odbiorcy, jednak zawodzi w bardziej skomplikowanych zastosowaniach. Wyobraźmy sobie wysyłanie listu z dołączonym plikiem PDF i kilkoma obrazkami wplecionymi w treść. Bez jakiejś dodatkowej biblioteki musielibyśmy utworzyć całą wiadomość ręcznie (przykład). Na szczęście programiści Zenda przygotowali dosyć dobrą klasę którą możemy łatwo wykorzystać w naszej aplikacji: Zend_Mail. W tym tekście pokażę przykłady zastosowania tej klasy. Oprócz tego, zaprezentuję prosty sposób na testowanie wysyłania wiadomości przy pomocy własnego transportu.
Zend_Form: walidacja rozbudowanych formularzy

Tworząc formularze przy użyciu Zend_From możemy szybko dojść do sytuacji gdzie standardowy zestaw walidatorów nie spełni naszych potrzeb. Najlepszy przykład to formularz rejestracji i sprawdzanie czy pola "hasło" oraz "powtórz hasło" zawierają identyczne wartości. Albo formularz w którym opisujemy jakieś wydarzenie i wprowadzamy dwie daty: rozpoczęcia i zakończenia. Jak sprawdzić czy pierwsza z dat poprzedza drugą? W takich sytuacjach najczęściej spotykaną sugestią jest "napisz własny walidator". Otóż wbrew pozorom takie rozwiązanie jest skomplikowane i niezbyt przejrzyste. Wynika to z założenia że walidator ma sprawdzać poprawność tylko jednego pola. "Zgodność haseł" czy "poprawna kolejność dat" nie są cechami jednego pola, a raczej całego formularza. Zatem bardziej logiczne wydaje się być rozwiązanie w którym to sam formularz (a nie poszczególne elementy) zajmie się walidacją.
Zend Framework i Doctrine - łatwa integracja

Ostatnio zainteresowałem się możliwością zastosowania Doctrine'a w jednym z moich projektów. Znalazłem wiele informacji na ten temat w internecie, niestety w większości zdezaktualizowanych. Okazało się że z wersji na wersję twórcy Doctrine coraz bardziej ułatwiają życie koderom piszącym w ZF. Aktualny przepis znalazłem na stronie ZendCasts. Podczas prób okazało się, że można to wszystko zrobić jeszcze prościej niż proponuje autor, zatem w tym wpisie podam własny przepis, przetestowany z Doctrine 1.2.1 i Zend-em 1.10 beta (1.9 też powinien działać).
Usuwanie niepotrzebnych znaków z kodu HTML

Prostym sposobem na ograniczenie transferu jest usunięcie niepotrzebnych białych znaków i komentarzy z kodu HTML. W dokumentacji funkcji ob_start znajduje się bardzo ładny przykład, który możemy przystosować do współpracy z naszą aplikacją.
Dla aplikacji opartej o Zend Framework najlepiej będzie umieścić ten kod w pluginie kontrolera, w metodzie dispatchLoopShutdown().
Drzewko katalogów oparte na jsTree i SPL

Czasem aplikacja wymaga aby zaprezentować użytkownikowi drzewko odzwierciedlające strukturę katalogów na serwerze. Zaprezentuję więc przykładowe rozwiązanie, oparte na jsTree (wyświetli drzewko po stronie klienta) oraz klasie DirectoryIterator z biblioteki SPL (wygeneruje drzewko po stronie serwera).
Aktualizacja openSUSE 11.1 do 11.2
W dniu wczorajszym wydano nową wersję Susełka. Jako zadowolony użytkownik tego systemu postanowiłem niezwłocznie dokonać aktualizacji. Myślę, że nie ma sensu po raz kolejny opisywać nowych funkcji czy ulepszeń - te informacje są już dostępne w wielu serwisach. Jednak to wydanie przynosi coś bardzo ciekawego: umożliwia łatwą migrację z edycji 11.1 do 11.2, bez potrzeby dokonywania reinstalacji. Ze względu na moją niecierpliwość połączoną z ciekawością postanowiłem wykorzystać właśnie tę opcję.
Wysyłanie plików na serwer - rsync
RSYNC musi być zainstalowany po stronie klienta i na serwerze.
strona/scripts/upload.sh
#!/bin/sh
SRC='/home/mateusz/projekty/strona/'
rsync -ave 'ssh' \
--filter='merge .rsync-filter' \
$SRC \
USER@DOMAIN:DIRECTORY
strona/scripts/.rsync-filter
- /scripts - /tests - /nbproject - /.hg - /.hgignore - /.zfproject.xml - /application/configs/site.xml - /application/configs/application.ini - /public/media - /public/images/captcha - /public/index.php - /data/cache - /library/Zend - /library/ZendX
użycie:
cd /home/mateusz/projekty/strona/ ./upload.sh
.htaccess dla aplikacji ZF
Co ma robić?
- ustawiać zmienną określającą środowisko pracy (produkcyjne, testowe, deweloperskie)
- przekierowywać ze strony z "www" w adresie na adres bez "www"
- kierować wszystkie żądania do pliku index.php...
- ... chyba że żądany plik istnieje
SetEnv APPLICATION_ENV development
RewriteCond %{HTTP_HOST} ^www.mateusztymek.pl [NC]
RewriteRule ^(.*)$ http://mateusztymek.pl/$1 [R=301,L]
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} -s [OR]
RewriteCond %{REQUEST_FILENAME} -l [OR]
RewriteCond %{REQUEST_FILENAME} -d
RewriteRule ^.*$ - [NC,L]
RewriteRule ^.*$ index.php [NC,L]
Co to jest Paste Bin?
Paste Bin to nowa kategoria. Będą tutaj wrzucane fragmenty kodów, bez specjalnego rozpisywania się. Po co robić coś takiego? Głównie na moje potrzeby, tak żebym miał te kody łatwo dostępne w jednym miejscu. A być może przydadzą się komuś jeszcze.
Treści z tej kategorii nie pojawią się na stronie głównej ani w RSS.
jQuery Tools
Chciałbym gorąco polecić pewną stronę na którą ostatnio się natknąłem: jQuery Tools. Serwis (jak wskazuje jego nazwa) prezentuje kilka rozszerzeń biblioteki jQuery. I to nie byle jakich!
Przykładowe komponenty to tooltip (wyświetla okienko informacyjne np w formularzach), overlay (wyskakujące okienka) czy scrollable (można nim opakować wszelkiego rodzaju przesuwane treści). Co wyróżnia jQuery Tools na tle innych, podobnych rozwiązań? Przede wszystkim jakość wykonania - efekty są ładne, działają poprawnie we wszystkich przeglądarkach i łatwo je wdrożyć. Dodatkowo serwis wypełniony jest przykładami dzięki którym szybko i bezboleśnie postawimy pierwsze kroki.
Praktycznie od ręki udało mi się dodać kilka efektów do bloga: tooltipy przy formularzach i wyszukiwarce, oraz wyskakujące okienko z formularzem kontaktowym.
Typografia stosowana: wygładzanie czcionek
Dobry projektant zwraca uwagę aby jego strona wyglądała podobnie (a najlepiej tak samo) w każdej przeglądarce. Jest jednak pewien aspekt na który nie można mieć wpływu: wygładzanie czcionek. Twórcy przeglądarek podchodzą do tego tematu na różne sposoby. Najczęściej przeglądarka dopasowuje się do ustawień systemu, ale czasem autorzy danego programu implementują własne metody wygładzania.
Aby mieć jakieś porównanie pobrałem szablon ze strony freecsstemplates.org, poddałem go niewielkiej edycji, uruchomiłem kilka przeglądarek i wykonałem zrzuty ekranu.
Zend_Form i wysyłanie plików - cz. 3
Oto trzeci artykuł dotyczący wysłania plików na serwer przy użyciu komponentu Zend_Form. Tym razem pokażę jak wyświetlić użytkownikowi pasek postępu.
Pasek nie zadziała przy standardowej konfiguracji PHP. Wymagane jest jedno z dwóch rozszerzeń: APC lub uploadprogress. Zend Framework automatycznie wykryje które z nich jest dostępne i użyje go.
Założenia
Chcemy uzyskać prosty pasek pokazujący postęp wysyłania pliku w tle. Niech strona w określonym odstępie czasu (np 1/10 sekundy) wysyła zapytania do serwera, który zwróci żądaną informację.
Podobnie jak w poprzednim artykule przedstawione rozwiązanie musi być elastyczne - niech zadziała także gdy serwer nie obsługuje paska postępu lub gdy użytkownik wyłączy obsługę Java Script.
Podstawą będzie aplikacja napisana w poprzednim artykule.
Przyśpieszyć Zend_Captcha_Image
Ogromną wadą komponentu Zend_Captcha_Image jest jego niska wydajność. Główną przyczyną jest użycie biblioteki GD i czystego PHP do utworzenia i zdeformowania obrazka. Jak obejść ten problem?
Interesującym rozwiązaniem będzie zastosowanie ImageMagick. Rozszerzenie to dostarcza zestaw klas manipulujących obrazkami, a bogaty zestaw funkcji pozwoli na uzyskanie efektu podobnego do Zend_Captcha_Image. Ta ostatnia klasa zostanie wykorzystana jako baza, co bardzo ułatwi proces kodowania.
