Fork me on GitHub

Dobrodošli

Na internetu postoji mnogo zastarelih informacija koje navode korisnike na pogrešan put, šireći loš i nebezbedan način pisanja koda. PHP: na pravi način je lako za čitanje uputstvo za popularne standarde kodiranja u PHP-u, koje sadrži skup linkova ka vodećim tutorijalima na internetu, kao i ono što saradnici trenutno smatraju najboljom praksom.

Ne postoji kanonski način upotrebe PHP-a. Ovaj sajt ima za cilj da pomogne novim PHP developerima upoznavajući ih sa nekim temama koje možda neće otkriti pre nego što bude prekasno, i želi da iskusnim programerima da nove ideje o načinu na koji obavljaju neke radnje o kojima nisu ni razmišljali. Ovaj sajt vam neće reći koje alate da koristite, već će vam predstaviti više opcija, i kada je moguće objasniti razlike u pristupu, kao i moguće slučajeve upotrebe.

Ovo je aktivan dokument i biće ažuriran u budućnosti sa još korisnih informacija i primera, kako budu postali dostupni.

Prevodi

PHP: Na pravi način je (ili će uskoro biti) preveden na mnoge jezike:

Kako da doprinesete

Pomozite da ovaj sajt postane najbolji resurs za nove PHP programere! Doprinesite na GitHub-u

Raširite vest

PHP: Na pravi način ima baner slike koje možete da iskoristite na svom web sajtu. Pokažite vašu podršku, i pomozite novim PHP developerima gde da nađu dobre informacije!

Baner slike

Back to Top{.top}

Započnimo

Koristite trenutno stabilnu verziju (5.5)

Ako tek počinjete sa PHP-om, pobrinite se da koristite trenutno stabilnu verziju PHP 5.5. U poslednjih nekoliko godina PHP je napravio značajan pomak dodajući nove mogućnosti. Nemojte dozvoliti da vas male razlike u brojevima između verzija prevare. Velika su poboljšanja između verzije 5.2 i 5.5. Ako tražite neku funkciju ili kako da je upotrebite, PHP dokumentacija na adresi php.net će vam sigurno pomoći.

Ugrađen web server

Možete da počnete sa učenjem PHP-a bez mučenja sa instalacijom i konfiguracijom punog web servera (zahteva PHP 5.4+) Da pokrenete server, u konzoli pokrenite sledeću komandu u web root-u vašeg projekta:

> php -S localhost:8000

Instalacija na Mac-u

OSX dolazi sa preinstaliranim PHP-om, ali obično kaska za poslednjom stabilnom verzijom. Lion dolazi sa PHP verzijom 5.3.6 dok Mountin Lion dolazi sa verzijom 5.3.10.

Da biste dodali najnoviju stabilnu verziju PHP-a na OSX, možete ga instalirati uz pomoć nekoliko paket menadžera za Mac, uz preporuku za php-osx by Liip.

Druga opcija je da ga kompajlirate sami, ali u tom slučaju uverite se da imate instaliran ili Xcode ili Apple-ovu zamenu“Command Line Tools for Xcode”, koju možete skinuti sa Apple developer centra.

Za kompletan “sve u jednom” paket, uključujući PHP, Apache web server i MySQL bazu podataka, sa lepim kontrolnim grafičkim interfejsom, isprobajte MAMP ili XAMPP.

Instalacija na Windows-u

PHP je moguće instalirati na nekoliko načina na Windows-u. Možete skinuti binarni paket i do skoro ste mogli da iskoristite “.msi” instaler. Instaler nije podržan od PHP verzije 5.3.0.

Za učenje i lokalni razvoj možete koristiti ugrađen web server koji dolazi uz PHP verzije 5.4+, tako da ne morate da brinute o podešavanju istog. Ako bi ste više želeli “sve u jednom” rešenje, koje uključuje pun web server i MySQL bazu podataka, onda alati kao što su Web Platform Installer, Zend Server CE, XAMPP i WAMP, vam mogu pomoći da namestite PHP development okruženje na windows-u veoma brzo. Obratite pažnju na to da će postojati neke razlike između alata u različitim okruženjima, tj. ako razvijate na windows-u, a aplikaciju pokrećete na linux-u.

Ako treba da pokrenete vaš produkcioni sistem na windows-u, onda će vam IIS7 dati najstabilnije i najbolje performanse. Možete iskoristiti phpmanager (GUI plugin za IIS7) da uprostite konfigurisanje i upravljanje PHP-om jednostavno. IIS7 dolazi sa ugrađenim FastCGI, morate jedino da podesite PHP kao handler. Za podršku i dodatne informacije postoji odeljak na iis.net sajtu posvećen PHP-u.

Vagrant

Pokretanje vaše aplikacije u različitim okruženjima tokom razvoja i završene verzije programa, može dovesti do čudnih bagova koji počnu da se pojavljuju kada vaša aplikacija krene da radi “uživo” u novom okruženju. Takođe je nezgodno održavati iste verzije biblioteka između različitih razvojnih okruženja kada radite sa timom programera.

Ako razvijate aplikaciju na windows-u, a pokrećete aplikaciju javno na linux-u (ili bilo kojem sistemu koji nije windows), ili programirate u timu, trebalo bi da razmislite o korišćenju virtualne mašine. Ovo zvuči nezgodno, ali uz pomoć Vagrant-a možete podesiti jednostavnu virtualnu mašinu u samo nekoliko koraka. Te osnovne “kutije”, posle toga mogu biti podešene ručno, ili uz pomoć određene vrste software-a za “nabavljanje i podešavanje”, kao što su Puppet ili Chef. Korišćenje navedenih programa je odličan način da obezbedite da su sve mašine podešene identično i uklanja potrebu da vi održavate komplikovane liste komandi za instalaciju potrebnih programa i biblioteka. Takođe možete i “uništiti” vašu “kutiju” i ponovo je kreirati uz veoma mali broj komandi, samim tim čin kreiranja sveže “kutije” je mnogo olakšan.

Vagrant pravi deljene direktorijume između domaćin i virualne mašine koji se koriste za deljenje koda, što znači da možete da pravite i modifikujete fajlove na domaćin mašini, a da ih izvršavate na virtuelnoj.

Mala pomoć

Ako vam treba mala pomoć oko korišćenja vagrant-a, postoje dva servisa koja vam mogu biti od koristi:

Back to Top{.top}

Uputstvo za pisanje koda

PHP zajednica je velika i raznovrsna, sastoji se od bezbroj biblioteka, framework-a i komponenti. Uobičajeno je za PHP programere da izaberu nekoliko od tih komponenti i iskoriste ih u jednom projektu. Važno je da se PHP kod pridržava (što je bliže moguće) zajedničkom načinu izgleda koda, da bi olakšali programerima deljenje različitih biblioteke u među projektima.

The Framework Interop Group je predložila i odobrila seriju predloga o izgledu koda, poznatu kao PSR-0, PSR-1 and PSR-2. Nemojte dozvoliti da vas imena zbunjuju, ove preporuke su samo skup pravila koje neki projekti kao što su Drupal, Zend, Symfony, CakePHP, phpBB, AWS SDK, FuelPHP, Lithium itd. počinju da poštuju. Možete ih poštovati u svojim projektima, ili možete da nastavite da koristite vaš stil.

Idealno trebalo bi da pišete PHP kod koji prati poznat standard. To bi mogla biti kombinacija PSR standarda, ili neki od standarda koje su PEAR ili Zend objavili. To znači da će drugi programeri moći lako da čitaju i rade sa vašim kodom, isto tako će aplikacije koje implementiraju komponente drugih programera biti dosledne.

Možete koristiti PHP_CodeSniffer da proverite da li kod prati neke od ovih standarda, i/ili pluginove za tekst editore, kao npr. Sublime Text 2 da bi ste dobili informacije o stilu koda u realnom vremenu.

Koristite PHP Coding Standards Fixer Fabien Potencier-a da automatski izmenite sintaksu koda tako da se povinuje datim standardima, i tako uštedite vreme koje bi ste potrošili kada biste ručno vršili izmene.

Engleski ima prioritet za sva imena simbola i infrastrukture koda. Komentari mogu biti pisani u jeziku koji svi članovi sadašnjeg tima mogu da razumeju, ali imajte na umu i buduće naslednike koda.

Back to Top{.top}

Istaknuti delovi jezika

Programske paradigme

PHP je fleksibilan, dinamičan jezik koji prodržava različite programske tehnike. Dramatično je evoluirao tokom proteklih godina, neke od značajnih izmena su dodavanje solidnog objektno-orijentisanog modela u PHP 5.0 (2004), anonimnih funkcija i imenskih prostora u PHP 5.3 (2009), i trait-ova (osobina) u PHP 5.4 (2012).

Objektno-orijentisano programiranje

PHP ima kompletan set objektno-orijentisanih osobina uključujući podršku za klase, abstraktne klase, interfejse, nasleđivanje, konstuktore, kloniranje, izuzetke, i još.

Funckionalno programiranje

PHP podržava funkcije prve klase, što znači da funkcije mogu da se dodele promenljivim. I korisničke i ugrađene funkcije mogu da se referenciraju kroz promenljive i pozivaju dinamički. Funkcije mogu da se prosleđuju kao argumenti drugih funkcija (osobina zvana funkcije višeg reda) i isto tako mogu da se vraćaju kao povratni tip drugih funkcija.

Rekurzija, odlika koja dozvoljava funkciji da poziva samu sebe je podržana, ali većina PHP koda se fokusira na iteracije.

Nove anonimne funkcije (sa podrškom za closures) su deo jezika od PHP verzije 5.3 (2009).

U PHP 5.4 je dodata mogućnost da se closures vezuju za obim objekta, kao i poboljšana podrška za callables tako da se mogu koristiti zamenljivo sa anonimnim funkcijama u skoro svim slučajevima.

Meta programiranje

PHP podržava različite vrste meta programiranja uz pomoć mehanizama kao što su Reflection API i magične metode. Postoje mnoge magične metode kao npr. __get(), __set(), __clone(), __toString(), __invoke(), itd. koje dozvoljavaju programerima da se nakače na ponašanje klase. Ruby programeri često kažu kako PHP-u nedostaje method_missing, ali postoji kao metode __call() and __callStatic().

Namespaces - imenski prostori

Kao što smo spomenuli iznad, PHP zajednica ima mnogo developera koji stvaraji dosta koda. To znači da jedna biblioteka PHP koda može da koristi isto ime za klasu kao neka druga biblioteka. Kada se obe biblioteke koriste u istom imenskom prostoru, oni se “sudare” i prouzrokuju probleme.

Namespaces rešavaju taj problem. Kao što je opisano i PHP uputstvu, imenski prostori se mogu uporediti sa direktorijumima u operativnom sistemu. Dva fajla sa istim imenima mogu da postoje u različitim direktorijumima. Isto tako, dve PHP klase sa istim imenom mogu da postoje u različitim imenskim prostorima. Tako je prosto.

Važno je za tebe da koristiš imenske prostore u tvom kodu, da bi drugi programeri mogli da ga koriste bez bojazni da će se sudarati sa ostalim bibliotekama.

Jedan preporučen način za korišćenje namespace-ova je opisan u PSR-0, koji cija da pruži standard za fajlove, klase i namespace-ove da bi omogućio plug-and-play kod.

Standardna PHP biblioteka (SPL)

Standardna PHP biblioteka (SPL) se isporučuje zajedno sa PHP-om i pruža kolekciju klasa i interfejsa. Uglavnom se sastoji se najčešće potrebnih klasa struktura podataka ( stack, queue, heap itd.), i iteratora koji mogu da prelaze preko ovih struktura podataka ili preko vaših klasa koji implementiraju SPL interfejse.

Interfejs komandne linije

PHP je prvobitno kreiran za pisanje web aplikacija, ali je koristan za pisanje programa koji se izvršavaju iz komandne linije. Programi koji koriste komandnu liniju kao interfejs mogu da vam pomognu da automatizujete uobičajene zadatke kao što su testiranje, pokretanje i administracija aplikacija.

CLI PHP programi su moćni zato što možete koristiti kod vaše aplikacije direktno bez da morate da kreirate i obezbedite web interfejs za njega. Samo se uverite da vam CLI PHP skripte nisu u web root-u!

Pokušajte da pokrenete PHP iz vaše komandne linije:

> php -i

-i opcija će ištampati vaša PHP podešavanja isto kao što bi phpinfo funkcija.

-a opcija omogućava interaktivni interfejs, sličan rubijevom IRB, ili pajtonovoj konzoli. Postoji još korisnih opcija za komandnu liniju.

Napišimo jednostavan “Hello, $name” CLI program. Da bi ga isprovali, kreirajmo fajl nazvan hello.php, sa sledećim kodom.

<?php
if ($argc != 2) {
    echo "Usage: php hello.php [name].\n";
    exit(1);
}
$name = $argv[1];
echo "Hello, $name\n";

PHP namesti dve specijalne promenljive na osnovu argumenata sa kojom ste pokrenuli skriptu. $argc je intedžer promenljiva koja sadrži broj argumenata i $argv promenljiva tipa niz koja sadrži vrednosti svakog argumenta. Prvi argument je uvek naziv fajla u kome se nalazi PHP kod koji želite da izvršite, u ovom slučaju hello.php.

exit() izraz je pozvan sa brojem različitim od nule da bi dali konzoli do znanja da komanda nije uspela. Često korišćeni kodovi izlaza se mogu naći ovde.

Da pokrenete skriptu iznad, iz komandne linije:

> php hello.php
Usage: php hello.php [name]
> php hello.php world
Hello, world

XDebug

Jedan od najkorisnijih alata prilikom razvoja programa je pravi debbuger (program za otkrivanje grešaka). On vam omogućava da pratite izvršavanje vašeg koda i nadgledate sadržaj steka. XDebug, PHP-ov debugger, mogu koristiti mnogi IDE programi da bi vam omogućili inspekciju steka i tačke prekida (breakpoints). Takođe može da omogući alatima kao što su PHPUnit i KCacheGrind da izvrše analizu prekrivenosti kao i profilisanje koda.

Ako se nađete u škripcu, spremni da pribegnete var_dump/print_r funkcijama, a još uvek ne možete da nađete rešenje - verovatno treba da koristite debbuger.

Instalacija XDebug-a može biti nezgodna, ali jedna od njegovih najbitnijih mogućnosti je “Remote Debugging” - ako tazvijate kod u lokalu, a onda ga testirate unutar virtualne mašine, ili na drugom serveru, debugging na daljini je opcija koju želite odmah da omogućite.

Tradicionalno, modifikovaćete fajlove Apache Vhost-a, ili .htaccess-a sa sledećim vrednostima:

php_value xdebug.remote_host=192.168.?.?
php_value xdebug.remote_port=9000

Stavka “remote host” će preslikavati adresu vašeg lokalnog računara, a “remote port” će biti port koji ste podesili da IDE osluškuje. Onda jedino što vam je preostalo je da stavite vaš IDE u mod slušanja i otvorite adresu:

http://your-website.example.com/index.php?XDEBUG_SESSION_START=1

Vaš IDE će sada presretati trenutno stanje kako se skripta bude izvršavala, dozvoljavajući vam da postavite tačke prekida i ispitate vrednosti u memoriji.

Grafički debugger-i vam omogućavaju, na veoma lak način, da prolazite kroz kod, ispitate promenljive, i izvršavate kod u trenutku izvršavanja programa. Mnogi IDE programi imaju ugrađene ili podržavaju pluginove za grafičko debug-ovanje sa xdebug-om. MacGBDp je besplatan, otvorenog koda, samostalan xdebug GUI za Mac.

Back to Top{.top}

Upravljanje zavisnostima

Postoji veliki izbor PHP biblioteka, framework-a i komponenti. Vaš projekat će verovatno koristiti neke od njih - to su zavisnosti projekta. Do skoro, PHP nije imao dobar način da upravlja tim zavisnostima. Čak iako ste ih ručno kontrolisali, i dalje ste morali da brinete o autoloading-u. Ne više.

Trenutno postoje dva velika paket menadžer sistema z PHP - Composer i PEAR. Koji je bi trebalo da koristite? Odgovor je oba.

U glavnom, Composer paketi će biti dostupni samo u projektima u kojima ih vi eksplicitno navedete, dok će PEAR paketi biti distupni svim vašim PHP projektima. Na prvi pogled možda vam se PEAR pristup čini lakšim, ipak postoji prednost kada se paketi koriste na nivou projekata uz pomoć composer-a.

Composer i Packagist

Composer je genijalan menadžer zavisnosti za PHP. Navedite zavisnosti vašeg projekta u composer.json fajlu, i uz pomoć nekoliko jednostavnih komandi, Composer će sam automatski da poskida zavisnosti sa interneta i podesi autoloading za vas.

Već postoji veliki broj PHP biblioteka koje su kompatibilne sa Composer-om, spremne za korišćenje u vašem projektu. Ti paketi su izlistani na Packagist-u, oficijalnom repozitorijumu za biblioteke koje su kompatibilne sa Composer-om.

Kako instalirati Composer

Composer možete instalirati lokalno (u direktorijum u kome trenutno radite; mada se ovaj pristup više ne preporučuje) , ili globalno (npr. /usr/local/bin). Pretpostavimo da želite da instalirate Composer lokalno. Iz root direktorijuma vašeg projekta:

curl -s https://getcomposer.org/installer | php

Ta komanda će skinuti composer.phar (PHP binarnu arhivu). Možete pokrenuti to sa php da biste upravljali zavisnostima. Pažnja: Ako pokrećete skinuti kod direktno u interpreteru, molimo vas da se prvo uverite da je kod bezbedan.

Kako instalirati Composer (ručno)

Ručno instaliranje Composer-a je napredna tehnika; uprkos tome, postoje različiti razlozi zašto developer može da preferira ovaj metod, a ne korišćenje metode koje smo iznad objasnili. Interaktivna instalacija proverava vašu PHP instalaciju da se uveri da:

Pošto ručna instalacija ne izvodi nijednu od tih provera, vi morate da odlučite da li vam taj kompromis odgovara. Sada kada smo to razjasnili, ispod možete naći uputstvo za ručnu instalaciju Composer-a:

curl -s https://getcomposer.org/composer.phar -o $HOME/local/bin/composer
chmod +x $HOME/local/bin/composer

Putanja $HOME/local/bin (ili direktorijum po vašem izboru) treba da se nalazi u $PATH sistemskoj promenljivoj. Time ćete composer komandu učiniti dostupnom.

Kada naiđete na dokumentaciju koja objašnjava da Composer pokrenete sa php composer.phar install komandom, tu komandu možete zameniti sa:

composer install

Kako definisati i instalirati zavisnosti

Composer prati zavisnosti vašeg projekta u fajlu koji se zove composer.json. Možete da upravljate njime ručno, ako želite, ili možete da koristite sam Composer. Komanda php composer.phar require dodaje zavisnost projektu i ako nemate composer.json fajl, on će biti kreiran. Sledi primer koji objašnjava kako dodati Twig kao zavisnost vašeg projekta. Pokrenite sledeću komandu u root direktorijumu vašeg projekta, pošto ste skunuli composer.phar:

php composer.phar require twig/twig:~1.8

Alternativno komanda php composer.phar init će vam pomoći da kreirate pun composer.json fajl za vaš projekat. U savkom slučaju, kada napravite vaš composer.json fajl, tada možete reći Composer-u da skine i instalira vaše zavisnosti u vendors/ direktorijum. Ovo se takođe odnosi na projekte koje ste vi skinuli, a koji već imaju svoj composer.json fajl.

php composer.phar install

Posle toga, dodajte sledeću liniju u glavni PHP fajl vaše aplikacije; Ovo će reći PHP-u da koristi Composer-ov autoloader za zavisnosti vašeg projekta.

<?php
require 'vendor/autoload.php';

Sada možete koristiti zavisnosti vašeg projekta, jer će biti uključeni automatski , kada budu zatraženi.

Ažuriranje vaših zavisnosti

Composer kreira fajl nazvan composer.lock koji čuva tačnu verziju svakog paketa koji je skinuo kada ste prvi put pokrenuli php composer.phar install komandu. Ako delite vaš projekat sa drugim programerima, a composer.lock fajl je deo vaše distribucije, kada oni budu pokrenuli php composer.phar install komandu, Composer će se pobrinuti da i oni imaju iste verzije paketa kao i vi. Da biste ažurirali vaše zavisnosti pokrenite php composer.phar update.

To je veoma korisno kada verzije paketa definišete fleksibilno. Npr. zahtevamo verziju ~1.8 znači “bilo koja novija verzija od 1.8.0, ali manja od 2.0.x-dev”, takođe možete koristiti * džoker kao u 1.8.*. Sada će komanda php composer.phar update unaprediti sve vaše zavisnosti na najnovije verzije koje se slažu sa zahtevima koje ste naveli.

Bezbednost - provera vaših zavisnosti

Security Advisories Checker je web servis i CLI alat, koji će ispitati vaš composer.lock fajl i reći vam ako treba da ažurirate neke zavisnosti.

PEAR

Još jedan paket menadžer koji mnogi PHP developeri koriste je PEAR. Po ponašanju je sličan Composer-u, ali ima neke bitne razlike.

PEAR zahteva da svaki paket ima specifičnu strukturu, što znači da autor paketa mora da ga pripremi za upotrebu sa PEAR-om. Korišćenje projekta koji nije podešen za rad sa PEAR-om nije moguće.

PEAR instalira pakete globalno, što znači da posle jednog instaliranja oni postaju dostupni svim projektima koji su na serveru. Ovo može biti dobro ako mnogi projekti koriste iste pakete iste verzije, ali može dovesti do problema ako dođe do konflikta verzija između projekata.

Kako instalirati PEAR

PEAR možete instalirati skinući “phar” instaler i pokretanjem istog. PEAR dokumentacija ima detaljne instrukcije za instalaciju za svaki operativni sistem.

Ako koristite linuks, možete videti da li njegov paket menadžer ima PEAR paket. Npr. debian i ubuntu imaju apt php-pear paket.

Kako instalirati paket

Ako se paket nalazi u listi na listi PEAR paketa, možete ga instalirati tako što ćete navesti njegovo zvanično ime:

pear install foo

Ako je paket hostovan na drugom kanalu, morate prvo da “otkrijete” taj kanal, ali i da ga naznačite prilikom instalacije. Pogledajte dokumentaciju korišćenje kanala za više informacija na tu temu.

Rukovanje PEAR zavisnostima sa Composer-om

Ako već koristite Composer, a želeli biste da instalirate i neki PEAR kod, možete iskoristiti Composer da sredi PEAR zavisnosti. Sledeći primer će instalirati kod sa pear2.php.net:

{
    "repositories": [
        {
            "type": "pear",
            "url": "http://pear2.php.net"
        }
    ],
    "require": {
        "pear-pear2/PEAR2_Text_Markdown": "*",
        "pear-pear2/PEAR2_HTTP_Request": "*"
    }
}

Prva sekcija "repositories" se koristi da se Composer-u da do znanja da treba da “odredi” (ili da “otkrije” sa PEAR terminologijom) pear repozitorijum. Onda će “require” sekcija da doda prefiks imenu paketa:

pear-channel/Package

“pear” prefiks je fiksiran da bi se izbegli konflikti, npr. pear kanal bi mogao da bude isti kao ime nekog drugog paket izdavača. U tom slučaju se skraćeno ime tog kanala (ili puna adresa) mogu koristiti da bi se definisalo u kom kanalu je dati paket.

Kada se taj kod instalira, postaće dostupan u “vendor” direktorijumu i automatski dostupan kroz Composer-ov “autoloader”:

vendor/pear-pear2.php.net/PEAR2_HTTP_Request/pear2/HTTP/Request.php

Da bi ste koristili ovaj PEAR paket, jednostavno ga referencirajte na sledeći način:

$request = new pear2\HTTP\Request();

Back to Top{.top}

Praksa kodiranja

Osnove

PHP je veliki jezik koji dozvoljava programerima svih novoa znanja da proizvedu kod ne samo brzo, nego i efikasno. Međutim dok napredujemo kroz jezik, često zaboravljamo osnove koje smo prvo naučili (ili prevideli) u korist prečica i/ili loših navika. Da bismo pomogli u borbi protiv tog čestog problema, ova sekcija je namenjena podsećanju kodera na osnovnu programersku praksu u PHP-u.

Datum i vreme

PHP ima klasu nazvanu DateTime da vam pomogne kada čitate, pišete, upoređujete ili računate datum i vreme. Postoje mnoge funkcije u PHP-u, koje su vezane za datum i vreme osim DateTime klase, ali DateTime pruža lep objekto-orijentisani interfejs za najčešće upotrebe. Može da rukuje sa vremenskim zonama, ali to je van ovog kratkog uvoda.

Da biste koristili DateTime, konvertujte sirov string datuma i vremena u objekat sa createFromFormat() motodom, ili napravite novu instancu new \DateTime DateTime klase da biste dobili trenutno vreme i datum. Koristite format() metodu da konvertujete DateTime nazad u string za prikaz.

<?php
$raw = '22. 11. 1968';
$start = \DateTime::createFromFormat('d. m. Y', $raw);

echo 'Start date: ' . $start->format('m/d/Y') . "\n";

Računanje sa DateTime-mom je moguće sa DateInterval klasom. DateTime ima metode kao što su add() i sub() koje primaju DateInterval kao argument. Ne pišite kod koji očekuje isti broj sekundi svakog dana, razlike zbog vremenskih zona i pomeranja vremena će vam pokvariti očekivan način rada programa. Umesto koristite datum intervale. Da izračunate razlike između datuma koristite diff() metodu. Ona će vratiti nov DateInterval objekat, koji je veoma lako prikazati.

<?php
// kreira kopiju $start i doda jedan mesec i 6 dana
$end = clone $start;
$end->add(new \DateInterval('P1M6D'));

$diff = $end->diff($start);
echo 'Difference: ' . $diff->format('%m month, %d days (total: %a days)') . "\n";
// RAzlika: 1 mesec, 6 dana (totalo: 37 dana)

Na DateTime objektima možete koristiti standardno upoređivanje:

<?php
if ($start < $end) {
    echo "Start is before end!\n";
}

Poslednji primer da demonstriramo DatePeriod klasu. Koristi se za iteraciju preko događaja koji se ponavljaju. Može da primi dva DateTime objekta, početak i kraj, i interval za koji će vratiti sve događaje između njih.

<?php
// prikaži svaki četvrtak između $start i $end
$periodInterval = \DateInterval::createFromDateString('first thursday');
$periodIterator = new \DatePeriod($start, $periodInterval, $end, \DatePeriod::EXCLUDE_START_DATE);
foreach ($periodIterator as $date) {
    // prikaži svaki datum
    echo $date->format('m/d/Y') . ' ';
}

Dizaj šeme (Design Patterns)

Kada gradite vašu aplikaciju, poželjno je koristiti česte šeme u vašem kodu, kao i leste šeme za strukturu samog projekta. Korišćenje čestih šema je korisno zato što vam olakšava održavanje koda, ali pomaže i drugim programerima da se brzo razumeju kako sve funkcioniše.

Ako koristite framework onda će većina koda višeg nivoa i struktura projekta biti zasnovana na tom framework-u, tako da je dosta odluka već napravljeno za vas. Ali i dalje je na vama da izaberete najbolju šemu koju ćete koristiti u kodu koji budete vi pisali. Ako, sa druge strane, ne koristite framework da pišete aplikacijuo onda ćete morati da nađete šeme koje najbolje odgovaraju tipu i veličini aplikacije koju gradite.

Back to Top{.top}

Baze podataka

Vaš kod će često koristiti bazu podataka da sačuva informacije. Imate nekoliko opcija za povezivanje i ineterakcijom sa vašom bazom. Preporučena opcija do PHP 5.1.0 verzije je bila da se koriste lokalni drajveri kao što su mysql, mysqli, pgsql itd.

Matični drajveri su odlični ako koristite samo jednu bazu podataka u vašoj aplikaciji, ali ako npr. koristite MySQL i malo MSSQL, ili morate da se povežete na Oracle bazu, onda nećete moći da koristite iste drajvere. Moraćete da naučite novi API za svaku bazu posebno.

Kao dodatna napomena vezana za matične drajvere, mysql ekstenzija za PHP više nije u aktivnom razvoju, i zvanični status od PHP verzije 5.4.0 je “Long term deprecation”. To znači da će biti odstranjena u nekom od narednih izdanja, tako da do verzije 5.6 (ili koja god da dođe posle 5.5), će biti izbačena. Ako koristite mysql_connect() i mysql_query() funkcije u vašoj aplikaciji, moraćete da je ispravite u jednom trenutku u budućnosti. Tako da vam je najbolja opcija da zamenite mysql grupu funkcija sa mysqli ili PDO.

Ako sada počinjete sa novom aplikacijom onda nikako nemojte koristiti mysql ektenziju: koristite PDO, ili MySQLi ekstenziju .

PDO

PDO je biblioteka koja apstrakuje različite baza podataka. Dolazi uz PHP od verzije 5.1.0, pruža zajednički interfejs za komunikaciju sa više različitih baza podataka. PDO neće prevoditi vaše SQL upite ili simulirati nedostajuće opcije. Služi isključivo za povezivanje sa bazama koristeći isti API.

Još važnije, PDO vam omogućava da bezbedno ubrizgate strani upis (npr. ID-jeve) u vaše SQL upite bez da brinete o “SQL injection” napadima. To je moguće uz upotrebu PDO iskaza i vezanih parametara.

Pretpostavimo da PHP skripta primi numerički ID kao query parametar. Taj ID treba biti iskorišćen za uzimanje podataka o korisniku iz baze podataka. Ovo je pogrešan način:

<?php
$pdo = new PDO('sqlite:users.db');
$pdo->query("SELECT name FROM users WHERE id = " . $_GET['id']); // <-- NO!

Ovo je užasan kod. Vi ovde ubacujete svež parametar u SQL upit. To je skroz nebezbedno, i dovelo bi do hakovanja vaše aplikacije veoma brzo. Samo zamislite kada bi haker pozvao sledeći URL gde ID ne bi bio brojčana vrednost. http://domain.com/?id=1%3BDELETE+FROM+users. To bi dalo $_GET['id'] promenljivoj vrednost 1;DELETE FROM users, a to znači da bi time obrisao sve korisnike iz tabele u bazi. Umesto toga morate da sanirate ID vrednost tako što ćete koristiti PDO vezane parametre.

<?php
$pdo = new PDO('sqlite:users.db');
$stmt = $pdo->prepare('SELECT name FROM users WHERE id = :id');
$stmt->bindParam(':id', $_GET['id'], PDO::PARAM_INT); //<-- Automatically sanitized by PDO
$stmt->execute();

To je tačan kod. Koristi vezane parametre u PDO iskazu. To obezbeđuje strani unos ID vrednosti pre nego što dođe do baze podataka i time sprečava potencijalne “SQL injection” napade.

Trebalo bi da budete i svesniji da konekcije sa bazom koriste resurse, i da nije nečuveno da su resursi iscrpljeni ako se konekcije nisu zatvorile. Mada ovo se češće dešavalo u drugim jezicima. Korišćenjem PDO-a možete implicitno zatvoriti konekciju sa bazom tako što ćete uništiti PDO objekat, tj setovati ga na NULL. Ako to ne uradite eksplicitno, PHP će to uraditi automatski kada se vaša skripta završi - osim ako naravno ne koristite stalnu konekciju.

Slojevi apstrakcije

Mnogi framework-ovi pružaju svoje apstrakcione slojeve koji mogui, ali ne moraju da budu nadograđene na PDO. Ti slojevi će često emulirati opcije jedne baze koja druga baza nema, tako što će omotati vaše upite svojim metodama, time vam dajući pravu apstrakciju baze podataka. Ovo će naravno dodati pritisak na performanse, ali ako pravite portabilnu aplikaciju koja mora da radi sa više baza, onda taj gubitak performansi će vredeti zarad preglednosti koda.

Neki slojevi apstrakcije su pravljeni pridržavajući se PSR-0 standarda imenskih prostora, tako da mogu biti dodati u svaku aplikaciju u koju želite:

Back to Top{.top}

Greške i izuzeci

Greške

PHP ima nekoliko nivoa ozbiljnosti grešaka. Tri najčešća tipa poruka su greške, obaveštenja i upozorenja. One imaju tri različita nivoa ozbiljnosti: E_ERROR, E_NOTICE i E_WARNING. Greške su fatalne greške tokom izvršavanja i obično su prouzrokovane greškama u vašem kodu. Greške takve vrste se moraju popraviti jer one zaustavljaju izvršavanje PHP-a. Upozorenja nisu fatalne greške, izvršavanje skripte neće biti zaustavljeno. Obaveštenja su savetodavne poruke prouzrokovane kodom koji može, ali ne mora da izazove probleme tokom izvršavanja, samim tim izvršavanje nije prekinuto.

Drugi tip poruke grešaka koje se dobijaju za vreme kompiliranja je E_STRICT. Ove poruke se koriste da bi se predložile promene vašeg koda, kako bi kod bio kompitabilan u budućnosti.

Izuzeci

Izuzeci su standardan deo većine popularnih programskih jezika, ali ih PHP programeri često previde. Jezici kao Ruby se veoma često oslanjaju na izuzetke, tako da kad god da nešto krene naopako, kao npr. HTTP zahtev se neizvrši, ili DB upit pođe naopako, ili čak ako nije mogao da nađe fajl slike, Ruby će izbaciti izuzetak tako da uvek znate šta je pošlo naopako.

PHP je relativno labav po tom pitanju, npr. poziv funkcije file_get_contents() će vam uglavnom vratiti FALSE i upozorenje. Mnogi stari framework, kao CodeIgniter će vam samo vratiti false, zabeležiti poruku u svoje logove i možda vam dozvoliti da iskoristite metodu kao $this->upload->get_error() da bi videli šta je pošlo naopako. Problem ovde je da vi morate da jurite za greškom i proverite dokumentaciju da bi videli kako se zove error metoda za datu klasu, umesto da vam pdmah kaže u čemu je problem.

Drugi problem je kada klase automatski izbace grešku na ekran i prekinu sa izvršavanjem. Kada to uradite vi sprečavate drugog programera da dinamički upravlja greškom. Izuzeci trebaju biti bačeni da bi programer bio svestan greške, a onda oni mogu da odluče šta da urade po tom pitanju. Npr.:

<?php
$email = new Fuel\Email;
$email->subject('My Subject');
$email->body('How the heck are you?');
$email->to('guy@example.com', 'Some Guy');

try
{
    $email->send();
}
catch(Fuel\Email\ValidationFailedException $e)
{
    // The validation failed
}
catch(Fuel\Email\SendingFailedException $e)
{
    // The driver could not send the email
}
finally
{
    // Use this to let user know email was sent
}

SPL izuzeci

Generička Exception klasa pruža veoma malo debugging konteksta za programera. Međutim, da bi se to nadoknadilo, moguće je kreirati specijalizovane Exception tipove, tako što ćete kreirati klase koje nasleđuju Exception klasu.

<?php
class ValidationException extends Exception {}

To znači da možete dodati više “catch” blokova i rukovati sa različitim izuzecima na različite načine. To može dovesti do kreiranja mnogo specijalnig izuzetak klasa, neke koje ste mogli izbeći korišćenjem SPL izuzetaka dostupne u SPL ekstenziji.

Ako npr. koristite __call() magičnu metodu, i pozovote nepostojeći metod tada umesto bacanja standardnog izuzetka koji nam ne kaže mnogo, ili umesto kreiranja nove izuzetak klase, možete baciti već dostupan izuzetak throw new BadFunctionCallException;.

Back to Top{.top}

Bezbednost

Bezbednost internet aplikacija

Postoje loši ljudi koji su spremni i voljni da eksploatišu vašu aplikaciju. Važno je da vi preduzmete neophodne mere predostrožnosti kako bi poboljšali sigurnost vaše aplikacije. Srećom, dobri ljudi iz The Open Web Application Security Project (OWASP) su sastavili obimnu listu poznatih sigurnosnih propusta i metoda kako da se zaštite od njih. Ovo je obavezno štivo za svakog developera kome je stalo do bezbednosti.

Heširanje lozinki

Na kraju svako napravi PHP aplikaciju koja koristi prijavu korisnika. Korisnička imena i lozinke se čuvaju u bazi podataka i kasnije se koristi za proveru identiteta korisnika prilikom prijave.

Bitno je da ispravno hash-ujete lozinke pre nego što ih sačuvate. Heširanje lozinke je nepovratna transformacija koja se dešava kada je propustite kroz određenu funkciju. To proizvodi string fiksne dužine. To znači da možete da uporedite dva heša da biste utvrdili da li su oba nastali od istog stringa, ali ne možete od njih saznati orginalni string. Ako lozinke nisu heširane, a neko ko nije odobren pristupi vašoj bazi podataka, svi korisnički nalozi postaju kompromitovani. Neki korisnici mogu da koriste istu lozinku za više različitih servisa. Samim tim veoma je važno da ozbiljno shvatite bezbednost.

Heširanje lozinki sa password_hash

U PHP 5.5 verziji dodata je password_hash funkcija. Trenutno koristi BCrypt, najsnažniji algoritam koji PHP podržava. U budućnosti će biti ažurirana sa još algoritama, kako bude bilo potrebno. Biblioteka password_compat je kreirana da bi omogućila kompatibilnost sa PHP >= 5.3.7.

Ispod heširamo string, a onda proverimo heš sa novim stringom. Zato što su ta dva izvorna stringa različita (‘secret-password’ i ‘bad-password’) prijava na sistem neće uspeti.

<?php
                      
require 'password.php';

$passwordHash = password_hash('secret-password', PASSWORD_DEFAULT);

if (password_verify('bad-password', $passwordHash)) {
    // Tačna lozinka
} else {
    // Pogrešna lozinka
}

Filtriranje podataka

Nemojte nikad imati poverenja u tuđi unos ubačen u vaš PHP kod. Uvek očisitite i overite tuđi unos pre nego što ga iskoristite u kodu. Funkcije filter_var i filter_input mogu da očiste tekst i overe tekstualne formate (npr. imejl adrese).

Strani unos može biti svašta: $_GET i $_POST unešeni podaci iz forme, neke od vrednosti u $_SERVER globalnoj promenljivoj, i telo HTTP zahteva preko fopen('php://input', 'r'). Zapamtite, strani unos nije ograničen na samo podatke iz forme koju je korisnik popunio i poslao. Poslati i preuzeti fajlovi, vrednosti sesija, podaci iz kolačića, kao i svi podaci od drugih internet servisa, su takođe strani unos.

Dok strani podaci mogu biti sačuvani, kombinovani i možete im pristupiti kasnije, to je i dalje strani unos. Svaki put kada obrađujete, prikazujete, spajate, ili uključujete podatke u vaš kod, zapitajte se da li su podaci propisno filtrirani i da li im se može verovati.

Podaci mogu biti “filtrirani” drugačije zavisno od njihove svrhe. Npr., kada se nefiltrirani strani unos stavi u HTML stranu, on može da izvrši HTML i Javascript na vašem sajtu! To je znano pod imenom “Cross-Site Scripting” (XSS) i može biti veoma opasan napad. Jedan od načina da izbegnete XSS je da pročistite sve korisnički generisane podatke pre nego što ih prikažete, tako što će te izbrisati sve HTML tagove sa strip_tags funkcijom ili “eskejpovanjem” karaktera sa specijalnim značenjem, prebacivanjem istih u odgovarajuće HTML entitete sa htmlentities ili htmlspecialchars funkcijama.

Još jedan primer je dodavanje opcija za izvršavanje na komandnoj liniji. Ovo može biti ekstremno opasno (i uglavnom je veoma loša ideja), ali možete iskoristiti ugrađenu escapeshellarg funkciju koja čisti izvršene argumente komande.

Poslednji primer je prihvatanje stranog unosa da biste odredili koji fajl da učitate sa fajl sistema. Ovo može biti eksploatisano menjanjem imena fajla u putanju do fajla. Morate da uklonite “/”, “/..”, null bytes, ili bilo koje druge karaktere iz putanje do fajla, tako da nemože da učita skrivene, privatne i osetljive fajlove.

Čišćenje podataka

Čišćenje uklanja (ili “eskejpuje”) ilegalne ili nebezbedne karaktere iz stranog unosa.

Npr., treba da očistite tuđ unos pre nego što uključite unos u HTML ili ga unesete u svežem obliku u SQL upit. Kada koristite vezane parametre sa PDO-om, on će očistiti unos za vas.

Ponekad je potrebno da dozvolite neke bezbedne HTML tagove u unosu kada ga uključujete u HTML stranu. Ovo je veoma teško uraditi i mnogi izbegavaju da se bave tim problemom, tako što koriste druge više ograničene formate kao Markdown ili BBcode, mada biblioteke koje koriste metode bele liste postoje sa tim razlogom vidi HTML Purifier.

Vidi filteri za čišćenje

Provera ispravnosti podataka

Provera ispravnosti podataka osigurava da stran unos bude upravo ono što očekujete. Npr., možda želite da proverite imejl adresu, telefonski broj, ili godine kada obrađujete registracionu formu.

Vidi filteri za proveru

Konfiguracioni fajlovi

Kada kreirate konfiguracione fajlove za vašu aplikaciju, preporuka je da pratite jedan od sledećih metoda:

Register Globals

PAŽNJA: Od PHP verzije 5.4.0 register_globals opcija je uklonjena i ne može više biti korišćena. Ovo je samo uključeno kao upozorenje za sve koji su u procesu ažuriranja svojih starih aplikacija.

Kada uključeno, register_globals konfiguraciona opcija koja čini nekoliko tipova promenljivih (uključujući one iz $_POST, $_GET i $_REQUEST) dostupne u globalnom opsegu vaše aplikacije. Ovo lako može dovesti do sigurnosnih problema jer vaša aplikacija ne može da odredi odakle dolaze podaci.

Npr.: $_GET['foo'] bi bila dostupna preko $foo, što može da prepiše promenljive koje nisu bile deklarisane. Ako koristite PHP < 5.4.0 uverite se da je opcija register_globals podešena na off.

Izveštavanje o greškama

Evidentiranje grešaka može biti korisno u pronalaženju problematičnih tačaka u vašoj aplikaciji, ali isto tako može da otkrije informacije o strukturi vaše aplikacije spoljnom svetu. Da bi ste efektno zaštitili vašu aplikaciju od problema koji mogu nastati zbog sadržine tih poruka, morate da podesite vaš server zavisno od namene, tj. da li služi za razvoj aplikacije ili za uživo pokretanje aplikacije.

Razvoj

Da biste prikazali sve moguće greške tokom razvoja, podesite sledeće opcije u vašem php.ini fajlu:

display_errors = On
display_startup_errors = On
error_reporting = -1
log_errors = On

Prosleđivanjem vrednosti -1 će prikazati sve moguće greške, čak i kada se novi nivoi i konstante budu dodale u budućim PHP verzijama. E_ALL konstanta se isto tako ponaša od verzije 5.4 php.net

E_STRICT nivo grešaka je ubačen u verziju 5.3.0 i nije deo E_ALL, međutim postao je deo E_ALL od verzije 5.4.0. Šta to znači? To znači da u verziji 5.3 morate koristiti ili -1 ili E_ALL | E_STRICT ako želite da prikažete sve moguće greške.

Prikazivanje svih grešaka po verzijama

Produkcija

Da biste sakrili greške u vašem produkcionom okruženju, podesite vaš php.ini fajl na sledeći način:

display_errors = Off
display_startup_errors = Off
error_reporting = E_ALL
log_errors = On

Sa ovim podešavanjima, greške će i dalje biti evidentirane u zapisnik grešaka za web server, ali neće biti prikazane korisniku. Za više informacija o ovim podešavanjima, vidite PHP uputstvo.

Back to Top{.top}

Testiranje

Pisanje automatizovanih testova za vaš PHP kod se smatra dobrom praksom i može da dovede do dobro napravljne aplikacije. Automatizovani testovi su odličan alat za osiguranje da vaša aplikacija neće pući kada menjate ili dodajete funkcionalnost.

Postoji nekoliko različitih tipova alata za testiranje (i framework-a) dostupnih za PHP, koji koriste različite pristupe - svi koji pokušavaju da izbegnu ručno testiranje i potrebu za velikim QA timovima, samo da bi se uverili da skorašnje promene nisu pokvarile postojeću funkcionalnost.

Razvoj vođen testiranjem

Sa Wikipedije:

Razvoj vođen testiranjem (TDD) je proces razvoja software-a koji se oslanja na ponavljanju veoma kratkih razvojnih ciklusa: prvo programer napiše padajući automatizovan test slučaj koji definiše željeno poboljšanje ili novu funkciju, onda napiše kod da bi prošao taj test i na kraju refaktoriše taj kod da zadovolji prihvaćen standard. Kent Beck, kome se pripisuje izumevanje ili “ponovno otkrivanje” ove tehnike, izjavio je 2003 da TDD ohrabruje jedostavan dizajn i uliva poverenje.

Postoji više različitih tipova testiranja koje možete da odradite za vašu aplikaciju.

Unit testiranje

Unit testiranje je programski pristup kojim se obezbeđuje da funkcije, klase i metode rade onako kako očekujete, od trenutka kada ih napišete pa sve kroz razvojni ciklus. Proveravanjem vrednosti koje ulaze i izlaze iz različitih funkcija i metoda, možete se uveriti da unutrašnja logika radi kako treba. Koristeći ubrizgavanje zavisnosti i pisanjem “mock” klasa i stabova možete se uveriti da se zavisnosti ispravno koriste za još bolje pokriće testovima.

Kada kreirate klasu ili funkciju trebalo bi da kreirate unit test za svaki osobinu koju mora da ima. Na najosnovnijem nivou morate se uveriti da izbacuje grešku kada prosledite loše argumente i da se uverite da radi ako prosledite ispravne argumente. Time ćete se osigurati da kada napravite izmene ta klasa ili funkcija, ili kasnije u razvojnom ciklusu, stara funkcionalnost nastavi da radi onanko kako je očekivano. Jedina alternativa ovome bi bilo korišćenje var_dump() funkcije u test.php, ali to nije dobar način za pravljenje aplikacija, bilo velikih ili malih.

Druga namena za unit testove je doprinošenju zajednici otvorenog koda. Ako možete da napišete test koji može da pokaže pokvarenu funkcionalnost, onda ga popravite, i pokažete da test prolazi, zakrpe će biti prihvaćene sa mnogo većom verovatnoćom. Ako vi vodite projekat koji prihvata “pull” zahteve, onda biste trebalo to da predložite kao uslov.

PHPUnit je najpoznatiji testing framework za pisanje unit testova za aplikacije, ali postoji nekoliko alternativa

Testiranje integracije

Sa Wikipedije:

Testiranje uklapanja je faza u testiranju software-a u kome se individualni software moduli kombinuju i testiraju kao grupa. Dešava se posle unit testiranja i pre validacionog testiranja. Testiranje uklapanja uzima module unosa, koji su bili unit testirani, grupiše ih u veće grupe, primeni testove koji su definisani u test planu, i na kraju dostavi kao svoj izlaz uklopljeni sistem spreman za sistemsko testiranje.

Mnogi od alata koji se koriste za unit testiranje se mogu koristiti za testiranje integracije, jer imaju slične principe.

Funkcionalno testiranje

Funckionalno testiranje se sastoji od alata koji kreiraju automatizovano testiranje koje zapravo koriste vašu aplikaciju, a ne samo delove vašeg koda da bi se uverili da aplikacija kao celina radi ono zašta je predviđena. Ovi alati obično rade koristeći prave podatke, i simulirajući prave korisnike aplikacije.

Alati za funkcionalno testiranje

Razvoj vođen ponašanjem

Postoje dva različita razvoja vođena ponašanjem (BDD): SpecBDD and StoryBDD. SpecBDD se fokusira na tehničko ponašanje koda, dok se StoryBDD fokusira na biznis ili ponašanje mogućnosti i interakcija. PHP ima framework za oba načina BDD-a.

Sa StoryBDD, vi pišete priče (koje ljudsko biće može da razume) koje opisuje vašu aplikaciju. Ove priče se onda mogu pokrenuti ka pravi testovi. Framework korišćen za StoryBDD se zove Behat, inspirisan je rubijevim Cucumber projektom i implementira Gherkin DSL za opisivanje ponašanja.

Sa SpecBDD, vi pišete specifikaciju koja opisuje kako vaš kod treba da se ponaša. Umesto da testira funkciju ili metod, vi opisujete kako ta funk. ili metoda treba da se ponašaju. PHP nudi PHPSpec framework za tu namenu, inspirisan RSpec projektom za rubi.

BDD linkovi

Dodatni alati za testiranje

Osim individalnih i BDD framework za testiranje, postoji i veliki broj generičnih framework-a i pomoćnih biblioteka korisnih koji god pristup da izaberete.

Linkovi za alate

Back to Top{.top}

Serveri i deployment

PHP aplikacije mogu biti prebačene i pokrenute na produkcionim web serverima na više načina.

Platforma kao servis (PaaS)

PasS pruža sistemsku i mrežnu arhitekturu neophodnu za pokretanje PHP aplikacija na internetu. To znači veoma malo, ili bez ikakvih podešavanja prilikom pokretanja PHP aplikacija ili PHP framework-a.

Skoro je PaaS postao popularan metod za pokretanje, hostovanje i skaliranje PHP aplikacija svih veličina. Možete naći listu PHP PaaS “Platform as a Service” provajdera u našoj sekciji sa resursima.

Virtuelni ili namenski serveri

Ako ste vam ne smeta administracija sistema, ili ste zainteresovani da to naučite, virtuelni ili namenski serveri vam daju totalnu kontrolu nad vašim produkcionim okruženjem.

nginx i PHP-FPM

PHP, preko svog ugrađenog FastCGI proces menadžera (FPM), veoma lepo radi u paru sa nginx. Nginx lagan, web server, jakih performansi. Koristi manje memorije od apache-a i može bolje da barata sa više konkurentnih zahteva. Ovo je posebno važno na virtuelnim serverima, koji nemaju memorije na pretek.

Apache i PHP

PHP i apache imaju dugu istoriju zajedno. Apache je veoma podesiv i ima mnogo dostupnih modula za proširavanje funkcionalnosti. On je popularan izbor za deljene servere i na njemu se lako se pokreću razni PHP programi, kao i aplikacije otvorenog koda., kao npr. Wordpress. Nažalost, apache koristi više resursa od nginx-a i ne može da prihvati isti broj konkurentnih zahteva u isto vreme.

Apache ima nekoliko mogućih konfiguracija za pokretanje PHP-a. Najčešći i najlakši način da se namesti je sa prefork MPM i PHP modulom mod_php5. Mada nije najbolji po pitanju zauzeća memorije, najlakši je za podešavanje i korišćenje. Ovo je verovatno najbolji izbor ako ne želite da se bavite administracijom servera. Napomena: ako koristite mod_php5 modul, onda MORATE da koristite prefork MPM.

Alternativno, ako želite da istisnete još performansi i dobijete veću stabilnost iz Apache-a, onda možete iskoristiti isti FPM sistem kao i nginx, sa worker MPM, ili event MPM sa mod_fastcgi, ili mod_fcgid modulom. Ova konfiguracija će biti malo bolja po pitanju potrošnje memorije, i mnogo brža, ali zahteva više vremena da se podesi.

Deljeni serveri

PHP treba deljenim serverima da se zahvali na svojoj popularnosti. Teško je naći hosting bez podrške za PHP, ali uverite se da je poslednja verzija. Deljeni serveri omogućavaju vama i drugim developerima da pokrenu sajtove na jednoj mašini. Dobra stvar je da zbog toga veoma jeftino. Loša stvar je što nikad ne znate kakv lom će vaše “komšije” da naprave. Ako možete vam budžet dozvoljava najbolje bi bilo da izbegnete deljene servere.

Gradnja i pokretanje vaše aplikacije

Ako ručno pravite izmene vaše baze podataka, ili pokrećete vaše testove ručno pre nego što ažurirate vaše fajlove (ručno), razmislite ponovo! Sa svakim dodatnim ručnim zadatkom prilikom pokretanja nove verzije vaše aplikacije, šansa za fatalnim greškama se uvećava. Bilo da se radi o jednostavnom ažuriranju, sveobuhvatni proces gradnje, ili čak strategija stalne integracije, automatizacija gradnjeje vaš prijatelj.

Neki od zadataka koje bi trebalo da automatizujete:

Alati za automatizaciju gradnje

Alati za gradnju mogu se opisati kao kolekcija skripti koje obavljaju česte zadatke prilikom _software deployment_a-a. Alat za gradnju nije deo vašeg projekta, on vrši radnje van njega.

Postoje mnogi alati otvorenog koda koji vam mogu pomoći sa automatizacijom gradnje, neki su napisani u PHP-u, a neki nisu. To ne bi trebalo da vas spreči da ih koristite, ako su bolje opremljeni za određen posao. Evo par primera:

Phing je najlakši način da krenete sa automatizcijom u PHP svetu. Sa Phing-om možete da kontrolišete vaše pakovanje, pokretanje ili testiranje sa jednostavnim XML fajlom. Phing (koji je zasnovan na Apache Ant-u) pruža bogat skup zadataka koji su obično potrebni da biste instalirali ili ažurirali aplikaciju, može se i proširiti sa dodatnim zadacima napisanim u PHP-u.

Capistrano je sistem za srednje-do-naprednih programera da izvrše komande u struktuiranom, ponovljivom načinu na jednoj ili više udaljenih mašina. Prekonfiguirisan je da pokreće RoR aplikacije, mada ljudi uspešno pokreću PHP sistema sa njim. Uspešno korišćenje Capistano-a zavisi od poznavanja rubija i Rake-a.

Blog post Dave Gardner-a PHP pokretanje sa Capistrano-om je dobar početak za PHP developere koji su zainteresovani za Capistrano.

Chef je više framework za pokretanje. To je veoma moćan framework za rubi sistem integraciju koji ne samo da pokreće vašu aplikaciju, već može da izgradi čitavo server okruženje ili virtuelne mašine.

Chef resursi za PHP developere:

Za dalje čitanje:

Neprekidna integracija

Neprekidna integracija je praksa u razvoju software-a kada članovi tima često integrišu svoj rad, Često svaka osoba integriše barem jednom dnevno — što dovodi do više inegracija u toku jednog dana. Mnogi timovi misle da ovaj način značajno smanjuje probleme vezane za integraciju i dozvoljava timu da razvija kohezivan software mnogo brže.

– Martin Fowler

Postoje različiti načini da se neprekidna integracija implementira u PHP. Skoro Travis CI je uradio odličan posao da omogući neprekidnu integraciju i malim projektima. Travis CI je hostovan servis za neprekidnu integraciju koji uslužuje zajednicu otvorenog koda. Integrisan je sa GitHub-om i nudi podršku za mnoge jezike uključujući PHP.

Za dalje čitanje:

Back to Top{.top}

Keširanje

PHP je poprilično brz sam po sebi, ali “uska grla” se mogu pojaviti kada pravite udaljene konekcije, učitavate fajlove, itd. Srećom, postoje razni alati za ubrzavanje određenih delova vaše aplikacije, ili da smanje broj potrebnih izvršavanja raznih zadataka koji troše mnogo vremena.

Bajtkod keš

Kada se PHP fajl izvrši, ispod haube prvo se kompajlira u bajt kod (isto poznat pod imenom opkod) i, tek tada, bajtkod se izvršava. Ako PHP fajl nije modifikovan, bajtkod će uvek biti isti. Što znači da je kompilacija trošenje CPU resursa.

Tu dolazi bajtkod keš. On sprečava bespotrebno kompajliranje čuvanjem u memoriji i korišćem iste kada je potrebno. Podešavanje bajkod keša može da se uradi u roku od par minuta, i vaša aplikacija će se osetno ubrzati. Ne postoji razlog da je ne koristite.

Od PHP verzije 5.5, postoji ugrađen bajtkod keš nazvan OPcache. Isto je dostupan za ranije verzije.

Drugi popularni bajtkod keševi su:

Keširanje objekata

Postoje situacije u kojima keširanje individalnih objekata može biti korisno, npr. kada je dobavljanje podataka previše zahtevno, ili kada je mala šansa da će se podaci u bazi podataka promeniti. Možete koristiti software za keširanje objekata da sačuva te delove podataka u memoriji da bi ste kasnije mogli da im pristupite veoma brzo. Ako smestite te podatke u skladište podataka pošto ih dobavite, a onda ih, pri sledećem zahtevu, povučete iz keša, možete dobiti bitno poboljšanje u performansama, kao i smanjeno opeterećenje servera baze podataka.

Mnogi of popularnih bajtkod keš rešenja, vam dozvoljava da sačuvate i sopstvene podatke. Tako da postoji još više razloga da ih iskoristite. APCu, XCache i WinCache, svi oni pružaju API-je za čuvanje podataka iz vašeg PHP koda u njihov memorijski keš.

Najpopularniji keš sistemi za čuvanje objekata su APCu i memcached. APCu je odličan izbor za keširanje objekata, on uključuje jednostavan API za dodavanje vaših podataka u njegovu keš memoriju i veoma je lak za podešavanje i upotrebu. Jedino pravo ograničenje APCu je da je vezan za server na kome je instaliran. Memcached, sa druge strane, se instalira kao odvojen servis i može mu se pristupiti preko mreže, što znači da možete čuvati objekte u super brzom skladištu keša, a da drugi sistemi mogu da uzimaju podatke od njega.

Obratite pažnju kada izvršavate PHP kao (Fast-)CGI aplikaciju unutar servera, svaki PHP proces će imati svoj keš, tj. APCu podaci nisu deljeni između vaših “worker” procesa. U to slučaju, trebalo bi da razmotrite korišćenje memcached, pošto nije vezan za PHP procese.

U umreženoj konfiguraciji APCu će uglavnom biti bolji od memcached-a u brzini pristupa, ali memcached može da se “skalira” brže i bolje. Ako ne očekujete da imate više servera koji će pokretati vašu aplikaciju, ili vam nisu potrebne dodatne opcije koje vam memcached nudi, onda vam je APCu verovatno bolji izbor za keširanje objekata.

Primer korišćenja APCu:

<?php
// proveri da li postoje podaci sačuvani pod 'expensive_data' ključem u kešu
$data = apc_fetch('expensive_data');
if ($data === false) {
    // podaci nisu u kešu; sačuvaj rezultat skupog poziva za kasniju upotrebu
    apc_add('expensive_data', $data = get_expensive_data());
}

print_r($data);

Obratite pažnju da pre PHP verzije 5.5, APC je omogućavao i keširanje objekata i bajtkod keširanje. APCu je projekat koji vraća keširanje objekata u PHP 5.5+, pošto PHP sada ima ugrađen bajtkod keš (OPcache).

Naučite više o popularnim sistemima za keširanje objekata:

Back to Top{.top}

Resursi

Iz izvora

Koga da pratite

Mentorstvo

PHP PaaS snabdevači

Frameworks

Umesto da ponovo izmišljaju točak, mnogi PHP developeri koriste frameworks da razvijaju internet aplikacije. Frameworks apstraktuju mnoge osnovne stvari, i pružaju korisne, jednostavne interfejse za izvršavanje uobičajenih zadataka.

Ne morate da koristite framework za svaki projekat. Ponekad je čist PHP najbolje rešenje, ali ako vam zatreba framework znajte da postoje tri glavna tipa:

Mikro framework je uglavnom omotač koji usmeruje HTTP zahteve ka povratnim funkcijama, kontrolerima, motedama itd. najbrže što može. I ponekad dolazi sa par dodatnih biblioteka da vam pomognu prilikom razvoja. Kao npr. osnovni omotaš za bazu podataka. Oni se uglavnom koriste sa izradu udaljenih HTTP servisa.

Mnogi framework dodaju znatan broj opcija na ono što je dostupno u mikro framwork, oni se nazivaju “full-stack framework”. Oni često dolaze sa ORM bibliotekama i paketima za autentifikaciju itd..

Framework bazirani na kolekciji komponenata se nazivaju “Component-based frameworks”.

Komponente

Kao što smo pomenuli iznad, “komponentae” su još jedan način da se kreira, distribuira i implementira deljeni kod. Razni repozitorijumi komponenti postoje, sledeće dve su napopularniji:

Oba ova repozitorijuma imaju CLI alate, da bi pomogli tokom instalacije, i procesa ažuriranja, i objašnjene su detaljnije u sekciji Upravljanje zavisnostima.

Postoje i framework-ci zasnovani na komponentama, koji vam omogućavaju da koristite njihove komponente sa minimalnim (ili potpuno bez) zahteva. Npr. vi možete koristiti FuelPHP Validation package, bez potrebe za FuelPHP framework-om.

Back to Top{.top}

Zajednica

PHP zajednica je raznovrsna koliko je i velika, i njeni članovi su spremni i voljni da pomognu novim PHP programerima. Razmislite o učlanjivanju u vašu lokalnu PHP korisničku grupu (PUG), ili posećivanju veće PHP konferencije da biste naučili više o najboljoj praki koju smo vam ovde pokazali. Možete se družiti na IRC-u u #phpc kanalu na irc.freenode.com, i pratite @phpc tviter nalog. Izađite, upoznajte nove developere, naučite o novim stvarima, i iznad svega, steknite nove prijatelje! Drugi resursi uključuju Google+ PHP zajednicu programera i StackOverflow.

Pročitajte zvaničan kalendar PHP događaja

PHP korisničke grupe

Ako živite u velikom gradu, velike su šanse da u blizini postiji PHP korisnička grupa. Iako još ne postoji zvanična lista PUG-ova, možete lako naći lokalni PUG pretragom na Google-u, Meetup.com ili PHP.ug. Ako živite u manjem gradu, možda postoji lokalni PUG; A ako ne, vi je otvorite!

Pročitajte o korisničkim grupama na PHP Wiki-ju

PHP konferencije

PHP zajednica takođe hostuje veće regionalne i nacionalne konferencije u mnogim zemljama na svetu. Dobro poznati članovi PHP zajednice obično imaju prezentacije na ovim većim događajima, tako da je to odlična prilika da naučite nešto direktno od vođa u industriji.

Nađite PHP konferenciju

Back to Top{.top}