Pyrin tässä oppaassani jakamaan muutamia tarpeellisiksi havaitsemiani perusasioita palvelinpuolen
ohjelmoinnnista PHP-kielellä.
1) Palvelinpuolen ohjelmointia varten tarvitaan palvelinympäristö, jossa PHP:tä käyttävät nettisivut
(ja itse PHP-koodi) sijaitsevat. On siis heti aluksi syytä ymmärtää, että toisin kuin JavaScript,
joka on asiakaspuolen (selainpuolen) ohjelmointikieli, PHP-koodi suoritetaan palvelimella, jolla nettisivut
sijaitsevat.
Yleensä PHP-ratkaisuja sisältävät nettisivut sijaitsevat Linux-pohjaisilla servereillä,
joilla on yleensä PHP-tuki. Omat sivuni sijaitsevat
Sigmaticin
palvelimella, jolla siis on PHP ja myös MySQL-tuki.
On myös tärkeää ymmärtää, että PHP-koodi tulisi aina (ainakin nettikäytössä)
sulkea alla olevien tagien sisään:
Tämä takaa sen, ettei kyseinen (tagien sisällä oleva) koodi ole nähtävissä nettiselainten kautta palvelimen ulkopuolelta
ja palvelin osaa tulkita tagien sisällä olevan koodin PHP-koodiksi, siis antaa koodin PHP-tulkille suoritettavaksi.
Itse olen käyttänyt PHP-koodia osana nettisivustojani pääasiassa kahdella tapaa:
A) Lisäämällä PHP-koodia suoraan osaksi dynaamista nettisivua, siis suoraan XHTML-koodin sekaan lisättynä.
Esim. Toteutin nettisivustoni JavaScript-valikon ensin staattisena XHTML-koodina joka sivulle erikseen. Kunnes
sivustoni alkoi kasvaa yli äyräiden ja päätin "echottaa" valikon joka sivulle samasta ulkoiseen
tiedostoon tallentamastani funktiosta, jolloin valikon muuttuessa minun ei tarvitse muuttaa valikkoa joka sivulle
erikseen. Samoin toteutin sivustolleni dynaamisena PHP-koodina kalenterin ja päivitetty-tekstin. Useimmilla
nettisivustoni sivuilla onkin oheiset rivit koodia:
Yllä olevassa XHTML-sivussa XHTML-koodin sekaan laitetut PHP-funktiot tulostavat eli "echottavat" jo palvelimella
dynaamisen osan XHTML-koodista muun XHTML-koodin sekaan (annettuihin paikkoihin). Palvelimelta lähdettyään "lopputulos"
on siis puhdasta XHTML-koodia, jonka nettiselain sitten tulkitsee ja näyttää selainikkunassa tavallisena XHTML-sivuna.
Toisena esimerkkinä samanlaisesta PHP:n käyttötavasta toimikoon pituuden valitsevan select-elementin,
formin sisään, generoiva funktio print_pituus:
Monesti tätä dynaamisen XHTML-sivun generoimisen tekniikkaa käytetään hakemalla osa nettisivujen sisällöstä
PHP-skriptin avulla MySQL-tietokannasta tai XML-tiedostosta.
B) Toinen paljon käyttämäni PHP-skriptien käyttötapa on suorittaa käyttäjän antaman signaalin
perusteella jokin palvelinpuolen toiminto PHP-skriptillä.
Flash-komponenteista teen tämän usein liittämällä
vaikka lomakkeen "Lähetä"-nappiin tapahtumankäsittelijä ja lataajalle myös oma tapahtumankäsittelijä
alla olevan esimerkin mukaisesti (Huom! ActionScript 3 -koodia):
Kuten yllä näkyy PHP-skriptin käskyttäminen ja muuttujien lähettäminen (ja vastaanottaminen) onnistuu Flashista
kätevästi URLRequest- ja URLLoader-luokkien avulla.
Vastaava PHP-skriptin käyttötapa tavallisen XHTML-sivun tapauksessa on lomakkeen käsitteleminen PHP-skriptin
avulla.
Esim. Alla oleva esimerkkikoodi voisi hoitaa käyttäjätunnuksen/salasanan tarkistamisen MySQL-tietokannasta.
Esimerkissä on monta huomion arvoista seikkaa:
a) Jos uudelleen ohjauksen haluaa PHP-skriptissä hoitaa header-funktion avulla on virheilmoitusten
poistamiseksi syytä ottaa tulosteet talteen ob_start-funktiolla (ja tulostaa lopuksi ob_flush-funktiolla).
b) Lomakkeilla on syytä olla jokin Captcha-ratkaisu käytössä. Esim. tuo
reCAPTCHA
.
c) PHP-skriptille $_POST:in tai $_GET:in kautta annettava syöte on aina syytä tarkistaa (ja mieluummin vielä
monipuolisemmin kuin tässä).
d) Kun PHP-skripti on suorittanut tehtävänsä niin tavallisen XHTML-sivun tapauksessa (ei Flash-komponenttin
tapauksessa) nettiselaimelle on annettava uusi nettisivu jolle siirtyä, muuten (siis ilman tulostusta) tuloksena olisi
tyhjä sivu nettiselaimen näytöllä. Uudelleenohjaus hoituu header-funktion kutsulla. Esim.
Yllä olevasta header-funktion kutsusta näkee myös sen kuinka selaimen osoiterivillä voi myös välittää
muuttujia ($_GET:in kautta) PHP-skriptille.
Yllä olevasta on myös syytä havaita vakava tietoturvapuute:
Älä koskaan lähetä käyttäjätunnusta ja (etenkään) salasanaa salaamattomana siten
että se siis näkyy kaikille selaimen osoiterivilläkin käyttäjän siirtyessä uuteen osoitteeseen!
2) PHP:tä käytetään usein juuri XHTML-sivujen tai nettisivujen Flash-osion kommunikointiin MySQL-tietokannan
kanssa. Lisäksi PHP-koodilla kirjoitetaan usein esim. logitiedostoja, XML-tiedostoja tai tallennetaan käyttäjän
lähettämiä kuvia palvelimelle, suoritetaan järjestelmäkomentoja...
Edellä mainituista syistä on siis etenkin PHP-koodin
testausvaiheessa (jolloin koodissa on usein pahojakin bugeja ja tietoturva-aukkoja) syytä sijoittaa testattavat nettisivut ja
PHP-koodi salasanasuojattuihin kansioihin.
Monet (varsinkin maksulliset) palvelintilan tarjoajat mahdollistavat salasanasuojattujen kansioiden käytön.
Niiden luominen on usein mahdollista palvelimen Linux-komentotulkissa (jota yleensä käytetään etäyhteydellä SSH-ikkunassa)
komennolla
htpasswd. Yleensä on kuitenkin syytä tutustua oman palveluntarjoajan ohjeisiin salasanasuojettujen
kansioiden käytöstä. Esim.
Sigmaticin ohjeet
ja
Nebulan ohjeet.
LISÄTIETOJA (Aloittelijat ohittakoon):
Usein salasanasuojattuja kansioita voi hallinnoida palveluntarjoajan tarjoaman graafisen käyttöliittymän kautta.
Tämä onkin usein yksittäisiä tunnuksia luotaessa kätevää. Kuitenkin kun vähän enemmän harrastaa palvelinpuolen ohjelmointia
tulee helposti eteen tilanteita, joissa tunnus/salasana pareja halutaan generoida ja myöntää automaattisesti (PHP-skriptillä).
Esimerkkitapaus voi olla vaikka rekisteröitymislomake, jolla rekisteröityjä lähettää henkilötietonsa, haluamansa
käyttäjätunnuksen ja salasanan sekä sähköpostiosoitteensa. Tarkoituksena on tallentaa henkilötiedot MySQL-tietokantaan sekä
myöntää käyttäjälle samalla käyttäjätunnuksella ja salasanalla pääsy palvelimen salasanasuojattuun hakemistoon.
Itse opin asiat nopeiten suoraan lähdekoodia penkomalla, joten tarjoan tässä hieman näytteitä, jotka voivat auttaa
yllä mainitunlaisen ratkaisun toteuttamisessa. Käyttäjätunnus/salasana -parin myöntäminen onnistuu PHP-koodilla
varsin lyhyesti:
Tuollaisena tuo koodi ei vielä tee mitään (eikä edes toimi), mutta alle olen laittanut hieman muuttamani version
(kaikkia tietoturvakorttejaan ei ole syytä paljastaa) toimivasta ratkaisusta, jolla lähetetään sähköpostitiedote
onnistuneesta rekisteröitymisestä sekä myönnetään käyttäjätunnus/salasana salasanasuojattuun hakemistoon.
3) Palataan yllä olevan hieman edistyneemmän ratkaisun jälkeen perusasioihin. Salasanasuojatun
palvelintestausympäristön lisäksi on monesti hyötyä jos on viitsinyt trimmata itselleen omalle
kotikoneelleen toimivan
Apache-serveri,
PHP-tulkki,
MYSQL-tietokanta
-ympäristön, jolla voi
tarvittaessa pyörittää testausta omalla koneella ilman nettiyhteyttäkin (tosin itse en pystyisi
tällöin online-dokumentaation puutteessa koodaamaan tehokkaasti).
Käytännössä asia onkin usein kuten minullakin: "valmiit" nettisivut tulevat sijaitsemaan linux-serverillä,
mutta omalla koneella nettisivujen koodaaminen tehdään Windows-ympäristössä. Omalla kohdallani syynä Windows XP:n käyttöön
on, että Adoben ohjelmat Flash Professional, Dreamweaver, Photoshop toimivat Windows-ympäristössä.
Onneksi Windowsille löytyy (melko) helposti asennettavia paketteja ja niihin liittyviä oppaita, joilla saa kerralla asennettua
oman palvelinympäristön. Lisäksi MySQL-tietokantojen ylläpitoon kannattaa tässä yhteydessä käyttää
phpMyAdminia
. Itselläni on jo kulunut sen verran aikaa viime asennuksestani, että olen jo unohtanut yksityiskohdat (ja aina tuppaan ne jostain
netistä onkimaan).
Tämän oppaan
olen kuitenkin kirjainmerkinnyt. Toivottavasti siitä on apua.
4) Kun testausympäristo on saatu pystyyn joko ulkopuoliselle palvelimelle tai kotikoneelle (tai molemmille)
on syytä opetella käyttämään
php:n online-dokumentaatiota. Yleensä kannattaa aina varmistaa funktioiden käyttämät parametrit ja palautusarvot.
Etenkin funktioiden palautusarvot poikkeustilanteissa aiheuttavat usein virheitä koodiin!
5) Perus-PHP-kielen lisäksi PHP:lle löytyy monia hyödynnettäviä kirjastoja, joita kannattaa tarpeen mukaan hyödyntää.
Hyödyllisiä kirjastoja voi olla valmiina asennettuna palveluntarjoajasi palvelinympäristössä, joten niitä
pääsee kuin varkain hyödyntämään.
Perustarkastus palvelinympäristöstä ja sinne asennetuista PHP-kirjastoista onkin ajaa palvelimella oheinen mininettisivu:
Omana esimerkkinäni antasin muutamia viimeksi käyttämiäni PHP-Kirjastoja:
GD-kirjastoa
käytin
tämän tutoriaalin
perusteella
tämän Flash-komponentin
palvelinpuolen PHP-osiossa.
Paitsi thumbnails-kuvia niin myös esim. PDF-tiedostoja voi generoida PHP-skriptien ja -kirjastojen avulla.
Itse toteutin yhteen paikkaan PDF-generoinnin
FPDF:n
avulla.
Muita ilmaisia (joita en ole itse kokeillut) PDF-generointiratkaisuja ovat ainakin
R&OS
ja
Panda
.
Kaupallisuutta janoaville on olemassa
PDFLib
.
6) Opi Googlettamaan (hyviä) tutoriaaleja netistä.
7) Usein nettisivujen palvelimella on syytä suorittaa säännöllisin väliajoin tiettyjä huoltotoimenpiteitä,
kuten tilapäistiedostojen poistoja tai tietokannan varmuuskopiointeja. PHP-kieltä voi vallan hyvin käyttää myös näiden
toimintojen suorittamiseen.
Tällöin PHP-koodin suoritus poikkeaa nettisivujen kautta tapahtuvasta PHP-skriptin suorittamisesta.
Nettisivujen kautta suoritettavan PHP-koodin suorittamisesta huolehtii esim. Apache-serveri. Jos taas
php-koodia suoritetaan suoraan Linux-komentoriviltä (kuten mm. ajastetut tehtävät), niin käsittelijänä
on Linux-komentotulkki (tavallisesti bash).
Tällöin komentotiedoston alkuun on lisättävä ensimmäiseksi riviksi tulkki (tässä tapauksessa PHP-tulkki),
joka käsittelee komentotiedostossa annetun koodin.
Alla olevaa koodia voisi käyttää MySQL-tietokannan varmuuskopiointiin:
Tai alla olevaa PHP-skriptiä voisi kutsua tuhoamaan palvelimelle kertyneitä tilapäiskuvatiedostoja.
Oleellista ylläpidollisten PHP-skriptien käytössä on
1) Älä sotke ylläpitoskriptejä nettisivutiedostojesi (ja -hakemistojesi yhteyteen) tai ainakin
sijoita ne erilleen esim. bin-alihakemistoon.
2) Rajaa muiden käyttäjien oikeuksia ylläpitoskripti-hakemistoihin (ja tiedostoihin).
3) Muista, että nettisivuhakemistossa sijaitsevaa PHP-tiedostoa voidaan ajaa myös nettiselaimen kautta.
Esim. tiedoston tuhoava PHP-skripti tuhoa_tiedosto_parametrilla_tiedostonnimi.php
sijoitettuna nettisivuhakemistoon ei ehkä ole turvallisin ratkaisu. Varsinkaan jos tuo todella tuhoaa
tiedoston kirjoittamalla nettiselaimen osoiteriville:
tuhoa_tiedosto_parametrilla_tiedostonnimi.php?tiedostonnimi=tuhoaminut.txt
4) Voit vapaasti käyttää mieltymystesi mukaan myös muita skriptikieliä ylläpidollisiin tehtäviin.
5) Säännöllisin välein suoritettavat PHP-skriptit kannattaa laittaa ajastimella automaattisesti suorittaviksi.
Esim. Sigmatic tarjoaa graafisen käyttöliitymänsä kautta mahdollisuuden ajastaa skriptien suoritusta.
Toivottavasti tästä pitkähköstä johdannosta palvelinpuolen ohjelmointiin PHP-kielellä on iloa myös
muille kuin allekirjoittaneelle, toimien ainakin linkki- ja muistivarastona.
Ajan salliessa kirjaan tulevaisuudessa muistiin muutamia eniten käyttämiäni ja hyödyntämiäni
PHP-tekniikoita.
Takaisin PHP-ohjelmoinnin etusivulle