Optymalizacja i bezpieczeństwo PHP – Rasmus Lerdorf

20 i 21 lutego Rasmus ewangelizował nas na temat optymalizacji kodu, bezpieczeństwa aplikacji i tworzenia modułów PHP. Mówił o tym, jak zoptymalizować kod i ustawienia PHP tak, aby wyciągnąć jak największą liczbę odpowiedzi na sekundę i jak najkrótszy czas oczekiwania na odpowiedź serwera. Chwalił się też swoimi nowymi zabawkami w PHP i AJAX. Jeśli ktoś ma ochotę zostać poleconym do pracy w Yahoo!, może się z nim skontaktować. Może też się skontaktować ze mną :-) .

Kim jest Rasmus Lerdorf?

Rasmus stworzył pierwsze wersje PHP, zanim Andi Gutmans i Zeev Suraski zdecydowali się przepisać moduł kompilatora PHP, a pózniej założyć Zend i wypuścić PHP4. W 1993 i 1994 roku pracował dla brazylijskiej firmy w USA. W tym czasie web zaczął się dynamiczniej rozwijać. Rasmus próbował przekonać swoich dyrektorów, że czas zapomnieć o aplikacjach desktopowych i przenieść ich funkcje do Internetu. Nie udało mu się to i postanowił zająć się programowaniem aplikacji WWW już bez nich.

Zaczął pracować jako niezależny konsultant. Aplikacje swoje tworzył w C, często kompilując je jako część serwera WWW. W ten sposób uzyskiwał dużą szybkość działania, ale tracił na przenośności aplikacji i na możliwości łatwej jej modyfikacji. Kod HTML był wkompilowany w aplikacje i nawet niewielka zmiana, typu zmiany koloru tła strony, wymagała rekompilacji całego kodu zarówno aplikacji, jak i serwera, w którym była osadzona.

Po pewnym czasie Rasmus zauważył pewne elementy kodu, które powtarzały się w aplikacjach tworzonych dla różnych klientów. Do tego dochodziła jeszcze kwestia możliwości modyfikacji szablonów stron, a raczej jej braku. Postanowił z powtarzających się części kodu wydzielić część wspólną, a szablony stron HTML zapisywać jako osobne pliki. Niedługo później doszła potrzeba wpisywania zmiennych w szablony oraz warunkowego wykonania kodu: if, if-else, while… W ten sposób wśród skomplikowanych i nobilitujących języków programowania pojawił się mały łobuziak: PHP.

Na początku kod w szablonie był wykonywany linia-po-linii w trakcie odczytu pliku z dysku. Kod nie był kompilowany. Wykonywanie pętli while() polegało na tym, że PHP zapamiętywał pozycję znacznika w pliku za pomocą funkcji ftell() w C, a następnie używał fseek(), aby powrócić do początku pętli, cały czas operując na otwartym pliku. Swoim klientom, którzy mieli problemy z wydajnością aplikacji Rasmus radził, aby kupili szybsze twarde dyski :-)

Czasy te na szczęście należą do przeszłości. Dzięki wkładowi wielu ludzi na całym świecie, PHP rozwinął się na tyle, że stał się najpopularniejszym językiem programowania aplikacji www na świecie. PHP pozwala nie tylko programistom na tworzenie dynamicznych stron i serwisów internetowych. Udało mu się wprowadzić programowanie „pod strzechy”. Rasmusowi udało się natomiast przekonanie wielu ludzi, że PHP stał się na tyle zaawansowanym językiem programowania, że może być używany przez aplikacje obsługujące miliony użytkowników w setkach języków na całym świecie.

Szybciej i szybciej

Prezentacja, którą Rasmus Lerdorf prowadził dla nas, była nieco bardziej rozbudowaną wersją prezentacji, która tydzień wcześniej odbyła się w Kanadzie. Różnica polegała głównie na opisywaniu specyficznych modułów i ustawień stosowanych w Yahoo!. Przykład optymalizacji prostej aplikacji (może to niewłaściwa nazwa dla kilkunastu linijek kodu) dokładnie jest opisana w prezentacji, do której odnośnik znajduje się powyżej. Optymalizacja ta polega głównie na analizie wykonania aplikacji za pomocą profilera Callgrind i części wizualnej: KCacheGrind. Rasmus pokazuje w jaki sposób można przejść od 17 do ponad 1000 zapytań na sekundę analizując i optymalizując kod i ustawienia PHP oraz wykorzystując opcode cache – APC w tym przypadku. W PHP6 APC ma już być częścią PHP, chociaż domyślnie wyłączoną,

Bezpieczny kod

W dalszej części rozmowy Rasmus omawiał sposoby walki z niewłaściwym wykorzystaniem aplikacji webowych przez użytkowników, zarówno nieświadomych, jak i zdających sobie sprawę z niepożądanych dla twórcy aplikacji efektów ich działań. Do demonstracji używał napisanego przez siebie narzędzia Scanmus (obecnie dostępnego jedynie wewnątrz Yahoo!, chociaż możliwe, że Rasmus zdecyduje się je udostępnic na zewnątrz. Domenę już zarezerwował…). Scanmus umożliwia automatyczną ocenę podatności stron na ataki XSS – Cross Site Scripting. Więcej informacji na temat takich testów można znaleźć w ściągawce XSS.

W dalszej części rozmowy o bezpieczeństwie kodu rozmawialiśmy o konieczności filtrowania danych przychodzących do aplikacji z różnych źródeł, najczęscięj od użytkowników. W Yahoo! używa się biblioteki Yahoo Input Validation (YIV), która była pierwowzorem modułu filter w PHP. Moduł ten może okazać się niezbędny, jeśli myślimy o właściwym i prostym zabezpieczeniu aplikacji przed atakami hackerów i script kiddies.

Na końcu spotkania poznaliśmy kilka ciekawych zabawek Rasmusa, chociaż bardziej związanych z programowaniem PHP, RSS i AJAX, niż z bieganiem w butach z kalkulatorem spalanych kalorii ;-)

BTW: Rasmus preferuje programowanie strukturalne i nie lubi za bardzo OOP, ani pakowania wszystkiego na siłę w MVC. Jego zdaniem stosowanie Page Controllera można jeszcze uzasadnić. Nie rozumie natomiast, po co robić Application Controller jako punkt wejścia dla całej alikacji… Tę funkcję bardzo dorze spełnia sam serwer, delegując wykonanie różnych części aplikacji do różnych skryptów je obsługujących…

Ten wpis został opublikowany w kategorii Architektura, PHP, Yahoo. Dodaj zakładkę do bezpośredniego odnośnika.

Dodaj komentarz

Twój adres e-mail nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *

*

Możesz użyć następujących tagów oraz atrybutów HTML-a: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>