b'\n_START_ARTICLE_\nPHP\n_START_SECTION_\nIstorija\n_START_PARAGRAPH_\nViskas prasid\xc4\x97jo 1994 met\xc5\xb3 ruden\xc4\xaf, kai Rasmus Lerdorf\'as (Danija) nusprend\xc4\x97 patobulinti savo Home-Page (asmenin\xc4\xaf puslap\xc4\xaf) ir para\xc5\xa1yti asmenin\xc4\xaf varikliuk\xc4\x85, kuris atlikin\xc4\x97t\xc5\xb3 papras\xc4\x8diausius veiksmus. \xc5\xa0\xc4\xaf varikliuk\xc4\x85 pareng\xc4\x97 1995 met\xc5\xb3 prad\xc5\xbeioje ir pavadino \xe2\x80\x9ePersonal Home Page Tools\xe2\x80\x9c. \xc5\xa0ie \xe2\x80\x9etools\'ai\xe2\x80\x9c mok\xc4\x97jo ne itin daug, ir galimyb\xc4\x97s jo buvo tik pa\xc4\x8dios papras\xc4\x8diausios, sudar\xc4\x97 j\xc4\x85 vos kelet\xc4\x85 makros\xc5\xb3. (Pat\xc4\xaf pirmaj\xc4\xaf Rasmus Lerdorf\'o prane\xc5\xa1im\xc4\x85 \xc4\xaf www konferencij\xc4\x85 apie savo \xe2\x80\x9ePersonal Home Page Tools\xe2\x80\x9c pateik\xc4\x97 1995 metais.)\n_START_SECTION_\nAntroji versija\n_START_PARAGRAPH_\n1995 met\xc5\xb3 viduryje atsirado antroji varikliuko versija, kuri vadinosi PHP/FI version 2. FI\xc2\xa0\xe2\x80\x93 d\xc4\x97l vienos prie\xc5\xbeasties: tiesiog Rasmus\xe2\x80\x99as padar\xc4\x97 papildom\xc4\x85 paket\xc4\x85, kuris jau mok\xc4\x97jo interpretuoti formas (Form Interpretator). PHP/FI kompiliavosi \xc4\xaf Apache Web server\xc4\xaf ir naudojo standartin\xc4\xaf Apache API. PHP skriptai pasirod\xc4\x97 spartesni serveryje nei CGI, nes nereik\xc4\x97jo kurti naujo proceso. Po truput\xc4\xaf PHP prad\xc4\x97jo lygintis savo galimyb\xc4\x97mis su Perl\'u (populiariausia kalba CGI ra\xc5\xa1ymui). Su laiku buvo prid\xc4\x97ta ir daugelio duomen\xc5\xb3 bazi\xc5\xb3 palaikymas (MySQL, Oracle Database ir t. t.), s\xc4\x85saja GD bibliotekai (para\xc5\xa1ytas Rasmus\'o ir iki \xc5\xa1iol kuruojamas jo) leido dinami\xc5\xa1kai kurti paveiksliukus. PHP/FI labai greitai prad\xc4\x97jo plisti.\n_START_SECTION_\nTre\xc4\x8dioji versija\n_START_PARAGRAPH_\n1997 met\xc5\xb3 pabaigoje Zeev Suraski ir Andi Gutmans (Izraelis) nusprend\xc4\x97 perra\xc5\xa1yti PHP varikliuk\xc4\x85 su tikslu i\xc5\xa1taisyti daugel\xc4\xaf klaid\xc5\xb3 bei pagreitinti PHP skript\xc5\xb3 atlikim\xc4\x85 serveryje. Po pus\xc4\x97s met\xc5\xb3, 1998.06 i\xc5\xa1\xc4\x97jo nauja versija, kuri buvo pavadinta PHP3. NetCraft\'o duomenimis PHP 1999 metais naudojosi jau 1 mln. domen\xc5\xb3.\n_START_SECTION_\nKetvirtoji versija\n_START_PARAGRAPH_\n1999\xc2\xa0m. pabaigoje buvo v\xc4\x97lgi perra\xc5\xa1ytas PHP3 varikliukas (pavadinimu Zend Engine) ir i\xc5\xa1leista nauja versija PHP4. Skirtumai tarp \xc5\xa1i\xc5\xb3 versij\xc5\xb3 yra tikrai dideli, kartu su pagrindiniu PHP branduoliu atsirado daugyb\xc4\x97 i\xc5\xa1pl\xc4\x97tim\xc5\xb3 ir jie vis dar nenustojami tobulinti ir ra\xc5\xa1yti (I\xc5\xa1pl\xc4\x97tim\xc5\xb3 pvz.: gd, xslt, sockets, imap, daugeli\xc5\xb3 DB support ir t. t.).\n_START_SECTION_\nPenktoji versija\n_START_PARAGRAPH_\n2002 met\xc5\xb3 saus\xc4\xaf yra paruo\xc5\xa1tas v\xc4\x97lgi patobulintas PHP varikliukas pavadinimu Zend Engine 2. Jis buvo i\xc5\xa1leistas 2002 met\xc5\xb3 viduryje. Zend Engine 2 ir bus PHP5 \xe2\x80\x9e\xc5\xa1irdis bei smegenys\xe2\x80\x9c. Pasak Zeev Suraski daugiausia darbo buvo id\xc4\x97ta \xc4\xaf naujo objektinio modulio tobulinim\xc4\x85. I\xc5\xa1taisyta objekto kopijavimo atmintyje problema (buvo sunku atkasti ar sukuriama jau esamo objekto kopija), ideologij\xc4\x85 Zeev Suraski pa\xc4\x97m\xc4\x97 i\xc5\xa1 Java. Tiesiog kuriant objekt\xc4\x85 (new Object()), kintamasis nebus pats objektas, o tiesiog nuoroda \xc4\xaf j\xc4\xaf. Taip darant priskyrim\xc4\x85 naujam kintamajam, bus priskiriamas nebe pats objektas, o jo nuoroda (objektas nekopijuojamas atmintyje). Taip pat atsirado destruktoriai, i\xc5\xa1im\xc4\x8di\xc5\xb3 valdymas (exception handling) (try/throw/catch) ir dauguma kit\xc5\xb3 pakeitim\xc5\xb3\xc2\xa0\xe2\x80\x93 __clone(), __construct(), __destruct() ir t. t.\n_START_SECTION_\nKodo pavyzdys\n_START_PARAGRAPH_\n<?phpfunction http_response($url, $status = null, $wait = 3){_NEWLINE_        $time = microtime(true);_NEWLINE_        $expire = $time + $wait;_NEWLINE__NEWLINE_        // we fork the process so we don\'t have to wait for a timeout_NEWLINE_        $pid = pcntl_fork();_NEWLINE_        if ($pid == -1) {_NEWLINE_            die(\'could not fork\');_NEWLINE_        } else if ($pid) {_NEWLINE_            // we are the parent_NEWLINE_            $ch = curl_init();_NEWLINE_            curl_setopt($ch, CURLOPT_URL, $url);_NEWLINE_            curl_setopt($ch, CURLOPT_HEADER, TRUE);_NEWLINE_            curl_setopt($ch, CURLOPT_NOBODY, TRUE); // remove body_NEWLINE_            curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);_NEWLINE_            $head = curl_exec($ch);_NEWLINE_            $httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);_NEWLINE_            curl_close($ch);_NEWLINE_           _NEWLINE_            if(!$head)_NEWLINE_            {_NEWLINE_                return FALSE;_NEWLINE_            }_NEWLINE_           _NEWLINE_            if($status === null)_NEWLINE_            {_NEWLINE_                if($httpCode < 400)_NEWLINE_                {_NEWLINE_                    return TRUE;_NEWLINE_                }_NEWLINE_                else_NEWLINE_                {_NEWLINE_                    return FALSE;_NEWLINE_                }_NEWLINE_            }_NEWLINE_            elseif($status == $httpCode)_NEWLINE_            {_NEWLINE_                return TRUE;_NEWLINE_            }_NEWLINE_           _NEWLINE_            return FALSE;_NEWLINE_            pcntl_wait($status); //Protect against Zombie children_NEWLINE_        } else {_NEWLINE_            // we are the child_NEWLINE_            while(microtime(true) < $expire)_NEWLINE_            {_NEWLINE_            sleep(0.5);_NEWLINE_            }_NEWLINE_            return FALSE;_NEWLINE_        }_NEWLINE_    }?>_NEWLINE_I\xc5\xa1vestis b\xc5\xabt\xc5\xb3 tokia: "see if a submitted URL has a valid http response code and also if it responds quickly. "'