Java na webovém serveru: porovnání Javy a PHP

java perex

Dnes na chvíli vybočíme z praktické linie tohoto seriálu a budeme se místo další práce na naší aplikaci věnovat obecnějšímu srovnání Javy na webu s jiným používaným jazykem, a to konkrétně PHP. Podíváme se na oba jak z hlediska jazyka, tak i z pohledu nasazení na server a dostupnosti hostingu.

Seriál: Java na webovém serveru (16 dílů)

  1. Java na serveru: úvod 8.1.2010
  2. Java na webovém serveru: první web 15.1.2010
  3. Java na webovém serveru: práce s databází 29.1.2010
  4. Java na webovém serveru: práce s databází II 12.2.2010
  5. Java na webovém serveru: lokalizace a formátování 19.2.2010
  6. Java na webovém serveru: autorizace a autentizace 26.2.2010
  7. Java na webovém serveru: autorizace a autentizace II 5.3.2010
  8. Java na webovém serveru: porovnání Javy a PHP 10.3.2010
  9. Java na webovém serveru: Vlastní JSP značky a servlety 17.3.2010
  10. Java na webovém serveru: posílání e-mailů a CAPTCHA 24.3.2010
  11. Java na webovém serveru: píšeme REST API 7.4.2010
  12. Java na webovém serveru: SOAP webové služby 14.4.2010
  13. Java na webovém serveru: hlasování a grafy v SVG 28.4.2010
  14. Java na webovém serveru: Komentáře a integrace s Texy 9.6.2010
  15. Java na webovém serveru: AJAX formuláře 23.6.2010
  16. Java na webovém serveru: implementujeme Jabber 30.6.2010

Historie PHP sahá do roku 1994, kdy Rasmus Lerdorf vytvořil sadu skriptů v Perlu a vydal ji jako balíček „Personal Home Page“, což byl původní význam zkratky PHP. Od této sady skriptů po aktuální verzi 5.3 udělalo PHP velký pokrok (místy bouřlivější, než si jeho uživatelé přáli). Dnešní název jazyka se vykládá jako rekuzrivní zkratka „PHP: Hypertext Preprocessor“.

Na jazyce Java se začalo pracovat už v roce 1991 a první veřejná verze byla uvolněna roku 1995. Jejím autorem je James Gosling. Ke svému názvu Java údajně přišla podle slangového označení pro kávu, kterou programátoři rádi pijí. I tento jazyk se průběžně vyvíjí a dnes je ve verzi 6. Za vývojem Javy stojí firma Sun Microsystems (dnes součást Oracle Corporation).

Programovací jazyk

Programovací jazyky dělíme do skupin podle různých kritérií. Např. kompilované vs. interpretované, silně vs. slabě typované, staticky vs. dynamicky typované, objektové vs. procedurální. Podívejme se, jak se v těchto ohledech liší Java a PHP.

Kompilované vs. interpretované

PHP je skriptovací interpretovaný jazyk tzn. jeho skripty nasazujeme na server tak, jak je programátor napsal a zde se interpretují. (což ne všem vyhovuje – např. se bojí, že někdo jejich úžasný program ukradne – a tak se uchylují k různým obfuskacím, které znesnadňují čtení takových skriptů).

S Javou je to trochu složitější. Zdrojový kód napsaný programátorem není možné interpretovat – je třeba ho nejdříve zkompilovat do tzv. bajtkódu (mezikód) a až ten se interpretuje pomocí JRE. Java se tedy zároveň kompiluje i interpretuje – oficiálně se pokládá za interpretovaný jazyk, protože její „zkompilované“ třídy nejsou ve strojovém kódu a neběží přímo na procesoru – je nutné je interpretovat. Formálně tak oba jazyky spadají do stejné kategorie. (PHP ve skutečnosti interně převádí skripty rovněž do mezikódu, čehož využívají mnohé akcelerátory či „bytecode cache“ – pozn.red.)

Za zmínku stojí nástroj HipHop, který slouží k překladu PHP do jazyka C++. Tudíž i PHP může být za určitých okolností kompilované.

Statické vs. dynamické typování

Statické typování znamená, že datový typ proměnné (např. Integer nebo String) uvádíme už při její deklaraci. Tudíž typy jednotlivých proměnných známe už v době kompilace a díky tomu odhalíme řadu chyb dříve než v provozu – kompilátor takový program odmítne přeložit. U dynamicky typovaných jazyků dochází ke kontrole až při běhu aplikace. Díky tomu lze psát pružnější (ovšem často taky méně přehledný) kód, ve kterém jedna proměnná nabývá hodnot různých datových typů.

Java je staticky typovaný jazyk – všechny proměnné musíme deklarovat včetně jejich typu, nedeklarované proměnné nemůžeme používat. Zatímco PHP je jazyk dynamicky typovaný.

V PHP tak klidně můžeme napsat následující kód:

if ($a) {
    $b = 1;
} else {
    $b = "ahoj";
}

echo("b = $b");

Až v době běhu, v závislosti na hodnotě $a, je možné rozhodnout, zda $b je číslo nebo text. Kdežto v Javě si musíme předem rozmyslet, jaký datový typ bude proměnná b mít a deklarovat ho.

Silné vs. slabé typování

Toto kritérium se s tím předchozím někdy nesprávně zaměňuje. Silné typování není totéž, co statické, a slabé totéž, co dynamické. Silné typování znamená, že jazyk kontroluje typy proměnných za běhu a odhaluje jejich chybné použití. Java je silně typovaný jazyk. PHP slabě typovaný.

Možná si teď říkáte, že to ani jinak být nemůže – když je Java staticky typovaná, musí být i silně. Není to však pravidlem. Příkladem staticky ale slabě typovaného jazyka je C:

#include <stdio.h>
int main () {
    int a = 123;
    const char* b = "ahoj";
    printf("%dn", a + b);
    return 0;
}

Můžeme „sčítat“ čísla a znaky, ale výsledek asi není to, co bychom očekávali.

Jednotlivé druhy typování nelze obecně považovat za výhodu nebo nevýhodu, každý z přístupů má své zastánce. Já osobně dávám přednost silnému statickému typování. Jednak část chyb odhalíte už při kompilaci a jednak pomáhá psát přehlednější a spolehlivější aplikace. Např. v naší aplikaci máme třídu Podnik, která má proměnnou cisloPopisne. Tato proměnná je typu int a kdekoli v programu se můžeme spolehnout, že v ní bude pouze číslo. Kdyby se do ní uživatel zkoušel dostat pomocí HTTP POST parametru např. řetězec, došlo by k chybě (na rozhraní JSP a Javy).

Další vlastnosti

Oba jazyky jsou objektově orientované (Java od samého začátku, PHP až postupem času, ve verzi 5 byla objektová funkcionalita zásadně přepsána). Dodnes je Java „objektovější“ jazyk – např. ani při psaní „Hello World“ programu se zde nevyhnete práci s třídami.

Oba jazyky jsou otevřené a volně dostupné komukoli (i pro komerční použití). V tomto ohledu má náskok PHP, které je open source od počátku – zatímco k otevření zdrojového kódu Javy došlo až v roce 2006 (licence GPL).

Čím se Java a PHP liší zásadněji je standardizovanost a styl vývoje. Java se rozvíjí v rámci tzv. Java Community Process, ve kterém vzniká specifikace tohoto jazyka/platformy. Tato specifikace se následně implementuje – nejznámější je implementace od Sunu, ale svoji implementaci má i IBM (a vedle nich existuje i řada necertifikovaných implementací). Oproti tomu vývoj PHP je poněkud živelnější. Formální specifikace neexistuje a jako „standard“ je třeba brát hlavní implementaci, která stojí na jádru Zend. Existují i další implementace jako např. výše zmíněný překladač HipHop nebo třeba Quercus.

Životní cyklus aplikace

Aplikace v PHP je tvořena sadou skriptů a její nasazení na server spočívá v jejich nakopírování do příslušného adresáře. Celou dobu se nic neděje a až ve chvíli, kdy přijde HTTP požadavek od klienta, aplikace „ožívá“ – PHP volané webovým serverem interpretuje příslušný skript. Po dokončení HTTP požadavku a odpovědi skončí i běh skriptu a aplikace kromě místa na disku nezabírá žádné další zdroje. Aplikace se tedy načítá s každým HTTP požadavkem znovu.

Webová aplikace v Javě se skládá ze sady JSP stránek, zkompilovaných Javových tříd a případných dalších knihoven. Aplikace se obvykle nasazuje v podobě .war souboru (v podstatě přejmenovaný ZIP archiv). Při nasazení (deploy) aplikace na server dojde k rozbalení tohoto archivu a ke kompilaci JSP stránek. Z nich se nejprve vygenerují javovské třídy ( .java) a následně se zkompilují na bajtkód ( .class). Aplikace je inicializována a běží po celou dobu, dokud ji ze serveru neodstraníme (undeploy) nebo alespoň nedeaktivujeme (pokud to server umožňuje).

Z těchto odlišných způsobů vyplývají i možnosti sdílení dat. V Javovské aplikaci v JSP můžeme definovat JavaBeanu pomocí značky jsp:useBean:

<jsp:useBean id="registraceUzivatele"
 class="cz.frantovo.nekurak.web.RegistraceUzivatele"
 scope="session"/>

Tím jsme vytvořili instanci třídy RegistraceUzivatele a nastavili jsme ji jako hodnotu proměnné registraceUzivatele. Tato proměnná je platná pro dané sezení uživatele ( scope="session"). Rozsah platnosti můžeme omezit jen na daný HTTP požadavek ( scope="request"). Nebo naopak rozšířit na celou aplikaci ( scope="application"), potom je daný objekt sdílený mezi požadavky všech uživatelů.

V PHP si musíme vystačit s proměnnými sezení $_SESSION a další stavy aplikace je potřeba ukládat v databázi nebo souborech. Aplikace ve smyslu nějaké ucelené entity tu vlastně neexistuje, protože se jedná o sadu více či méně provázaných skriptů.

Pokud vás nenapadá, k čemu je to dobré, podívejme se na malou ukázku. Nedávno jsem např. psal jednoduchý chat, resp. webové rozhraní k Jabberu. Tento problém lze elegantně vyřešit pomocí EJB, což jsou komponenty běžící v aplikačním serveru a pro nás je zajímavé, že jsou schopné „dlouhodobějšího života“ podobně jako webové aplikace v Javě. Kostra takového EJB vypadá následovně:

@Singleton
@Startup
public class Jabber1 implements Jabber1Remote {
    …
    @Override
    public void posliZpravu(String mistnost, String prezdivka, String zprava) throws Jabber1Vyjimka {
    …
    }

    @Override
    public Collection<Zprava> getZpravy(String mistnost, int poradoveCislo) throws Jabber1Vyjimka {
        …
    }


    @PreDestroy
    public void odpoj() {
    for (Spojeni s : spojeni) {
        s.odpoj();
    }
    }

    @PostConstruct
    public void inicializuj() throws JabberotovaVyjimka, JMSException, NamingException {
    pripojXMPP();
    }
}

Využili jsme tu nové vlastnosti EJB 3.1 a jedná se o trochu specifický případ – klasické EJB 3 nemusí být Singleton a nemusí se vytvářet jeho instance hned po nasazení aplikace (může se vytvořit ad-hoc, až když si ji někdo vyžádá).

Po nasazení komponenty Jabber1 na aplikační server se vytvoří právě jedna instance této třídy (díky anotacím @Singleton a @Startup) a díky anotaci @PostConstruct se spustí metoda inicializuj(), která naváže spojení s XMPP serverem (Jabber). Toto spojení si držíme po celou dobu života komponenty – tzn. do doby než ji vypneme nebo ukončíme aplikační server. Není tedy vázané na nějaký HTTP požadavek. Ostatně EJB komponenta může na serveru existovat i bez jakékoli webové aplikace.

Webová aplikace si potom tuto EJB komponentu najde pomocí jejího JNDI jména (stejně jako v naší aplikaci přistupujeme ke komponentám PodnikEJB nebo UzivatelEJB) a volá její metody pro odeslání zprávy do chatovací místnosti nebo pro vyzvednutí historie zpráv.

Příjemnou vlastností, kterou nám tato architektura přináší, je abstrakce. Pouhou změnou konfigurace můžeme aplikaci rozdělit na dvě části – webovou část provozovat na jednom serveru a EJB komponentu na druhém. Nemusíme si vymýšlet žádný vlastní komunikační protokol – o komunikaci se postará aplikační server (Glassfish např. použije protokol CORBA/IIOP), a z pohledu naší aplikace je vše transparentní – s EJB komponentami pracujeme stejně, ať už se nacházejí na lokálním serveru nebo nějakém jiném.

Zaujaly vás možnosti Javy a chcete se dozvědět o tomto jazyce víc? Akademie Root nabízí školení Základy programovacího jazyka Java a Pokročilejší kurz jazyka Java, na nichž se naučíte, jak tento multiplatformní objektově orientovaný jazyk používat.

Hosting

Zprovoznit si lokálně LAMP nebo třeba aplikační server či pouhý webový kontejner a vedle toho databázi vyjde přibližně nastejno. Ovšem už v době návrhu a analýzy bychom měli myslet na to, kde naše aplikace poběží. V tomto směru má velkou výhodu PHP – je prakticky všude. Najít hosting pro Javu je trochu složitější, ale ne nemožné. V ČR seženete nejlevnější za cca sto korun mesíčně. Jedná se ale o sdílený hosting (společný Tomcat). Můžete si ale pořídit i VPS (virtuální server) za cca 300 Kč, ve kterém lze pohodlně provozovat aplikační server (nebo webový kontejner) podle svého výběru a s vlastní konfigurací. Vedle toho nejlevnější hosting pro PHP stojí pár desetikorun. Zajímavým řešením pro Javu může být služba Google Application Engine, která byla spuštěna minulý rok. Nevyužijete zde zdaleka všechny možnosti JEE platfomy a bude třeba psát javovou aplikaci psát poněkud střídměji, ale na druhou stranu ale Google nabízí poměrně zajímavé ceny, účtované podle intenzity využití (jak už to u cloudových služeb bývá). Pro malé aplikace může být zajímavé, že Google poskytuje „kolem 5 milionů zobrazení stránky měsíčně“ zdarma.

Závěr

Dnes jsme si na chvíli oddychli od praktických příkladů a stručně jsme si porovnali Javu s jiným používaným nástrojem (PHP) z hlediska programovacího jazyka. Vysvětlili jsme si rozdíl v životním cyklu PHP a Java aplikace. A na příkladu webového chatu jsme si ukázali výhody EJB komponent. Příště se zase vrátíme k naší aplikaci v Javě a budeme pokračovat ve vývoji.

Odkazy

Franta Kučera působí jako Java vývojář na volné noze. Programování je jeho koníčkem už od dětství. Kromě toho má rád Linux, relační SŘBD a XML.

Věděli jste, že nám můžete zasílat zprávičky? (Jen pro přihlášené.)

Komentáře: 107

Přehled komentářů

dc pekne zhrnutie
Palo Re: pekne zhrnutie
Ladislav Thon Re: pekne zhrnutie
Palo Re: pekne zhrnutie
Ladislav Thon Re: pekne zhrnutie
alblaho Slabě typovaný příklad
Ladislav Thon Re: Slabě typovaný příklad
Kamil Re: Slabě typovaný příklad
milan Re: Slabě typovaný příklad
Kamil Re: Slabě typovaný příklad
v6ak Re: Slabě typovaný příklad
Palo Re: Slabě typovaný příklad
v6ak Re: Slabě typovaný příklad
MD Re: Slabě typovaný příklad
Jarda Výkon
Jan Kodera Re: Výkon
Jarda Re: Výkon
v6ak Re: Výkon
ARny Re: Výkon
v6ak Re: Výkon
Michal Kára Re: Výkon
František Kučera Re: Výkon
Ladislav Thon Re: Výkon
František Kučera Re: Výkon
Palo Re: Výkon
Martin Soušek Trošku odfláknuté "porovnání"
alblaho Re: Trošku odfláknuté "porovnání"
x14 Re: Trošku odfláknuté "porovnání"
Jiří Knesl Re: Trošku odfláknuté "porovnání"
Palo Re: Trošku odfláknuté "porovnání"
Jiří Knesl Re: Trošku odfláknuté "porovnání"
Jan Kodera Re: Trošku odfláknuté "porovnání"
Jiří Knesl Re: Trošku odfláknuté "porovnání"
Jan Kodera Re: Trošku odfláknuté "porovnání"
v6ak Re: Trošku odfláknuté "porovnání"
karmi Re: Trošku odfláknuté "porovnání"
xx Re: Trošku odfláknuté "porovnání"
Jan Kodera Re: Trošku odfláknuté "porovnání"
xx Re: Trošku odfláknuté "porovnání"
v6ak Re: Trošku odfláknuté "porovnání"
Palo Re: Trošku odfláknuté "porovnání"
Jiří Knesl Re: Trošku odfláknuté "porovnání"
v6ak Re: Trošku odfláknuté "porovnání"
Borek Bernard Re: Trošku odfláknuté "porovnání"
František Kučera Re: Trošku odfláknuté "porovnání"
PR I PHP umí scope=application
maertien Porovnani
marek.jelen PHP v Jave
František Kučera Re: PHP v Jave
Jiří Knesl Stalo se, co jsem čekal
TanisCZ Re: Stalo se, co jsem čekal
Vykook Re: Stalo se, co jsem čekal
Palo Re: Stalo se, co jsem čekal
MD Re: Stalo se, co jsem čekal
Palo Re: Stalo se, co jsem čekal
Paja Re: Stalo se, co jsem čekal
v6ak Re: Stalo se, co jsem čekal
v6ak Kompilovanost/interpretovanost Javy a tychlost
v6ak Statické typování bez uvádění typu
benzin Re: Statické typování bez uvádění typu
v6ak Re: Statické typování bez uvádění typu
Ladislav Thon Re: Statické typování bez uvádění typu
xx Re: Java na webovém serveru: porovnání Javy a PHP
v6ak Re: Java na webovém serveru: porovnání Javy a PHP
xx Re: Java na webovém serveru: porovnání Javy a PHP
xx Re: Java na webovém serveru: porovnání Javy a PHP
v6ak Re: Java na webovém serveru: porovnání Javy a PHP
xx Re: Java na webovém serveru: porovnání Javy a PHP
v6ak Re: Java na webovém serveru: porovnání Javy a PHP
xx Re: Java na webovém serveru: porovnání Javy a PHP
Ladislav Thon Re: Java na webovém serveru: porovnání Javy a PHP
v6ak Re: Java na webovém serveru: porovnání Javy a PHP
Ladislav Thon Re: Java na webovém serveru: porovnání Javy a PHP
v6ak Re: Java na webovém serveru: porovnání Javy a PHP
Ladislav Thon Re: Java na webovém serveru: porovnání Javy a PHP
xx Re: Java na webovém serveru: porovnání Javy a PHP
Ladislav Thon Re: Java na webovém serveru: porovnání Javy a PHP
xx Re: Java na webovém serveru: porovnání Javy a PHP
Ladislav Thon Re: Java na webovém serveru: porovnání Javy a PHP
xx Re: Java na webovém serveru: porovnání Javy a PHP
Palo Re: Java na webovém serveru: porovnání Javy a PHP
v6ak Re: Java na webovém serveru: porovnání Javy a PHP
xx Re: Java na webovém serveru: porovnání Javy a PHP
Palo Re: Java na webovém serveru: porovnání Javy a PHP
xx Re: Java na webovém serveru: porovnání Javy a PHP
v6ak Re: Java na webovém serveru: porovnání Javy a PHP
xx Re: Java na webovém serveru: porovnání Javy a PHP
v6ak Re: Java na webovém serveru: porovnání Javy a PHP
xx Re: Java na webovém serveru: porovnání Javy a PHP
xx Re: Java na webovém serveru: porovnání Javy a PHP
v6ak Re: Java na webovém serveru: porovnání Javy a PHP
František Kučera Re: Java na webovém serveru: porovnání Javy a PHP
xx Re: Java na webovém serveru: porovnání Javy a PHP
František Kučera Re: Java na webovém serveru: porovnání Javy a PHP
xx Re: Java na webovém serveru: porovnání Javy a PHP
František Kučera Ukecanost a Lombok
jehovista Re: Ukecanost a Lombok
Ladislav Thon Re: Ukecanost a Lombok
v6ak Re: Ukecanost a Lombok
v6ak Re: Ukecanost a Lombok
Ladislav Thon Re: Ukecanost a Lombok
František Kučera Re: Ukecanost a Lombok
jos Re: Ukecanost a Lombok
v6ak Re: Ukecanost a Lombok
Honza minimálně 3 chyby
Paja web server java a php
DeathWalker interpretovany vs. kompilovany
Zdroj: https://www.zdrojak.cz/?p=3185