================= APACHE STEP BY STEP =================
1. Wstęp
2. Historia
3. Instalacja
4. Konfiguracja
5. Podsumowanie

Wstęp
Apache jak już pewnie wszystkim wiadomo jest otwartym serwerem HTTP. Obecnie uważany za najpopularniejszy i posiadający najlepsze wsparcie techniczne z racji tego, że opartych na nim jest (wg badań z maja 2006 roku) aż 65% wszystkich pracujących serwerów. Pakiet Apache w połączeniu z MySQL'em i interpreterem PHP stanowi najpopularniejszą konfiguracje serwerów, używaną przez firmy hostujące. Oczywiście, odpowiednio skonfigurowany serwer Apache może obsługiwać interpretery innych języków (np. Perl, Python). Dużą zaletą Apache jest jego modularyzacja. Kilka przykładowych modułów:
• Mod_rewrite
• Mod_proxy
• Mod_negotiation
• Mod_ssl itd.
Temat zalet i wad Apache jest tak rozległy, że na jego omówienie potrzebna by była osobna prezentacja.
W tej prezentacji zobaczycie jak zainstalować cały pakiet AMP (Apache+MySQL+PHP), jak przeprowadzić podstawową konfigurację oraz jak zabezpieczyć nasz serwer.
Ale najpierw krótka historia Apache....

Historia
Kod serwera Apache powstał na bazie serwera HTTP napisanego przez Roba McCoola, pracownika NCSA. Pierwsza oficjalna wersja ujrzała światło dzienne w kwietniu 1995 roku – była to wersja 0.6.2. Zaledwie cztery miesiące później pojawiła się już wersja 0.8.8 ze znanym standardowym API. Zaś pod koniec tego samego roku (grudzień '95) na rynku była obecna już wersja 1.0 z ulepszonym modułem serwera, niezbyt obszerną dokumentacją – w tej wersji Apache pojawił się również na różne platformy.
Warto również przypomnieć, że w 1999 roku powstała fundacja Apache, która zajmuje się promowaniem tego serwera, rozwijaniem go oraz zrzeszaniem osób zainteresowanych rozwijaniem go.
Nowe wersje naszego ulubionego serwera pojawiały się przez lata. Na chwilę obecną dostępna jest już wersja 2.3 (Beta) z GUI (było obecne już w wersji 2.0).

Instalacja
Nasz serwer zainstalujemy i skonfigurujemy na systemie operacyjnym UBUNTU 11.04 jako, z racji tego, że najwięcej serwerów pracuje pod systemami z rodziny Linux.

1. Pobieramy potrzebne pakiety i biblioteki (przy okazji updatując listę źródeł ) wydając polecenie w terminalu:
"sudo apt-get udpate && sudo apt-get install apache2 php5 mysql-server
libapache2-mod-auth-mysql php5-mysql phpmyadmin"

2. Jeśli wszystko dobrze poszło, rozpocznie się pobieranie oraz instalacja. System zasugeruje nam dodatkowo, jakie pakiety moglibyśmy jeszcze zainstalować, oraz wyświetli nam te, które zostaną zainstalowane.

3. W trakcie instalacji pojawi się konfigurator naszego serwera MySQL:
Konfigurację rozpoczniemy od podania hasła dla super użytkownika (root), które następnie
potwierdzamy wpisując je ponownie.
Wszystkie wybory zatwierdzamy spacją.


4. Następnie powinno pojawić się okno konfiguracji phpMyAdmin, gdzie spacją zaznaczamy, który serwer ma zostać skonfigurowany, aby współpracował z phpMyAdmin.

5. Następnie konfigurator pyta nas o pozwolenie na konfigurację połączenia z bazą danych – oczywiście wybieramy <TAK>.

6. Podajemy hasło do bazy danych dla roota, które podaliśmy wcześniej:

7. Teraz podajemy jeszcze hasło, które pozwoli na autoryzacje podczas komunikacji z serwerem MySQL i to by było na tyle. Właśnie zakończyliśmy naszą instalacje serwera.

Po zakończonym etapie wstępnej konfiguracji i instalacji niezbędnych pakietów możemy obejrzeć efekt naszej pracy w przeglądarce:

Wszystko się powiodło. Gratulacje!

Konfiguracja
Instalacja to jednak nie wszystko. Aby wygodnie obsługiwało się naszego Apacha musimy jeszcze odrobinę go skonfigurować.
Obecnie, jeżeli chcemy udostępniać jakąkolwiek stronę musimy umieścić ją w katalogu /var/www.

Rozwiązanie to jest bardzo niewygodne. Powoduje to, że udostępniać pliki na serwerze może tylko root, ponieważ tylko on ma prawo zapisu danych w tym katalogu, a jak wiadomo z powodów bezpieczeństwa nie możemy dać zwykłemu użytkownikowi przywilejów super użytkownika. Tą przypadłość możemy ominąć w kilku krokach, tworząc dowiązanie i włączając moduł userdir.

1. Przechodzimy do katalogu domowego w którym tworzymy folder public_html, w którym będziemy udostępniali nasze pliki na serwerze, a następnie tworzymy dwa dowiązania symboliczne:
"sudo ln -s /etc/apache2/mods-available/userdir.conf userdir.conf
sudo ln -s /etc/apache2/mods-available/userdir.load userdir.load"
2. Następnie, jako super user edytujemy plik php5.conf. Wydajemy polecenie:

"sudo gedit /php5.conf"

odnajdujemy:

#<IfModule mod_userdir.c>
# <Directory /home/*/public_html>
# php_admin_value engine Off
# </Directory>
#</IfModule>

i dodajemy na początku każdej linii "#".

3. Po wszystkich tych wykonanych czynnościach należy zrestartować Apache poleceniem:
"sudo /etc/init.d/apache2 restart"

4. Ostatnią czynnością jaką wykonamy przy konfiguracji jest nadanie odpowiednich praw, odpowiednim folderom:
- /home/*
- /homt/*/public_html

wydając polecenie:

"chmod 755 /home/nazwa_uzytkownika"
"chmod 755 /home/nazwa_uzytkownika/public_html"

5. Po zabawie z nadawaniem praw, możemy zobaczyć efekt naszej konfiguracji. Umieszczamy w folderze /home/adam/public_html/ plik index.php, a w nim króciutki skrypt:

<?php 

echo "Hello World!"
?>

W efekcie, czego powinniśmy zobaczyć: Hello World!

W ten oto sposób zakończyliśmy podstawową konfigurację serwera Apache na systemie operacyjnym UBUNTU 11.04.
Podkreślam podstawową, bo jeszcze należy pamiętać o konfiguracji phpMyAdmin – dla wygody użytkownika – oraz kwestii bezpieczeństwa naszego serwera.

Rozpoczniemy od konfiguracji dostępu do phpMyAdmin.
1. Domyślnie, pakiet ten został zainstalowany w /usr/share/phpmyadmin. Naszym zadaniem będzie teraz wykonanie dowiązania do aplikacji w katalogu /var/www/.
2. Składnia dowiązania powinna być nam już świetnie znana z etapu konfiguracji serwera:
"sudo ln -s /usr/share/phpmyadmin /var/www/phpmyadmin"
3. I to tyle. Teraz możemy sprawdzić efekt wpisując w przeglądarce:
"http://localhost/phpmyadmin/"

Abyśmy mogli powiedzieć, że instalacja i konfiguracja naszego własnego serwera została w pełni zakończona musimy jeszcze uwzględnić kwestię bezpieczeństwa.
Przy zabezpieczaniu, powinniśmy przemyśleć sprawę:
• Uprawnień do plików
• Zmniejszenia możliwości pozyskania informacji o serwerze Apache przez Hakera (zbyt wiele informacji o serwerze zdecydowanie działa na naszą niekorzyść)

Uprawnienia do plików
Zapewne wszyscy pamiętają sposób odczytu i nadawania uprawnień plikom lub folderom
w systemach z rodziny Linux. Przejdźmy, zatem do konkretów i wykonajmy pewien test.
W folderze /home/adam/public_html umieśćmy plik password.inc z pewną zawartością.

> cd /home/adam/public_html/
> touch password.inc
> echo 'tajnehaslo' >> password.inc

Stworzyliśmy plik, który zawiera nasze tajne hasło, którego nikt nie powinien poznać. Jednakże wystarczy wpisać w przeglądarce http://localhost/~adam/password.inc, a ujrzymy jego zawartość. Ważny plik powinien być dostępny jedynie dla jego właściciela – jedną z najprostszych metod naprawienia tego będzie nadanie plikowi odpowiednich uprawnień do plików użytkownikom serwera.

> chmod u+rwx /home/adam/public_html/password.inc
> chmod go-r /home/adam/public_html/password.inc

Pierwsze polecenie nadaje prawa odczytu, zapisu i wykonania dla właściciela pliku, zaś drugi odbiera prawo odczytu grupie i pozostałym użytkownikom.
Jeśli wszystko poszło dobrze, naszym oczom powinno się ukazać:

Teraz już nikt oprócz nas nie odczyta zawartości pliku, na którego nałożymy ograniczone prawa dostępu.

Ograniczenie dostępu do informacji o serwerze
Dzięki uzyskaniu informacji na temat serwera osoba chcąca się włamać będzie miała zdecydowanie łatwiej. Bez problemu będzie mogła wytropić na internetowych forach luki w zabezpieczeniach danej wersji Apache czy jakiegoś dodatku, który zainstalowaliśmy na serwerze. Jaki jest najprostszy sposób żeby zdobyć informacje na temat serwera? Wywołać błąd serwera – np. 404.
Przy próbie wywołania błędu w dolnej części strony ujrzymy kilka informacji na temat naszego serwera:

Aby ukryć te informacje musimy edytować plik apache2.conf znajdujący się w folderze /etc/apache2/. Na końcu pliku wystarczy zmienić zawartość ServerTokens lub dopisać go z opcją Prod, a następnie zrestartować serwer.

> sudo gedit /etc/apache2/apache2.conf
...
> sudo /etc/init.d/apache2 restart

Po wszystkich wykonanych czynnościach informacje o serwerze nie powinny być już dłużej wyświetlane:
W kwestii ograniczenia dostępu do informacji powinniśmy zadbać o jeszcze jedną rzecz. O zakaz listowania katalogów na naszym serwerze, (jeżeli katalog nie zawiera pliku index.* wszystkie jego pliki i podkatalogi zostają wyświetlone w przeglądarce). W tym celu wystarczy usunąć moduł autoindexu i zrestartować nasz serwer:

> sudo rm /etc/apache2/mods-enabled/autoindex.*
> sudo /etc/init.d/apache2 restart

Gratulacje! Właśnie udało nam się przeprowadzić podstawową konfigurację i zabezpieczenia naszego serwera. Teraz możemy napisać wspaniały portal.

Podsumowanie
Podsumowując, Apache to otwarty serwer o bardzo wielu możliwościach i bardzo prosty
w obsłudze. Jako jego administratorzy mamy prawie nieograniczoną swobodę w konfiguracji jego działania – jednakże nie pozwoli nam na nic, co mogłoby spowodować uszkodzenie serwera.
W połączeniu z interpreterem PHP i bazą danych MySQL daje nam możliwość sprawnego zarządzania naszą stroną. Obecnie jest dostępnych wiele, gotowych do instalacji, pakietów (XAMPP, Krasnal itd.) zawierających Apache, PHP i MySQL, co pozwala na jeszcze szybsze rozpoczęcie pracy – przez usprawnienie konfiguracji i instalacji. Jednak należy pamiętać, że jako projekt open source istnieje w nim wiele luk, które sprawny Haker potrafi wykorzystać bez żadnych przeszkód – pamiętajmy o aktualizacji i zabezpieczeniu serwera.

================= PHP =================

Co to jest PHP?
PHP (Personal Home Page/PHP: Hypertext Preprocessor) to skryptowy język programowania zaprojektowany do generowania stron internetowych w czasie rzeczywistym. Oznacza to, że każde uruchomienie skryptu powoduje ponowną kompilacje kodu, interpretacja następuje bezpośrednio z tekstowej postaci źródłowej. PHP jest językiem obiektowym rozprowadzanym na otwartej licencji (GPL).
PHP jest najczęściej stosowany do tworzenia skryptów po stronie serwera WWW, ale może być on również używany do przetwarzania danych z poziomu wiersza poleceń, a nawet do pisania programów pracujących w trybie graficznym (np. za pomocą biblioteki GTK+, używając rozszerzenia PHP-GTK). Implementacja PHP wraz z serwerem WWW Apache oraz serwerem baz danych MySQL określana jest jako platforma AMP (w środowisku Linux – LAMP, w Windows – WAMP).

Historia powstania PHP
Pierwsza wersja PHP, rozpowszechniana pod nazwą PHP/FI (Personal Home Page/Forms Interpreter), została stworzona przez Rasmusa Lerdorfa w roku 1994 jako zestaw skryptów Perla służący do monitorowania internautów odwiedzających jego witrynę. Gdy ruch stał się zbyt duży, przepisał je w języku C, dodając przy tym nowe opcje. Niedługo później ludzie zaczęli prosić go o możliwość użycia tych narzędzi na swoich stronach, zatem 8 czerwca 1995 roku autor udostępnił publicznie kod źródłowy (PHP Tools 1.0). Już kilka miesięcy później projekt przekształcił się w zalążek znanego obecnie języka programowania, gdy został połączony z innym narzędziem Rasmusa Lerdorfa - Form Interpreter, które dało drugi człon nazwy. W 1997 roku pojawiło się PHP/FI 2.0, posiadające wtedy kilka tysięcy aktywnych użytkowników na całym świecie oraz obsługujące 50 tys. domen. Co ciekawe, wersja ta spędziła większość "życia" na beta testach. Oficjalne wydanie było tylko jedno i ukazało się w listopadzie 1997 roku.

W 1997 roku projektem zainteresowali się dwaj izraelscy programiści: Zeev Suraski i Andi Gutmans. Odkryli oni, że PHP/FI ma zbyt małe możliwości na potrzeby aplikacji eCommerce, którą tworzyli na uniwersytecie. Zdecydowali wtedy, że przepiszą kod PHP całkowicie od nowa, korzystając z pomocy już istniejącej społeczności PHP. W czerwcu 1998 roku ogłosili PHP 3.0 jako następcę PHP/FI, którego dalszy rozwój został wtedy zatrzymany.

W połowie roku 1999 ukazał się oficjalnie Zend Engine, nowy silnik języka skryptowego, wokół którego niedługo później zaczęto budować PHP 4.

W 2002 roku Zeev Suraski oraz Andi Gutmans ponownie rozpoczęli znaczącą modernizację silnika PHP mającą na celu dodanie do tego języka modelu obiektowego z prawdziwego zdarzenia. W lutym 2003 ukazała się pierwsza wersja alpha nowej wersji PHP oznaczonej numerem 5.0.0. Stabilna wersja ukazała się prawie półtora roku później, w lipcu 2004 roku. Nowości sprawiły, że PHP może konkurować teraz z innymi rozwiązaniami server-side, jak równy z równym. Pojawił się całkowicie nowy model programowania obiektowego, przez co niestety została utracona część kompatybilności z poprzednimi wersjami PHP w niektórych skryptach.

W połowie roku 2005 zaczęły pojawiać się oficjalne sygnały, że rozpoczęto wstępne prace nad PHP 6. Obecnie publicznie dostępne są codzienne snapshoty rozwojowego repozytorium kodu źródłowego, które można ściągnąć i przetestować. Głównym celem jest dalsze dążenie do ujednolicenia projektu, wprowadzenia dalszych możliwości wymaganych przez złożone projekty (m.in. pełne wsparcie unicode czy system cache'owania kodu). Usuwane są też kolejne archaiczne rozwiązania pochodzące jeszcze z czasów PHP/FI oraz PHP3, co w przypadku najstarszych skryptów ponownie spowoduje problemy z kompatybilnością.

Alternatywy dla PHP
PHP zdobył przed laty popularność jako język skryptowy do tworzenia stron internetowych. Wzięła się ona z pewnością stąd, że jeszcze kilka lat temu nie było alternatywy dla szybkiego, prostego i dostosowanego do potrzeb WWW języka. Dziś jest inaczej, pojawiły się języki i technologie, które również powstały się z myślą o programowaniu webowym:

ASP .NET
Jest to zbiór technologii opartych na frameworku zaprojektowanym przez firmę Microsoft. Przeznaczony jest do budowy różnorodnych aplikacji webowych a także aplikacji typu XML Web Services. Strony ASP.NET są uruchamiane przy użyciu serwera, który umożliwia wygenerowanie treści HTML(CSS), WML lub XML.

Java (J2EE)
Java Platform Enterprise Edition (znana również jako J2EE), dedykowany do obsługi architektury klient-serwer. Aplikacja Java jest tutaj uruchamiana po stronie serwera (jako serwlet lub skrypt JSP – ten drugi jest bardziej podobny do PHP, ten pierwszy do aplikacji w Pythonie).

Ruby
Interpretowany, w pełni obiektowy i dynamicznie typowany język programowania. Od roku 2003 lawinowo zdobywa nowych zwolenników, głównie za sprawą popularnego frameworku do tworzenia aplikacji webowych o nazwie Ruby on Rails http://rubyonrails.org

Python
Interpretowany, interaktywny język programowania. Python posiada w pełni dynamiczny system typów i automatyczne zarządzanie pamięcią, jest zatem podobny do takich języków jak Perl czy Ruby.
Spopularyzowany w technologiach webowych za sprawą frameworków takich jak:
Django https://www.djangoproject.com/
Pylons http://www.pylonsproject.org/
Web2py http://www.web2py.com/

Dlaczego warto znać PHP?
Jest kilka powodów dla których warto znać język PHP:
1. Bardzo łatwo jest się go nauczyć.
2. Od wersji PHP 5 posiada zadowalające wsparcie dla programowania obiektowego.
3. Hosting dla serwisów napisanych w PHP jest tani i powszechny co w porównaniu z cenami hostingu dla innych języków odgrywa dużą rolę w szczególności dla osób, które zaczynają przygodę z technologiami webowymi.
4. Popularność języka przekłada się również na dużą ilość ofert pracy.
Oczywiście znajdą się także wady języka PHP takie jak:
1. Z początkowego okresu rozwoju PHP przetrwało aż do dziś trochę niekonsekwencji oraz nieścisłości, które sprawiają pewne kłopoty programistom.
2. Brak ujednoliconego nazewnictwa - większość starszych modułów korzysta z różnych standardów nazywania poszczególnych funkcji, co utrudnia ich zapamiętywanie.
3. PHP za każdym uruchomieniem skryptu wykonuje jego kompilację i choć interpreter PHP jest niezwykle wydajny, to z powodu nadkładania sobie pracy szybko traci zapas mocy.
4. Twórcy PHP świadomi są ograniczeń i starają się nie ignorować programistów. Problemem jest zachowanie kompatybilności wstecznej z olbrzymią bazą już stworzonego kodu PHP.
5. Duża ilość programistów PHP przekłada się na niskie stawki w tej branży.
PHP jest, mimo swoich wad, niezwykle popularny. Wykonać w nim można wszystkie typy witryn internetowych: od stron domowych przez sklepy internetowe, aż do komercyjnych portali czy projektów pokroju Facebooka. Polska społeczność PHP jest bardzo aktywna i napisała do tego języka wiele poradników co w połączeniu z łatwym dostępem do książek, daje naprawdę atrakcyjny produkt, jeśli chodzi o wsparcie. Nietrudno jest także zlokalizować dobry hosting, który za niewielką opłatą udostępni na serwerze konto z PHP oraz bazą danych.

Instalacja PHP na Linux/Windows
Instalacja w systemach Unix/Linux
Niemal wszystkie dystrybucje systemu Linux mają w swoich zasobach pakiety PHP. Jeżeli nie czujesz się na siłach instalować projektu ze źródeł, możesz skorzystać z tego rozwiązania i postępować odpowiednio według instrukcji systemu pakietów używanego w twojej dystrybucji. Pakiety mają jednak kilka wad, a najważniejszą z nich jest konieczność polegania na intuicji autora pakietów. Interpreter nie zawsze jest skonfigurowany tak, jak byśmy chcieli, a ponadto należy ręcznie uaktywnić sobie dodatkowe moduły.

Red Hat/CentOS
Jeśli masz już zainstalowany serwer apache wystarczy doinstalować php.
# yum install php

Debian/Ubuntu
# apt-get install apache2
# apt-get install libapache2-mod-php5 php5-cli php5-common php5-cgi

Instalacja na Windows
Jeśli używasz system Windows możesz wygodnie pracować pisząc swoje aplikacje i testując je na localhost. W tym celu możesz skorzystać z gotowych programów, które zawierają już PHP oraz serwer apache wraz z dodatkowymi modułami i obsługą bazy danych MySQL.

XAMPP
Jest darmowym, wieloplatformowym zintegrowanym pakietem, składającym się głównie z serwera Apache, bazy danych MySQL i interpreterów dla skryptów napisanych w PHP i Perlu.
http://www.apachefriends.org/en/xampp.html

WAMP
Pakiet wolnego oprogramowania do obsługi witryn internetowych w środowisku MS Windows, zawierający programy open source: serwer Apache, język skryptowy PHP, bazę danych MySQL i oprogramowanie uzupełniające.
http://www.wampserver.com/en/

Podstawy języka PHP
Skrypty napisane w PHP rozpoczynamy w taki sposób:

<?php

// jakiś kod
?>

Można rozpoczynać je również w ten sposób:

<?

// jakiś kod
?>

Ponadto skrypty PHP mogą być osadzone w kodzie HTML.

<html>

<head>
<title>Strona WWW</title>
</head>
<body>
Dzisiejsza data: <?php echo date('Y-m-d H:i:s'); ?>
</body>
</html>

Należy pamiętać o tym aby plik miał rozszerzenie .php. Tylko wtedy osadzony kod PHP w HTMLu będzie interpretowany.

W PHP występuje kilka rodzajów komentarzy

<?php

// komentarz jednolinijkowy

# to także komentarz jednolinijkowy

/*
Komentarz blokowy
Druga linia
*/
?>

PHP nie wymaga od programisty deklarowania typu zmiennej, możemy jednak tymczasowo ustalić jej typ (rzutowanie typów):

<?php 

$liczba = (int) "3.14"; // zmienna będzie zawierać liczbę całkowitą 3
$liczba = (float) "3.14"; // zmienna będzie zawierać liczbę zmiennoprzecinkową 3.14

?>

Rzutowanie w PHP odbywa się automatycznie w zależności od potrzeby PHP sam rzutuje zmienne na odpowiedni typ.

<?php 

$a = 2;
$b = "4";

$suma = $a + $b; // wynik 8

// znak kropki służy do konkatenacji
echo 'Wynik to: '.$suma;

// Jeśli string zawrzemy w cudzysłów to zmienne znajdujące się w nim będą
// zamienione na ich wartości
echo "Wynik to: $suma"; // wyświetli: Wynik to: 8

// wyświetli: Wynik to: $suma ($suma nie zostanie zastąpiona na wartość 8)
echo 'Wynik to: $suma';

?>

Niezwykle przydatne przy nauce PHP jest korzystanie z oficjalnej strony http://php.net/ która zawiera bogatą dokumentacje. Znajdziemy tam opis działania wszystkich funkcji, klas, modułów w PHP oraz komentarze użytkowników, które zawierają nietypowe i przydatne przykłady kodu z użyciem danych funkcji PHP.

Warto również zapoznać się z licznymi darmowymi kursami PHP:
http://pl.wikibooks.org/wiki/PHP
http://webhosting.pl/Kurs.PHP..Wstep.do.programowania.w.popularnym.jezyku.skryptowym
http://webmaster.helion.pl/index.php/kurs-php
http://www.w3schools.com/php/

Przykładowe skrypty w PHP

Interfejsy, klasy abstrakcyjne i dziedziczenie
Poniższy przykład przedstawia wykorzystanie interfejsów, klas abstrakcyjnych i dziedziczenia w PHP.
Każda klasa została opisana komentarzem więc nie powinno być problemów ze zrozumieniem tego przykładu.

<?php

/*
* Interfejs jest zbiorem nazw operacji (metod), których istnienia wymagamy od implementującej go klasy.
* Interfejs możemy traktować, jak coś w rodzaju klasy czysto abstrakcyjnej.
*/
interface BrylaInterface
{
public function ustawNazweBryly($nazwa);
public function wyswietlObjetosc();
}

//-----------------------------------------------------------------------------------------

abstract class Bryla implements BrylaInterface
{
private $_nazwaBryly;
protected $objetosc;

/**
* Metoda final. Nie można jej nadpisać w klasie pochodnej
*/
final public function ustawNazweBryly($nazwa)
{
$this->_nazwaBryly = $nazwa;
}

final public function wyswietlObjetosc()
{
#$this->oblicz(); // wywołanie metody która obliczy objętość
echo '<p>Objętość dla bryły <b>'.$this->_nazwaBryly.'</b> wynosi: '.$this->objetosc.'</p>';
}

/**
* Metoda abstrakcyjna, musi zostać nadpisana w klasie pochodnej
*/
abstract public function oblicz();
}

//-----------------------------------------------------------------------------------------

class Kula extends Bryla
{
protected $r; // promień

public function __construct($r)
{
$this->r = $r;
}

public function oblicz()
{
$this->objetosc = 4/3 * M_PI * pow($this->r,3);
}
}

//-----------------------------------------------------------------------------------------

class Stozek extends Kula
{
protected $h; // wysokość

public function __construct($r, $h)
{
$this->r = $r;
$this->h = $h;
}

public function oblicz()
{
$this->objetosc = 1/3 * M_PI * pow($this->r,2) * $this->h;
}
}

//-----------------------------------------------------------------------------------------

class Walec extends Stozek
{
// używany jest konstruktor rodzica

public function oblicz()
{
$this->objetosc = M_PI * pow($this->r,2) * $this->h;
}
}

//-----------------------------------------------------------------------------------------

class Rura extends Walec
{
protected $r1; // promień wewnętrzny

public function __construct($r, $r1, $h)
{
$this->r = $r;
$this->r1 = $r1;
$this->h = $h;
}

public function oblicz()
{
$this->objetosc = M_PI * $this->h * ( pow($this->r,2) - pow($this->r1,2) );
}
}

//-----------------------------------------------------------------------------------------
// nagłówek z kodowaniem znaków
header("Content-type: text/html; charset=UTF-8");

$kula_1 = new Kula(3);
$kula_1->ustawNazweBryly('Kula 1');
$kula_1->oblicz();
$kula_1->wyswietlObjetosc();

$kula_2 = new Kula(5);
$kula_2->ustawNazweBryly('Kula 2');
$kula_2->oblicz();
$kula_2->wyswietlObjetosc();

$stozek_1 = new Stozek(3, 7);
$stozek_1->ustawNazweBryly('Stożek 1');
$stozek_1->oblicz();
$stozek_1->wyswietlObjetosc();

$walec_1 = new Walec(3, 7);
$walec_1->ustawNazweBryly('Walec 1');
$walec_1->oblicz();
$walec_1->wyswietlObjetosc();

$rura_1 = new Rura(3, 2.5, 7);
$rura_1->ustawNazweBryly('Rura 1');
$rura_1->oblicz();
$rura_1->wyswietlObjetosc();

?>

A oto efekt działania powyższego skryptu:

Objętość dla bryły Kula 1 wynosi: 113.09733552923
Objętość dla bryły Kula 2 wynosi: 523.5987755983
Objętość dla bryły Stożek 1 wynosi: 65.973445725386
Objętość dla bryły Walec 1 wynosi: 197.92033717616
Objętość dla bryły Rura 1 wynosi: 60.475658581604

Skrypt do mierzenia czasu wykonania kodu
Drugi przykład to skrypt, który możemy wykorzystać do zmierzenia czasu generowania strony lub czasu wykonywania pojedynczych fragmentów kodu np. jak w poniższym przykładzie czasu wykonania pętli for.

<?php

class LoadTimeCounter {
private $time_start; // czas rozpoczęcia ładowania strony
private $time_end; // czas zakończenia ładowania strony
private $time_diff; // różnica czasu (dokładny czas ładowania strony)

/*
* Utworzenie obiektu oznacza start licznika
*/
function __construct()
{
$this->time_start = $this->getTime();
}

/*
* Funkcja zwracająca obecny czas z dużą dokładnością
*/
private function getTime()
{
/*
microtime — Zwraca aktualny uniksowy znacznik czasu z mikrosekundami
Zwraca łańcuch znaków "msec sec", gdzie sec jest aktualnym czasem, mierzonym jako liczba sekund od uniksowej Epoki (1 stycznia 1970, 0:00:00 GMT),
natomiast msec jest aktualną liczbą mikrosekund.
explode - tworzy tablice ze stringu "msec sec" używając spacje jako znak podziału
*/
list($usec, $sec) = explode(' ', microtime());
return ((float)$usec + (float)$sec); // zwracamy aktualny czas w postaci sumy mikrosekund i sekund od początku epoki uniksowej
}

/*
* Zatrzymuje licznik
*/
public function stopCounter()
{
$this->time_end = $this->getTime();
}

/*
* Zwraca różnice czasu, czyli czas ładowania strony
*/
public function getDiff()
{
return $this->time_end-$this->time_start;
}
}

//-----------------------------------------------------------------------------------------
// nagłówek z kodowaniem znaków
header("Content-type: text/html; charset=UTF-8");

$timer = new LoadTimeCounter();

$a = 2;
// wykonujemy milion razy jakieś skomplikowane obliczenia
for($i=0; $i<1000000; $i++)
{
$a = pow($a,sqrt($a));
}

$timer->stopCounter();

echo 'Czas ładowania strony: '.$timer->getDiff().' sekund';

?>

Wynik powyższego kodu to informacja o czasie jaki był potrzebny na wykonanie pętli for milion razy.

Czas ładowania strony: 0.95559000968933 sekund

Klasa do wyświetlania filmików na podstawie adresu url
Poniższy przykład to klasa, która na podstawie podanego do konstruktora stringa z urlem do filmiku potrafi wygenerować kod HMTL, który wyświetli ten filmik. Klasa obsługuje trzy serwisy: YouTube.com, Vimeo.com, Metacafe.com.

<?php

class Film
{
private $tytul; // tytuł filmiku
private $img_url; // link do obrazka miniaturki filmiku
private $kod_html; // kod html który wyświetla filmik


function __construct($filmik_link)
{
// ustalamy z jakiego serwisu pobieramy film
if(preg_match('#youtube.com#',$filmik_link))
{
$filmik_link = preg_replace('/(.*)watch[?#][!]?v=(.+)/','\2',$filmik_link);
$filmik_link = substr($filmik_link,0,11);

$this->tytul = ''; // brak
$this->img_url = 'http://i.ytimg.com/vi/'.$filmik_link.'/default.jpg';
$this->kod_html = '<iframe width="560" height="345" src="http://www.youtube.com/embed/'.$filmik_link.'" frameborder="0" allowfullscreen></iframe>';

}
else if(preg_match('#vimeo.com#',$filmik_link))
{
# http://www.vimeo.com/api/docs/oEmbed

$oembed_endpoint = 'http://www.vimeo.com/api/oembed';

// Create the URLs
$json_url = $oembed_endpoint.'.json?url='.rawurlencode($filmik_link);
$xml_url = $oembed_endpoint.'.xml?url='.rawurlencode($filmik_link).'&width=560&height=345';

// Load in the oEmbed XML
$oembed = @simplexml_load_file($xml_url);


$this->tytul = $oembed->title;

$this->img_url = $oembed->thumbnail_url;

$this->kod_html = html_entity_decode($oembed->html);
}
else if(preg_match('#metacafe.com#',$filmik_link))
{
$filmik_link = preg_replace('#(.*?)metacafe.com/watch/([0-9]+)#','\2',$filmik_link);
$filmik_link_last_znak = $filmik_link[strlen($filmik_link)-1];
if($filmik_link_last_znak == '/') {
$filmik_link = substr($filmik_link,0,-1); // usuwa ostatni slash z linku do filmu
}

$this->tytul = ''; // brak

// wycięcie samego id z filmik_link (zawiera nazwe filmu by wygenerowac flashplayer "1805337/sniper_shot_of_century ")
preg_match('#([0-9]+)#',$filmik_link, $img_id);

$this->img_url = 'http://www.metacafe.com/thumb/'.$img_id[0].'.jpg';

$this->kod_html = '<embed src="http://www.metacafe.com/fplayer/'.$filmik_link.'.swf" width="560" height="345" wmode="transparent" pluginspage="http://www.macromedia.com/go/getflashplayer" type="application/x-shockwave-flash"> </embed>';

}
}

public function wyswietlFilm()
{
echo $this->kod_html;
}

public function miniaturka()
{
return $this->img_url;
}

public function tytul()
{
return $this->tytul;
}

}

//-----------------------------------------------------------------------------------------
// nagłówek z kodowaniem znaków
header("Content-type: text/html; charset=UTF-8");

$film_1 = new Film('http://www.youtube.com/watch?v=1bYDkT01eBM');
$film_1->wyswietlFilm();

echo '<hr>';

$film_2 = new Film('http://vimeo.com/17053492');
$film_2->wyswietlFilm();

echo '<hr>';

$film_3 = new Film('http://www.metacafe.com/watch/7356574/call_of_duty_modern_warfare_3_redemption_trailer/');
$film_3->wyswietlFilm();

?>

Podsumowanie
Po krótkim zapoznaniu się z Apache+PHP można stwierdzić, że jest to całkiem sprawny duet, który świetnie nadaje się do tworzenia w szybki sposób prostych, użytecznych rozwiązań webowych. Dodając do tego bazę danych w postaci MySQL lub Postgresql zyskujemy darmowe narzędzia nadające się doskonale do stworzenia swojej strony lub większego portalu/sklepu internetowego.

Bibliografia
http://pl.php.net
http://pl.wikipedia.org
http://pl.wikibooks.org/wiki/PHP
http://php.pl
http://www.php.rk.edu.pl
http://www.w3schools.com/php/
http://www.apache.org/
http://www.phpmyadmin.net/home_page/index.php