[[oktatas:web:cgi|< CGI]]
====== CGI áttekintése ======
* **Szerző:** Sallai András
* Copyright (c) Sallai András, 2012, 2013, 2015, 2017
* Licenc: GNU Free Documentation License 1.3
* Web: http://szit.hu
===== Bevezetés =====
A CGI a **Common Gateway Interface** szavak rövidítése, amelyet a NCSA (National Center for Supercomputing Applications)
fejlesztett Perl, C és PHP programok számára. Egy protokoll szabvány, melynek segítségével egy
rendszerhez kapcsolhatjuk a Perl, C és PHP vagy más programjainkat.
A CGI technológiát általában webszerver mellett használjuk, amelyen dinamikus weblapok generálása a cél. Jelenleg érvényes verziója: CGI/1.1.
Alternatívája a JavaServer Pages (Sun) vagy az Active Server Pages (Microsoft).
A web kezdeteinél csak ez a technológia adott lehetőséget az interaktív weblapok készítésére.
A CGI nélkül a weboldalaink egyszerű statikus weboldalak. A CGI interaktívvá teszi a weboldalakt.
Az interaktív weboldalak által lehetőségeink bővülnek:
* feldolgozható adatok
* tárolható adatok
* elérhető adatbázisok
Amivel foglalkozunk:
* webes alkalmazások
* CGI rövid története
* a CGI program meghatározása
* hogyan működik a CGI?
* érvek és ellenérvek a CGI mellett
* programozási nyelvek a CGI-ban
A webes alkalmazás olyan mint bármely más alkalmazás.
Kivéve, hogy csak böngészőn keresztül érhető el.
A webes alkalmazások eredetileg fórumok, webáruházak,
visszajelzést megvalósító webhelyek voltak. Ma már
azonban sok asztali alkalmazás megvalósításra került
a webes világban. Olyanok mint rajzolás, irodai
alkalmazások, térkép szolgáltatások, határidő naplók, stb.
A JavaScript segítségével növelhetjük egy weboldal interaktivitást,
képeket tologathatunk, legördülő menüket alkothatunk, eseményeket kezelhetünk,
animációkat készíthetünk.
===== A CGI története =====
Az első webszerverek egyike a **NCSA HTTPD** volt.
A gyártó National Center for Supercomputing Applications,
ahol a Netscape legtöbb alapítója is dolgozott.
A Netscape dolgozat ki a Mosaic böngészőt.
A NCSA HTTPD egyik legfontosabb tulajdonsága a CGI volt,
amely a szerver 1.0-ás kiadásában már jelen volt.
A CERN szervere mellett az NCSA HTTPD volt az egyik
széles körben használt webszerver, így CGI de facto szabvánnyá vált.
Megjegyzés:
**CERN httpd** az első webszerver, amelyet Tim Berners-Lee,
Ari Luotonen és Henrik Frystyk Nielsen készített, 1990-től
(A CERN-nél).
1990 karácsony napján ment élseben.
Eredetileg NeXT Computer-on fejlesztették, amelyen
NeXTSTEP operációs rendszer futott.
A CERN httpd később a W3C fejleszti tovább.
Az utolsó kiadás a 3.0A verzió volt, 1996-ban.
Később átírják Unixra.
A NCSA HTTPd a CERN httpd szerver után, valamikor a 90-es
évek elején kezdik fejleszteni, az utolsó kiadása szintén
1996. Fejlesztője Robert McCool.
Az NCSA HTTPD alapkódját átvette az Apache projekt.
Ez után még az NCSA HTTPD szervernek megjelent az
1.5-s kiadása, utoljára. Ebben az időben a webszerverek
95%-a NCSA HTTPD. Később mindenki Apache-ra váltott.
Azóta az NCSA HTTPD kódrész eltávolították az Apacheból,
újraírták. 2011-ben már webszerverek 60%-a Apache.
* http://en.wikipedia.org/wiki/Comparison_of_web_server_software
Abban az időben az NCSA HTTPD CGI megoldása volt az egyetlen
lehetőség interaktív weboldalak készítésére. Ennek és a
nyílt forráskódjának köszönhetően népszerű lett.
Ma az összes webszer támogatja a CGI-t.
Néhány hasonló webszerver alkalmazás a JavaServer Pages, a
Microsoft's Active Server Pages, PHP, stb.
===== A CGI programról =====
A CGI programot a webszerver hajtja végre, és az eredményt visszaküldi a
böngésző számára. A webszerver ebben a folyamatban
közvetítőként működik. Szinte bármilyen programozási nyelven
lehet CGI programot írni. A CGI programmal a felhasználónak
nincs közvetlen kapcsolata. Nem jelenít meg grafikus felületet,
bár lehet vele képeket generálni.
Egy CGI programnak a következőknek kell megfelelnie:
* A parancs egyszerűen begépelhető kell legyen parancssorban.
* A Java programok például nem teljesen alkalmasak erre
* A programnak létre kell hozni egy érvényes content-type fejrészt.
A CGI program kimenete bármilyen típusú tartalom lehet:
* HTML kód, képek, szöveges fájlok, word dokumentum, hangfájl, stb.
* A content-type sorral mondjuk meg, milyen típusú tartalmat küldünk.
===== Hogyan működnek a CGI programok =====
{{:oktatas:web:cgi:szerveroldali_scriptek.png|}}
A CGI megismeréséhez szükséges a unix alapú operációs renszerek
fogalmainak ismerete. A CGI tehát egy webszerveren keresztül
kommunikál a felhasználóval.
Ha egy egyszerű statikus HTML oldalt kell feldolgozni, akkor
az URL a következőhöz hasonló lehet:
* http://zold.and/konyvtarnev/index.html
A webszerver fájlrendszerének szintjén ez megfelelhet
például a következőnek:
* /home/virtual-www/zold.and/htdocs/konyvtarnev/index.html
A webszerver gyökere az URL szintjén a következő:
* http://zold.and
A webszerver fájlrendszerének szintjén:
* /home/virtual-www/zold.and/htdocs/
Amikor az URL-ben egy CGI programra hivatkozunk,
az a következő lehet:
http://zold.and/cgi-bin/pelda.cgi
Az esetünkben pelda.cgi nevű CGI programot kéri egy
kliens. Miután a webszerver megállapítja, hogy a kért
erőforrás egy CGI program, végrehajtja azt és visszaadja
a kimenetét a kliensnek.
A webszerverenk több dolgot kell figyelembe vennie.
* Hol található a kért erőforrás?
* A kért erőforrás egy CGI program?
* A program végrehajtható?
* A program hiba nélkül végrehajtható?
* A program kimenet egy érvényes HTML oldal?
Ha a válasz mindegyikre igen, akkor a kérés teljesítésre kerül.
Ha nem, akkor a webszerver hibát ad vissza.
===== A kérés teljesítése =====
Mint azt fentebb írtam, a CGI programnak meg kell adnia, hogy
a visszaadott tartalom milyen típusú lesz, egy ContentType
fejléc sorral. Más esetekben a kiszolgáló a típust a
kiterjesztésből veszi. Itt viszont ez .cgi, amely
különféle tartalmakat generálhat. A típust a MIME
szabvánnyal adjuk meg.
^ MIME típusok kivonata ^^
| text/html | HTML dokumentum |
| text/plain | Szöveges dokumentum |
| image/jpeg | JPEG kép |
| image/png | PNG kép |
| image/gif | GIF kép |
| vodeo/mp4 | MPEG4 vidó |
| application/octet-stream | Bináris fájl |
Ha a CGI által generált tartalom egy HTML oldal, akkor a
content-type fejléc tartalma:
Content-type: text/html
Ezt az információt a webszerver fogadja, majd más fejlécekkel
együtt elküldi a böngészőnek.
Content-type: text/html
cím
Weboldal
Vegyük észre, hogy a Content-type sor két üres sorral van elválasztva a
tartalomtól.
A webszerver ezzel együtt más fejlécsorokat
is hozzá szokott adni:
200 OK
Connection: close
Date: Thu, 30 Feb 2015 19:49:05 CET
Server: Apache/2.4.18
Content-Type: text/html
Client-Date: Thu, 16 Feb 2015 19:49:05 CET
Client-Peer: 190.195.86.50:80
cím
Weboldal
===== Adatok átadása a CGI programnak =====
A CGI programok az adatokat webes űrlapokból veszik,
vagy az URL-ben van kódolva.
===== Érvek és ellenérvek a CGI mellett =====
==== Előnyök ====
* cross-platformos technika - a webszerver minden OS-en fut
* nyelfüggetlen
* például a Perl, Python minden OS-re van
* nem szükséges speciális programozói könyvtárak használat
* az alapértelmezett be- és kiemenetet használjuk
==== Hátrányok ====
* ha script nyelvet használsz, futási időben mindig fordítani kell a programot.
* akkor hatékony ha nem nagy a webszerver forgalma
* persze meg lehet írni a programot C nyelven is
* nem egyszerű a webprogramozó dolga a webszerveren, ha CGI programot akar írni
===== CGI programozási nyelvek =====
==== Perl ====
A Perl nyelv domináns szerepet tölt be a CGI programok írásánál.
Ez nem jelenti azt, hogy ez a legjobb egy CGI program megírására,
de ez a legelterjedtebb, ha CGI-ról van szó. Az elterjedését
segítette, hogy azonnal szerkeszthető.
CGI.pm modul számos feladat ellátását könnyíti meg ha Perlt használunk.
Sok Perl nyelven írt CGI program tölthető le az Internetről.
==== Unix Shell ====
Unix rendszereken gyakori választás. Általában olyanok választják,
akik eleve ismerik a Shell programozást, például rendszergazdák.
Más nyelvek alkalmasabbak általában komplex CGI program
megírására, de Shell szinten sok hasznos parancs állhat eleve
a rendelkezésünkre.
==== C nyelv ====
Fő szempont a Script nyelvekkel szemben, hogy nagyon jó teljesítménye
van. A program végrehajtás kevesebb időt igényel.
A hátránya az, hogy nem CGI specifikus nyelv. A Perl nyelven
egy-egy szövegfeldolgozási feladat sokkal kevesebb sorból
megoldható, szemben a C-vel.
Hiba esetén újra kell fordítani a programot.
==== Python ====
Minden népszerű operációsrendszerre elérhető, mint a Perl nyelv.
Általános célú, számos feladatra alkalmas, többek között CGI
programozásra is. Számos webes alkalmazást hoztak létre
Python nyelven.