Niezalogowany [ logowanie ]
Subskrybuj kanał ATOM Kanał ATOM    Subskrybuj kanał ATOM dla tagu php Kanał ATOM (tag: php)

Autor wpisu: sokzzuka, dodany: 21.10.2010 10:28, tagi: php

Mój ostatni projekt wykorzystywał php 5.3. Jako, że serwer produkcyjny działa na debianie lenny, gdzie jedyną dostępną wersją php jest 5.2.6-1. Stanąłem przed koniecznością ręcznej instalacji wersji, którą potrzebowałem. Myślę, że ten mały tutorial przyda się wszystkim, którzy incydentalnie korzystają z linuksa, a potrzebują mieć świeża wersję php.Zaczynajmy więc.

  1. Dodajemy na końcu pliku /etc/apt/sources.list (można użyć np. edytora nano) następujące dwie linijki: deb http://php53.dotdeb.org stable all deb-src http://php53.dotdeb.org stable all
  2. Ściągamy klucze potrzebne do weryfikacji repozytorów: gpg --keyserver keys.gnupg.net --recv-key 89DF5277 gpg -a --export 89DF5277 | sudo apt-key add -
  3. Uruchamiamy apt-get update
  4. Instalujemy php apt-get install php5-dev
  5. Teraz wystarczy tylko zrestartować apache /etc/init.d/apache2 restart

Na koniec oprócz pozdrowienia Mamy, Taty i Psa Bazyla. Chciałem dodać, że jeżeli nie jesteśmy zalogowani na koncie z uprawnieniami admina to przed każdym wyżej wymienionym poleceniem należy dodać sudo .

Autor wpisu: batman, dodany: 18.10.2010 08:00, tagi: php

Nieco ponad rok temu Microsoft ogłosił uruchomienie chmury – Windows Azure. Jako jeden z języków, w którym można tworzyć aplikacje w microsoftowej chmurze, wymieniany jest PHP. Co więcej, powstało nawet SDK dla tego języka oraz plugin do Eclipse, znacznie ułatwiający tworzenie aplikacji przeznaczonych do instalacji w Windows Azure. Ponieważ połączenie PHP oraz technologii Microsoftu wydaje się być wyjątkowo interesujące, postanowiłem zbadać temat PHP w chmurze. W przeciwieństwie do innych “dużych” tematów, ten będę opisywał na bieżąco, wraz ze wszystkimi moimi uwagami oraz przemyśleniami. Na koniec serii pokuszę się o instalację w chmurze aplikacji opartej o Zend Framework, co może być ciekawym (i kosztownym) doświadczeniem.

Wymagane narzędzia

Zanim będziemy mogli rozpocząć prace nad aplikacją Windows Azure, musimy zainstalować niezbędne narzędzia. Są to:

Instalację najlepiej rozpocząć od Windows Azure SDK. Jest to standardowy proces, w którym musimy przeklikać się przez krótkiego wizarda. Następnie rozpakowujemy Eclipse PDT i instalujemy w nim plugin. Dokładna instrukcja instalacji znajduje się na stronie projektu – http://www.windowsazure4e.org/download/, jeśli jednak nie chce się wam przedzierać przez dziesiątki zrzutów ekranu, wystarczy, że wykonacie poniższe kroki:

  1. Z menu Help, należy wybrać opcję Instal New Software
  2. W oknie, które się pojawi, klikamy na przycisk Add.
  3. W kolejnym oknie w polu Name wpisujemy Windows Azure Tools for Eclipse, a w polu Locationhttp://www.windowsazure4e.org/update
  4. Zatwierdzamy wprowadzone zmiany i czekamy chwilę na pojawienie się listy zawierającej spis narzędzi do instalacji.
  5. Na liście tej zaznaczamy PHP Development Tools for Windows Azure Platform i klikamy przycisk Next.
  6. Pozostałe kroki to już standardowy instalator Eclipse.

Testowanie środowiska

Jeśli wszystko zostało poprawnie zainstalowane, powinniśmy być w stanie stworzyć testowy projekt, na którym możemy przetestować poprawność instalacji.

W tym celu w Eclipse wybieramy z menu File opcję New, a następnie Other (lub używamy skrótu CTRL + N). Z katalogu PHP wybieramy Windows Azure PHP Project i klikamy Next. Pierwsza strona wizarda nie powinna sprawić żadnego problemu. Gorzej z drugą, ponieważ mamy tutaj do czynienia z określeniami związanymi bezpośrednio z Windows Azure – rolami oraz mechanizmami przechowywania danych.

Ponieważ w dzisiejszym wpisie chciałem się skupić jedynie na instalacji środowiska, nie będę zagłębiał się w te tematy. Na teraz wystarczy, że będziecie wiedzieć, iż są dwa rodzaje ról – Web Role oraz Worker Role. Pierwszą z nich można określić mianem aplikacji internetowej, drugą usługami działającymi w tle (np. dostęp do danych). Mechanizm przechowywania danych pozwala na zapisywanie w chmurze danych binarnych, tabelarycznych oraz kolejek.

Wracając do testowej aplikacji. W polu Role name wpiszcie WebRole oraz zaznaczcie checkbox Windows Azure Data Storage (Use Development Storage). Po kliknięciu Finish musimy odczekać kilka chwil, aż zostaną utworzone wszystkie niezbędne projekty.

W tym momencie mamy gotową aplikację, którą można umieścić w chmurze. Zanim jednak zaczniemy wpinać się się chmury, warto przetestować aplikację lokalnie.

Czytaj dalej tutaj (rozwija treść wpisu)
Czytaj dalej na blogu autora...

Autor wpisu: sokzzuka, dodany: 16.10.2010 23:01, tagi: php

Jeżeli śledzicie dzone.com. Pewnie zauważyliście, że od pewnego czasu na blogach osób związanych z Java’ą przetaczają się dwa związane ze sobą tematy. Pierwszym z nich jest kwestia uczynienia Java’y wolną (udostępnienie jej na wolnej licencji, uniezależnienie od Oracle) a drugim z nich jest kwestia zmian w języku. Kilka osób poddało pomysł aby zrobić fork Java’y wydany na jednej z licencji open-source’owych. Co do zmian w języku to część osób rozczarowana tym jaki kształt ma w tej chwili język oraz powolnym wprowadzaniem nowości do niego doszła również do wniosku, że najlepiej było by stworzyć nową wersję Java’y niekompatybilną wstecznie (Backward Incompatibile) Java. Znalazło się jak to zwykle bywa sporo osób, które stwierdziły ze oba pomysły jak najbardziej idą ze sobą w parze i proponują stworzenie „wolnego” fork’a Javy i rozwijanie go w sposób niekompatybilny wstecznie. Mnie nasuwa się jedynie pytanie, czy taki fork dalej będzie (i będzie można go nazywać) Java’ą ?

Postanowiłem odnieść tą sytuację do własnego podwórka i zastanowić się co by było gdyby stworzyć fork interpretera PHP. Jakie zmiany ja przeprowadziłbym w języku i dlaczego oraz czy po tych zmianach ten fork można by nazwać jeszcze PHP. Zachęcam też wszystkich do zabawy i wpisywania własnych propozycji. Jedną z pierwszych rzeczy jaką był zmienił, to usunięcie przestarzałych rzeczy typu register globals, short open tag, magic quotes, safe mode, allow call time pass by reference.

Drugą rzeczą było by przejrzenie pliku php.ini i usunięcie wszystkich opcji, które w jakikolwiek sposób niejawnie wpływają na wykonywanie skryptów – banowanie klas, funkcji etc. Domyślam się, że po tej operacji, zostały by tylko opcje związane z włączaniem/wyłączaniem rozszerzeń oraz limit czasu i pamięci.

Trzecią rzeczą było by zastąpienie wszystkich error’ów wyjątkami (z wyjątkiem parse_error i compile_error z wiadomych względów).

Zmiany omówione jak narazie w zasadzie nie zmieniają samej istoty języka a tylko sposób działania interpretera. Dalsze rzeczy jednak już jak nabardziej.

Po czwarte usuną bym słowa kluczowe i mechanizmy: global i goto. Są to pozostałości po językach bardziej niskopoziomowych i zwykle po prostu zaciemniają kod. Co więcej, pisząc w sposób obiektowy, nie ma w ogóle potrzeby ich wykorzystywania.

Po piąte – biblioteka standardowa. Zamiast jednej globalnej przestrzeni nazw przesunął bym funkcje z różnorakich rozszerzeń do własnych namespace’ów.

Po szóste – typy proste. Typy proste zamieniłbym na obiekty, które dziedziczą z klasy ‘Value’. Obiekty których klasy dziedziczą z klasy ‘Value’ były by nie zmienialne (immutable) oraz przekazywane przez kopię. Obiekty użytkownika, które dziedziczyły by z abstrakcyjnej klasy Value mogły by też same obsługiwać rzutowanie (funkcja typu __cast).

Po siódme zmiana orientacji języka na bardziej funkcjonalno-obiektowy niż proceduralno-obiektowy. Usunięcie możliwości przekazywania przez referencje typów prostych – konsekwencja punktu szóstego.

Po ósme – anonimowe klasy i obiekty oraz obiekty typu singleton jak w Scala’i oraz usunięcie możliwości deklaracji statycznych metod i pól klasy.

Czytaj dalej tutaj (rozwija treść wpisu)
Czytaj dalej na blogu autora...

Autor wpisu: matipl, dodany: 15.10.2010 12:13, tagi: php

Zend FrameworkKto by przypuszczał, że Zend Framework 1.11 wniesie tyle świeżości.

Wczoraj została udostępniona jako wersja BETA1 i robi spore wrażenie.

Wsparcie dla wersji mobilnych (Mobile Support)

Prawdziwa rewolucja. Zend Framework 1.11 posiada wsparcie dla urządzeń mobilnych. Wszystko za sprawą Raphael Carles (CTO Interakting), który napisał Zend_Http_UserAgent. Nowy komponent ma za zadanie wykryć User-Agent’a oraz na tej podstawie sprawdzić możliwości urządzenia mobilnego. W łatwy sposób można dopisać backendy dla kolejnych urządzeń.

Dzięki wtyczce dla Zend_Application oraz Zend_View_Helper_UserAgent w łatwy sposób możemy dostosować generowane dane wyjściowe z uwzględnieniem urządzenia, dla którego serwujemy tą treść (różne layouty, obrazki itp.).

Zend_Cloud: SimpleCloud API

Podczas ZendCon 2009 ogłoszono prototyp SimpleCloud API. W tej wersji mamy pierwsze oficjalne wsparcie od strony Zend Frameworka zawarte w Zend_Cloud. Dzięki temu możemy w chmurze korzystać z:

  • Document Services (Amazon SimpleDB i Windows Azure’s Table Storage)
  • Queue Services (Amazon Simple Queue Service, Windows Azure’s Queue Service, Zend_Queue)
  • Storage Services (S3, Windows Azure’s Blog Storage, Nirvanix, lokalny system plików).

W ten prosty sposób możemy przenośić swoje dane pomiedzy różnymi adapterami. W ciągu kilku miesięcy powinny pojawić się kolejne adaptery.

Podziękowania dla: Wil Sinclair and Stas Malyshev, którzy zainicjowali Zend_Cloud

SimpleDB Support

Od teraz ZF ma wsparcie dla Simple Storage Service (S3), Simple Queue Service (SQS), oraz Elastic Cloud Compute (EC2). Jest wprowadzona obsługa wszystkich operacji na SimpleDB poprzez Zend_Service_Amazon_SimpleDb.

Podziękowania dla: Wil Sinclair

eBay Findings API Support

eBay od dawna posiada rozbudowane REST API pozwalające programistom tworzenie interakcyjnych aplikacji z dużą ilością danych. Nowy Zend Framework (1.11) zawiera Zend_Service_Ebay_Findings, które w pełni obsługuje eBay Findings API. Pozwala to na tworzenie zapytań przez programistów dot. szczegółów aukcji eBay z uwzględnieniem kategorii i słów kluczowych.

Czytaj dalej tutaj (rozwija treść wpisu)
Czytaj dalej na blogu autora...

Autor wpisu: batman, dodany: 12.10.2010 08:00, tagi: php, symfony

Programistę aplikacji internetowych, którzy nie korzysta z żadnego frameworka, można porównać do stolarza, który produkuje meble przy pomocy młotka i gwoździ. Niby się da, ale efekt końcowy jest zawsze taki sam – opłakany. Taka właśnie myśl przyświecała mi podczas poznawania frameworków PHP. Ostatecznie mój wybór padł na Zend Frameworka i nie żałuję tej decyzji. Jakiś czas temu przeczytałem wpis Zyxa na temat EventDispatchera, który można zleźć w Symfony 2 i postanowiłem sprawdzić o co tyle szumu. Od razu zaznaczę, iż wszystkie moje wnioski dotyczą nieukończonej jeszcze wersji 2 (celowo nie zaglądałem do aktualnej wersji – 1.4), a co za tym idzie coś, co teraz nie działa, może być naprawione w stabilnej wersji. Co więcej, moje podejście do frameworków PHP jest nieco wypaczone ze względu na ZF, więc zanim zaczniecie po mnie jeździć jak po łysej kobyle, weźcie to pod uwagę.

Instalacja

Na ten temat zbyt dużo nie da się napisać. Ściągamy gotowy sandbox, rozpakowujemy na serwerze i uruchamiany testową stronę. Proste jak konstrukcja cepa.

Pierwsze kroki

Jak to zwykle bywa w przypadku nauki czegoś nowego, staramy się oprzeć na zdobytych wcześniej doświadczeniach. Nie inaczej było tym razem. Dzięki temu, że dobrze znam ZF oraz mam jakieś pojęcie o ASP.NET MVC, stosunkowo łatwo było mi się odnaleźć w strukturze projektu i aplikacji. Wprawdzie po przeczytaniu The Big Picture pojawiło się więcej pytań niż odpowiedzi, byłem jednak pozytywnie zaskoczony prostotą, jaką oferuje Symfony 2. Jedyne co mi się nie podobało to fakt, iż osoby nie mające pojęcia o frameworkach, rozbiją się o ścianę swojej niewiedzy, co może skutecznie ich zniechęcić do dalszej nauki.

Widoki

Na samym początku opisu natknąłem się na informację o szablonach Twig. Nie należę do zwolenników szablonów w PHP, więc nieco mnie zmartwiło, że framework ma takie coś wbudowane. Na szczęście można korzystać z czystego PHP.

Po tym niewielkim zgrzycie, zagłębiłem się w lekturę dalszej części przewodnika, w której opisane zostały szablony (Templates) oraz sloty (Slots). Generalnie, założenia nie odbiegają znacząco od tego, co poznałem w ZF. Zend_Layout, Zend_View oraz helpery widoku dobrze mnie przygotowały do tego, co zobaczyłem w Symfony 2.

Kontroler

Ta część była nieco enigmatyczna. Bez żadnego łagodnego wprowadzenia, od razy skok na głęboką wodę. Kolejny raz doświadczenie zdobyte podczas pracy z ZF zaowocowało. Opisane w tej części przewodnika formaty są niczym innym jak kontekstami znanymi z Zend Frameworka. Nieco inaczej się je definiuje, ale zasada działania jest identyczna.

Czytaj dalej tutaj (rozwija treść wpisu)
Czytaj dalej na blogu autora...

Autor wpisu: Śpiechu, dodany: 10.10.2010 13:52, tagi: php

Czytając mądrą książkę dotyczącą optymalizacji witryn internetowych natrafiłem na narzędzie jpegtran, które wykona dla nas kawał dobrej roboty bezstratnie zmniejszając wielkość plików jpg.1 Dodatkowo przy okazji możemy wyrzucić część lub całość metadanych z pliku.

Użytkownicy czasem sami sobie robią krzywdę wrzucając zdjęcia do internetu robione komórkami z GPSem. Raz, że komórki podają swój model i inne parametry (np. przysłony), a dwa, że zapisują w metadanych dokładną lokalizację wykonanego zdjęcia (a tym samym np. czyjegoś domu).

Zmniejszenie wielkości pliku za pomocą jpegtran polega na optymalizacji tablic Hauffmana i ewentualnie dodanie trybu progresywnego (w miarę ładowania się zdjęcia polepsza się jego jakość na stronie WWW). Co ciekawe, dodanie progresywności również zaoszczędza kilka KB w zdjęciu.

Walka toczy się o ok. 20% wielkości pliku, czyli dosyć sporo. Jpegtran można sobie w Ubuntu znaleźć w Synapticu w ramach pakietu libjpeg-progs. Co do Windowsa radźcie sobie sami ;-)

Na koniec przedstawię owoc mojej godzinnej pracy: klasę, za pomocą której w php możemy sterować poczynaniami jpegtran. Jak zwykle po angielsku, ale za to komentarze i errory po polsku żeby nie było że jakiś stronniczy jestem. Jak to cudo działa? Na etapie tworzenia obiektu przyjmuje 2 parametry:

  1. Co zrobić z metadanymi pliku
    • none — wyrzucić wszystkie metadane
    • comments — zostawić tylko komentarze (mogą zawierać dane na temat licencji i/lub właściciela)
    • all — zostawić metadane tak jak są
  2. Jakie wykonać operacje na pliku
    • optimise — przeprowadza optymalizację tablic Hauffmana
    • progressive — dodaje tryb progresywny

Wystarczy sobie utworzyć obiekt JpegOptimiser i można za pomocą metody processImage przetwarzać obrazki, np. tak:

$jpg = new JpgOptimiser('none', array('optimise','progressive'));
$jpg->processImage('test.jpg', 'test_wyjsciowy.jpg');

Poniżej kod klasy:

<?php
class JpgOptimiser {
 
    /**
     * @var array tablica dopuszczalnych parametrow operacji graficznych
     */
    protected static $VALID_PROCS = array('optimise', 'progressive');
 
    /**
     * @var array tablica dopuszczalnych parametrow operacji na metadanych
     */
    protected static $VALID_META = array('none','all','comments');
 
    /**
     * @var array tablica najczestszych bledow z wyjscia i komunikat bledu
     */
    protected static $REGEX_OUTPUT_ERRORS = array(
            array('/jpegtran: not found/', 'nie wykryto jpegtran'),
            array('/can\'t open/', 'nie mozna otworzyc pliku'),
            array('/not a jpeg/i', 'to nie jest plik jpg')
    );
 
    /**
     * @var string przygotowana lista argumentow do uruchomienia w konsoli
     */
    protected $argsChain;
 
    /**
     * Wybor listy operacji do wykonania.
     * @param string $meta operacje wykonywane na metadanych; dopuszczalne: none, comments, all
     * @param array $procs operacje graficzne; dopuszczalne: optimise, progressive
     */
    public function __construct($meta = 'none', array $procs = array('optimise', 'progressive')) {
        $this->argsChain  = $this->parseArgs($procs, self::$VALID_PROCS, ' -');
        $this->argsChain .= $this->parseArgs(array($meta), self::$VALID_META, ' -copy ');
    }
 
    /**
     * @param array $args tablica parametrow wejsciowych
     * @param array $valid tablica parametrow dopuszczalnych
     * @param string $prefix znak poprzedzajacy argument
     * @return string przetworzony ciag argumentow
     */
    private function parseArgs(array $args, array $valid, $prefix) {
        $output = '';
        foreach ($args as $arg) {
            if (in_array($arg, $valid)) {
                // dorzucam myslnik przed parametrem i spacje na koncu
                $output .= $prefix . $arg . ' ';
            }
        }
        return $output;
    }
 
    /**
     * Przetwarzanie pliku.
     * Docelowo lepszym rozwiazaniem bedzie uzywanie SPLFileInfo.
     * @param string $srcFile nazwa pliku wejscowego
     * @param string $dstFile nazwa pliku wyjscowego (moze byc taka sama jak wejscowy)
     * @return bool
     */
    public function processImage($srcFile, $dstFile) {
        $output = shell_exec('jpegtran' . $this->argsChain . '-outfile ' . escapeshellarg($dstFile) . ' ' . escapeshellarg($srcFile) . ' 2>&1');
        try {
            return $this->isProcessingOK($output);
        }
        catch(Exception $e) {
            echo $e->getMessage();
            return false;
        }
    }
 
    /**
     * @param mixed $output
     * @return bool
     * @throws Exception
     */
    private function isProcessingOK($output) {
        if ($output === null) {
            return true;
        }
        else {
            // szukam znanych komunikatow bledow
            foreach (self::$REGEX_OUTPUT_ERRORS as $error) {
                if (preg_match($error[0], $output) != 0) {
                    throw new Exception($error[1]);
                }
            }
            // nie znaleziono znanych, rzucam cala tresc wyjscia
            throw new Exception($output);
        }
    }
}
  1. S. Souders : Jeszcze wydajniejsze witryny internetowe. Przyspieszanie działania serwisów WWW. Gliwice : Helion, 2010, s. 156–157.

Autor wpisu: matipl, dodany: 08.10.2010 14:39, tagi: php

php-logoJakoś małym echem w blogosferze rozeszła sie informacja włączenia dodatku PHP-FPM (FastCGI Process Manager) do wersji 5.3.3 PHP.

A jest to duży skok na przód. PHP-FPM jest to patch zawarty w jądrze PHP, który pozwala zarządzać procesami FastCGI: uruchamiać, zatrzymywać, restartować. Jest to wspaniała wiadomość dla wszystkich osób korzystających z PHP poprzez FastCGI (np. nginx, lighttpd). Do tej pory trzeba było sie np. kłopotać z spawn-fcgi.

Większość osób, które dokonują standardowej instalacji Apache jako serwer WWW + PHP nawet nie zdają sobie sprawy jak to działa. Apache domyślnie obsługuje PHP poprzez własny moduł (mod_php) – w skrócie Apache ładuje całe środowisko w siebie. Dzięki wykorzystaniu FastCGI i FPM otrzymujemy:

  • mniejsze zużycie pamięci (dodatkowe workery nginx nie potrzebują środowiska PHP)
  • lepsze zarządzanie uprawnieniami PHP bez gimnastyki
  • gdy PHP padnie nginx nadal działa
  • inteligentne zarządzanie wspólnymi procesami PHP (obniża zużycie pamięci)

Jedyne co należy obecnie zrobić to podczas konfiguracji PHP (przed kompilacją) dodać –enable-fpm. Skompilowany zarządca będzie czekał w sapi/fpm jako php-fpm. W tym samym katalogu macie również plik konfiguracyjny (php-fpm.conf) oraz skrypt inicjacyjny init.d.php-fpm.

Ja na wszelkich maszynach dedykowanych pod serwery WWW + PHP korzystam właśnie z tej wybuchowej mieszanki.

Wszystkie wpisy należą do ich twórców. PHP.pl nie ponosi odpowiedzialności za treść wpisów.