PHP

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

<?phpfunction 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. "