Takaisin php-ohjelmoinnin etusivulle


PHP: Palvelinpuolen ohjelmoinnin perusteet

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