Archiwum kategorii ‘Ciekawostki’

Drupal 7: HipHop for PHP kontra APC – test wydajności

środa, 18 Maj 2011

Na angielskiej wersji mojego bloga opublikowałem wczoraj nowy artykuł porównujący wydajność Drupal 7 w trzech różnych wersjach:

  • tradycyjnego skryptu PHP
  • skryptu PHP zoptymalizowanego modułem APC
  • aplikacji skompilowanej przy pomocy HipHop for PHP

(więcej…)

HipHop for PHP vs APC – Drupal 7 benchmark

środa, 18 Maj 2011

Read this article on the English version of my blog: http://php.webtutor.pl/en/2011/05/17/drupal-hiphop-for-php-vs-apc-benchmark/

Please note: this is the last English article published on the Polish version of my blog. To read my new articles in English, please switch to the English version of this blog: http://php.webtutor.pl/en .

Jak przyspieszyć kompilację kodu PHP w HipHop for PHP – część I: ccache

poniedziałek, 9 Maj 2011

Kompilacja dowolnego programu napisanego w języku PHP zależnie od jego rozmiaru może trwać od kilku do kilkudziesięciu minut.

Dla programistów C, C++ i Java długotrwała kompilacja kodu nie jest niczym niezwykłym. Niestety nie można tego samego powiedzieć o programistach PHP, którzy przywykli do tego, że wszystkie zmiany w kodzie widzą od razu w przeglądarce.

W artykule przedstawię więc jeden ze sposobów, który znacząco skraca czas kompilacji kodu PHP. (więcej…)

Drupal i HipHop for PHP – część I: kompilacja

piątek, 29 Kwiecień 2011

Tuż po upublicznieniu HipHop for PHP w Internecie pojawiło się wiele artykułów na temat tego kompilatora oraz możliwości jakie może zaoferować istniejącym skryptom PHP. Większość z tych tekstów opisywało jednak problemy, które uniemożliwiały skompilowanie dwóch najpopularniejszych systemów CMS Drupal, i Joomla. Operacja kończyła się niepowodzeniem z powodu złej jakości kodu PHP, w który zostały napisane oba systemu.

Informacje zawarte we wspomnianych artykułach są już jednak nieaktualne: od czasu ich publikacji pojawiły się nowe wersje obu systemów CMS, mianowicie Drupal 7 oraz Joomla 1.6.

Czy w nowych wersjach poprawiła się jakość kodu PHP? Czy system Drupal można już bez problemu skompilować? Niniejsza seria artykułów odpowie na te pytania. (więcej…)

Mod_rewrite oraz HipHop for PHP na serwerze Apache

poniedziałek, 25 Kwiecień 2011

Skrypty PHP skompilowane kompilatorem HipHop for PHP mogą bez problemu działać jako serwery HTTP. Nie udostępniają one jednak najpopularniejszej w Internecie metody tworzenia przyjaznych linków, czyli modułu mod_rewrite dostarczanego razem z serwerem Apache.

W tym artykule opiszę najprostszy sposób uruchomienia skompilowanych skryptów PHP z poziomu serwera Apache. (więcej…)

Nadpisywanie wbudowanych protokołów PHP własnym wrapperem strumienia

piątek, 15 Kwiecień 2011

Po ostatnich, dosyć wyczerpujących artykułach na temat silnego typowania danych, oraz autentykacji NTLM poprzez atak man-in-the-middle, postanowiłem przedstawić coś znacznie lżejszego.

Nieraz podczas pisania aplikacji natrafiałem na zabezpieczenia w stylu „system plików jest w trybie: tylko do odczytu, PHP ma prawa zapisu wyłącznie w bazie danych”. Jest to oczywiście skrajny przypadek zabezpieczeń przed hackerami, jednak w moim przypadku zdarzający się dosyć nagminnie. W tak zabezpieczonym środowisku pojawiają się więc dosyć nietypowe problemy z funkcjami wbudowanymi w PHP, gdyż niektóre z nich wymagają praw zapisu do katalogów na dysku lokalnym (upload plików, cache WSDL, biblioteka cURL), lub odczytu z plików (np. SoapClient nie potrafi odczytać treści WSDL bezpośrednio ze zmiennej, lecz tylko poprzez protokół HTTP lub z pliku lokalnego).

Opiszę więc krótko mało znane i dosyć egzotyczne obejście tych problemów: nadpisywanie wbudowanych w PHP protokołów własnymi. (więcej…)

Obiektowe PHP: Implementacja getterów i setterów znanych z języka C#

środa, 13 Kwiecień 2011

Każdy, kto choć raz przyjrzał się językowi C#, mógł zauważyć, że posiada on możliwość deklarowania konkretnych getterów oraz setterów dla właściwości obiektu, np w taki sposób:

public class Person
{
    //default constructor 
    public Person()
        {
        }
 
    private string _Name;
    public string Name
    {
        //set the person name
        set { this._Name = value; }
        //get the person name 
        get { return this._Name; }
    }
}

O ile w języku PHP udostępniono zarządzanie magicznymi zmiennymi poprzez funkcje __get() oraz __set(), to jednak rozwiązanie to ma jedną wielką wadę. Zmienne magiczne nie są widoczne z poziomu kodu PHP (w ramach deklaracji klasy), ani z poziomu aplikacji IDE (do czasu aż zadeklaruje się je „wirtualnie” z poziomu komentarzy phpdoc).

Przedstawiam więc kolejną, mało znaną funkcjonalność języka PHP, która rozwiązuje wspomniany problem. Jest nią umagicznianie zadeklarowanych właściwości obiektu. (więcej…)

Silne typowanie danych w PHP, część II: autoboxing oraz niezniszczalne obiekty

wtorek, 12 Kwiecień 2011

We wcześniejszym artykule dotyczącym silnego typowania opisałem mechanizm typehintów, który wymusza zgodność typów danych (także nie będących obiektami) przekazywanych do metod i funkcji. Niestety wspomniana implementacja nie zabezpiecza przed innym problemem związanym z dynamicznym typowaniem zmiennych: brakiem kontroli typu podczas nadpisywania wartości zmiennych.

W celu zapewnienia kontroli typu, postanowiłem wprowadzić do języka PHP pojęcie autoboxingu znanego z języków C#, oraz Java. (więcej…)

Code injection czyli prosty wirus PHP zapisany w obrazku JPEG

poniedziałek, 11 Kwiecień 2011

Pracując jako programista i administrator usług w firmie hostingowej spotkałem się wielokrotnie z różnymi skryptami PHP obsługującymi galerie zdjęć lub download plików. O ile zazwyczaj mechanizm był podobny (polecenia typu file_get_contents(), fopen(), readfile()), to czasami zdarzały się mniej tradycyjne implementacje.

Do napisania tego artykułu natchnął mnie jeden użytkownik serwera, który zgłosił się do mnie z problemem wysyłania plików poprzez skrypt PHP. Niektóre pliki na jego stronie udawało się wysłać w całości, niektóre nie. Nie potrafił jednak dotrzeć do sedna sprawy.

Po krótkich oględzinach okazało się, że napisany przez niego skrypt oprócz pożądanej funkcjonalności posiadał także dodatkową: dzięki użyciu polecenia include() do odczytu obrazków, był podatny na code injection w języku PHP. (więcej…)

Ciasteczka HttpOnly oraz Secure, czyli zabezpieczenia których nie ma

czwartek, 7 Kwiecień 2011

Zgodnie z dokumentacją Microsoftu flaga HttpOnly przesłana w nagłówku HTTP Set-Cookie sprawia, że w przeglądarkach WWW obsługujących ten mechanizm skrypty JavaScript nie są w stanie odczytywać, ani modyfikować zawartości ciasteczka którego ten parametr dotyczył.

Podobnie działa mechanizm Secure, z tym że nie ukrywa on danych przed skryptami JS, lecz dotyczy rodzaju połączenia, przez które przesyłane jest ciasteczko. Jeśli zostało ono ustawione jako bezpieczne, przeglądarka WWW wyśle je do serwera jedynie wtedy, gdy połączenie jest szyfrowane (HTTPS).

Poniżej prezentuję prosty przykład w języku JavaScript łamiący częściowo te zabezpieczenia. (więcej…)

Shared hosting: wykradanie ciasteczek HTTP

czwartek, 7 Kwiecień 2011

  click here to see different articles in english

Serwery typu shared web hosting posiadają jedną wielką zaletę, w przeciwieństwie do serwerów dedykowanych założenie konta jest na nich bardzo tanie. Pozwala to na szybkie i bezproblemowe założenie niewielkiej strony internetowej, małego sklepu, czy też własnego portfolio bez większych nakładów finansowych.

Wiadomo jednak, że serwery te posiadają też i swoje mroczne strony, związane szczególnie z bezpieczeństwem.

W tym artykule skupię się na jednym z mniej znanych luk bezpieczeństwa – na wykradaniu ciasteczek HTTP pomiędzy różnymi kontami na tym samym serwerze. (więcej…)

HipHop for PHP: Test wydajności – rewanż PHP

poniedziałek, 4 Kwiecień 2011

W poprzednim artykule opisałem wydajność kompilatora HipHop for PHP przedstawiając wyniki sześciu testów PHP zaczerpniętych z serwisu shootout.alioth.debian.org. Nie był to jednak kompletny zestaw skryptów możliwych do zbadania.

Wspomniane testy zostały wtedy wyselekcjonowane w taki sposób, by uniknąć potencjalnych niekompatybilności związanych z kompilacją skryptu PHP do języka C++, które zostały opisane w dokumentacji HipHop for PHP. W przypadku wspomnianych skryptów problematyczne okazało się pobieranie danych wejściowych ze strumienia STDIN (testy: reverse-complement, regex-dna, k-nucleotide), oraz brak wsparcia dla biblioteki gmp (test pidigits).

Zgodnie z prośbą czytelników przedstawiam jednak wyniki dwóch kolejnych testów: regex-dna oraz k-nucleotide.
(więcej…)

HipHop for PHP: Test wydajności

czwartek, 31 Marzec 2011

  click here for english version

Benchmark iconNa stronie shootout.alioth.debian.org znajduje się bardzo ciekawy benchmark porównujący ze sobą wydajność wielu różnych języków programowania. O ile daleki jestem od prowadzenia dyskusji na temat wyższości jednego języka nad drugim, uznałem, że ciekawie byłoby wykonać mały test prędkości pomiędzy PHP a… PHP (skompilowanym przy pomocy HipHop for PHP).

Mam nadzieję, że testy które przedstawiam poniżej okażą się pomocne w udzieleniu odpowiedzi, jak bardzo PHP przyspiesza po skompilowaniu, oraz czy HipHop for PHP jest faktycznie tak wydajny, jak twierdzą developerzy Facebooka. (więcej…)