PHP + Apache + Imagick na Windows 7

Zadanie – zainstalować obsługę Image Magick na maszynie deweloperskiej z Windows7 64-bit. Integracja z PHP 5.3.8 jako moduł Apache 2.2.x.

PHP 5.3.8 musi być w w wersji Thread Safe, bo ona jest przewidziana do integracji jako moduł Apache 2.2 (zawiera bibliotekę php5apache2_2.dll, której jest pozbawiona wersja Non Thread Safe przeznaczona na dostęp CGI). Ponieważ do budowy PHP stosowany jest kompilator VC9, to potrzebne są binaria Apache skompilowane także VC9. Do pobrania z Apache Lounge.

Obsługa rozszerzenia imagick wymaga posiadania zainstalowanego Image Magick. Ściągamy wersję 32-bitową, ponieważ PHP też jest w wersji 32-bit. Najlepiej zastosować się do zaleceń autorów – jeśli nie wiesz co potrzebujesz, to ściągaj wersję Q-16-windows-dll. Podczas instalacji należy zaznaczyć dodanie Image Magick do ścieżki systemowej. Następnie ściągamy php_imagick.dll – nie ma obecnie wersji windows na PECL, więc bierzemy bezpośrednio ze strony autora rozszerzenia (wybieramy wersję Thread Safe). Bibliotekę kopiujemy do podkatalogu ext, zmianiamy nazwę na php_imagick.dll i dodajemy rozszerzenie

extension=php_imagick.dll

I gotowe.

EDIT: Nie do końca gotowe. Jeśli zatrzymamy się w tym punkcie biblioteka będzie się podłączała i zobaczymy ją w phpinfo(), ale każdorazowe wywołanie funkcji Imagick() będzie powodowało restart Apache. Żeby działało poprawnie należy zainstalować wersję Image Magick nie nowszą niż 6.6.4.0. Patrz też: odpowiedź na stackoverflow

ZF: Zend_Date a polskie nazwy

Zadanie z użyciem Zend_Date: mając datę przykładowo 2011-01-24 wyświetlić ją jako 24 styczeń 2011 (co jest niepoprawne, ale w tym przypadku zleceniodawca tak sobie zażyczył).

Na początek tworzymy obiekt, który będzie zawierał naszą datę. Żeby wyświetlać polskie nazwy zainicjujemy locale = ‚pl_PL’

$data = new Zend_Date('2011-01-24', 'YMd', 'pl_PL');

Zakładając, że nie wymuszaliśmy formatowania daty jako ‚php’ i wykorzystujemy format ‚iso’ wyświetlamy w wymaganym formacie:

echo $data->get(Zend_Date::DAY) . ' '
     . $data->get(Zend_Date::MONTH_NAME) . ' '
     . $data->get(Zend_Date::YEAR);

Otrzymujemy: 24 stycznia 2011

Czyli niezupełnie to, o co chodziło. Dlaczego tak jest?
Czytaj dalej

ZF: Długości pól formularza na podstawie bazy

Kiedy tworzymy formularz w Zend Frameworku przesyłamy potem dane z niego do bazy. Czasem się okazuje, że długość wprowadzanych danych przekracza długość pola tabeli i przez to pojawia się błąd w stylu „String data, right truncated: 7 ERROR value too long for type character varying(40)” (PostgreSQL). Żeby temu zapobiec można ustawić dodatkowe walidatory dla pól formularza, które będą bazowały na informacjach z metadanych tabeli. Można to osiągnąć m.in. tak:
Czytaj dalej

And i &&

W przejętej do utrzymania aplikacji napisanej w PHP zauważyłem, że podczas testowania warunków if() zamiast używania operatorów && i || stosowano and i or. Ponieważ ja zawsze używałem tych pierwszych postanowiłem sprawdzić czym to się różni. Po lekturze dokumentacji i sieci można powiedzieć, że sprawa kręci się wokół dwóch rzeczy: kolejność operatorów (operator precedence) i short-circuit evaluation. To drugie nie wiem jak ładnie przetłumaczyć, ale chodzi o jak najszybsze zakończenie sprawdzania warunków true/false – to znaczy kiedy silnik PHP uzna, że zna już odpowiedź, to nie sprawdza pozostałych warunków.

Ma to miejsce kiedy:

  • pierwsza część warunku and zwraca false – bo od razu wiadomo, że cały warunek zwróci false
  • pierwsza część warunku or zwraca wartość true – bo od razu wiadomo, że cały warunek zwróci true

Czytaj dalej

data URI

Przeglądając kod plugina Scienta ZF Debug Bar trafiłem na nieznany mi wcześniej sposób osadzania grafik w kodzie HTML. Ikony są tworzone w locie na podstawie zakodowanego przy użyciu base64 ciągu znaków, np.:

data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAQAAAC1+jfqAAAABGdBTUEAAK/INwWK6QAAABl0RVh0U29mdHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAAEYSURBVBgZBcHPio5hGAfg6/2+R980k6wmJgsJ5U/ZOAqbSc2GnXOwUg7BESgLUeIQ1GSjLFnMwsKGGg1qxJRmPM97/1zXFAAAAEADdlfZzr26miup2svnelq7d2aYgt3rebl585wN6+K3I1/9fJe7O/uIePP2SypJkiRJ0vMhr55FLCA3zgIAOK9uQ4MS361ZOSX+OrTvkgINSjS/HIvhjxNNFGgQsbSmabohKDNoUGLohsls6BaiQIMSs2FYmnXdUsygQYmumy3Nhi6igwalDEOJEjPKP7CA2aFNK8Bkyy3fdNCg7r9/fW3jgpVJbDmy5+PB2IYp4MXFelQ7izPrhkPHB+P5/PjhD5gCgCenx+VR/dODEwD+A3T7nqbxwf1HAAAAAElFTkSuQmCC

Obrazek można zobaczyć wklejając powyższy kod do paska adresu np. w Firefoksie czy Operze

Jak to działa?
Czytaj dalej