PHP

**PHP** – plačiai paplitusi dinaminė interpretuojama programavimo kalba (en: *Hypertext Preprocessor*), sukurta 1995 m. ir specialiai pritaikyta interneto svetainių kūrimui.

PHP sintaksė panaši į daugelį struktūrinių kalbų, ypač į C bei Perl.

PHP kalba yra atviro kodo ir tai yra viena priežasčių, dėl ko kalba yra nors ir nesudėtinga, bet gana lanksti – veikia daugumoje operacinių sistemų, palaiko nemažai reliacinių duomenų bazių bei veikia su dauguma interneto serverių – CGI, FastCGI, ISAPI ir kitais protokolais.

Nors PHP yra dažniausiai naudojama interneto puslapių kūrimui, bet yra labai galingas įrankis atlikti kitas funkcijas komandinėje eilutėje.

## Istorija
Viskas prasidėjo 1994 metų rudenį, kai Rasmus Lerdorf'as (Danija) nusprendė patobulinti savo Home-Page (asmeninį puslapį) ir parašyti asmeninį varikliuką, kuris atlikinėtų paprasčiausius veiksmus. Šį varikliuką parengė 1995 metų pradžioje ir pavadino „Personal Home Page Tools“. Šie „tools'ai“ mokėjo ne itin daug, ir galimybės jo buvo tik pačios paprasčiausios, sudarė ją vos keletą makrosų. (Patį pirmajį Rasmus Lerdorf'o pranešimą į www konferenciją apie savo „Personal Home Page Tools“ pateikė 1995 metais.)

### Antroji versija

1995 metų viduryje atsirado antroji varikliuko versija, kuri vadinosi PHP/FI version 2. FI – dėl vienos priežasties: tiesiog Rasmus’as padarė papildomą paketą, kuris jau mokėjo interpretuoti formas (Form Interpretator). PHP/FI kompiliavosi į Apache Web serverį ir naudojo standartinį Apache API. PHP skriptai pasirodė spartesni serveryje nei CGI, nes nereikėjo kurti naujo proceso. Po truputį PHP pradėjo lygintis savo galimybėmis su Perl'u (populiariausia kalba CGI rašymui). Su laiku buvo pridėta ir daugelio duomenų bazių palaikymas (MySQL, Oracle Database ir t. t.), sąsaja GD bibliotekai (parašytas Rasmus'o ir iki šiol kuruojamas jo) leido dinamiškai kurti paveiksliukus. PHP/FI labai greitai pradėjo plisti.

### Trečioji versija

1997 metų pabaigoje Zeev Suraski ir Andi Gutmans (Izraelis) nusprendė perrašyti PHP varikliuką su tikslu ištaisyti daugelį klaidų bei pagreitinti PHP skriptų atlikimą serveryje. Po pusės metų, 1998.06 išėjo nauja versija, kuri buvo pavadinta PHP3. NetCraft'o duomenimis PHP 1999 metais naudojosi jau 1 mln. domenų.

### Ketvirtoji versija

1999 m. pabaigoje buvo vėlgi perrašytas PHP3 varikliukas (pavadinimu Zend Engine) ir išleista nauja versija PHP4. Skirtumai tarp šių versijų yra tikrai dideli, kartu su pagrindiniu PHP branduoliu atsirado daugybė išplėtimų ir jie vis dar nenustojami tobulinti ir rašyti (Išplėtimų pvz.: gd, xslt, sockets, imap, daugelių DB support ir t. t.).

### Penktoji versija

2002 metų sausį yra paruoštas vėlgi patobulintas PHP varikliukas pavadinimu Zend Engine 2. Jis buvo išleistas 2002 metų viduryje. Zend Engine 2 ir bus PHP5 „širdis bei smegenys“. Pasak Zeev Suraski daugiausia darbo buvo idėta į naujo objektinio modulio tobulinimą. Ištaisyta objekto kopijavimo atmintyje problema (buvo sunku atkasti ar sukuriama jau esamo objekto kopija), ideologiją Zeev Suraski paėmė iš Java. Tiesiog kuriant objektą (new Object()), kintamasis nebus pats objektas, o tiesiog nuoroda į jį. Taip darant priskyrimą naujam kintamajam, bus priskiriamas nebe pats objektas, o jo nuoroda (objektas nekopijuojamas atmintyje). Taip pat atsirado destruktoriai, išimčių valdymas (exception handling) (try/throw/catch) ir dauguma kitų pakeitimų – __clone(), __construct(), __destruct() ir t. t.

## Kodo pavyzdys


```php
<?php
function http_response($url, $status = null, $wait = 3)
{
        $time = microtime(true);
        $expire = $time + $wait;

        // we fork the process so we don't have to wait for a timeout
        $pid = pcntl_fork();
        if ($pid == -1) {
            die('could not fork');
        } else if ($pid) {
            // we are the parent
            $ch = curl_init();
            curl_setopt($ch, CURLOPT_URL, $url);
            curl_setopt($ch, CURLOPT_HEADER, TRUE);
            curl_setopt($ch, CURLOPT_NOBODY, TRUE); // remove body
            curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
            $head = curl_exec($ch);
            $httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
            curl_close($ch);
           
            if(!$head)
            {
                return FALSE;
            }
           
            if($status === null)
            {
                if($httpCode < 400)
                {
                    return TRUE;
                }
                else
                {
                    return FALSE;
                }
            }
            elseif($status == $httpCode)
            {
                return TRUE;
            }
           
            return FALSE;
            pcntl_wait($status); //Protect against Zombie children
        } else {
            // we are the child
            while(microtime(true) < $expire)
            {
            sleep(0.5);
            }
            return FALSE;
        }
    }
?>
```

Išvestis būtų tokia: "see if a submitted URL has a valid http response code and also if it responds quickly. "

## Nuorodos

* PHP oficiali svetainė
* PHP lietuviška svetainė
* PHP Saddness – PHP problemų katalogizavimui skirta svetainė