Php määras skripti täitmise aja. Php. Uurige skripti täitmise aega. Skripti täitmise aeg

Tervitused, kallid webcodiuse ajaveebi lugejad! Niisiis, asume otse asja juurde. Esiteks vastan küsimuse teisele osale: miks see võib olla vajalik? mõõta skripti täitmise aega?. Veebiprojektide silumise kallal töötades on oluline tegur, mida tuleks arvesse võtta, skriptide täitmise aeg. See parameeter on vajalik selleks, et mõista, kui kiiresti ja tõhusalt konkreetne koodijupp töötab. Määrates aja, mille server kulutab PHP-skripti täitmisele, saate järeldada, kas koodi optimeerimine on vajalik või mitte. Järgmisena vaatame, kuidas seda teha.

PHP-skriptide jõudluse analüüsimiseks on olemas erinevad laiendused ja teegid, näiteks XDebug, mis suudab skripte siluda ja täitmisaja järgi profiilida. Kuid selliste laienduste kasutamiseks peate kulutama aega nende installimisele ja konfigureerimisele. Loomulikult on keeruka arhitektuuriga, suure hulga skriptide ja miljonite koodiridadega suurte projektide töö optimeerimiseks parem kasutada selliseid laiendusi. Kuid kui teil on vaja optimeerida 3-4 skripti ühe või kahesaja koodireaga, saate skripti tööaja mõõtmiseks kasutada ainult PHP tööriistu.

Kuidas määrata skripti täitmise aega php-s

Seda probleemi saab hõlpsasti lahendada kuupäeva ja kellaajaga töötamise funktsioonide abil, nimelt sisseehitatud funktsiooniga microtime(), mis tagastab sekundite arvu, mis on möödunud 01.01.1970 keskööst. Seda funktsiooni kaks korda kutsudes saame arvutada kõnede vahel kulunud aja:

Kui käivitate skripti, on tulemus umbes selline:

Skripti täitmise aeg: 0,00059400000000001

Lühidalt, kuidas see töötab. Funktsiooni microtime(true) abil salvestame muutujas $start skripti käivitamise ajatempli. Järgmisena tuleb töötav kood, mis teeb teatud toiminguid. See näide kutsub lihtsalt välja funktsiooni usleep(), mis aeglustab skripti teatud arvu mikrosekundite võrra. Ja siis saame skripti lõpuaja, salvestame selle muutujasse $end ja arvutame koodi täitmise aja, lahutades $end väärtusest $start. Selle tulemusena saime skripti täitmise aja.

Nüüd teate, kuidas kindlaks teha php skripti täitmise aeg, võite hakata optimeerima erinevaid koodiplokke. Soovin teile edu ja kohtumiseni järgmistes postitustes!

Skriptide silumisel on kohustuslik tegur, mida tuleb kõigepealt arvesse võtta skripti täitmise aeg. Ja selles lühikeses artiklis näitan ma väga head ja lihtsat viisi, kuidas teada saada skripti täitmise aega.

See põhineb kuupäeva ja kellaajaga töötamise funktsioonidel. Soovitan vaadata näidet, et saaksite aru, kuidas see juhtub skripti täitmise aja arvutamine:

$algus = mikroaeg(tõene);
$summa = 0;
jaoks ($i = 0; $i< 100000; $i++) $sum += $i;
echo "Skripti täitmise aeg: ".(mikroaeg(true) - $start);
?>

Selle tulemusena näeme seda skripti täitmise aeg on näiteks selline: " 0.014652967453 "Kui ümardate selle ülespoole, siis see 0.015 sekundit. See on skripti täitmise aeg.

Nüüd räägime sellest, kuidas see toimib. Funktsioon mikroaeg () läbitud väärtusega tõsi tagastab keskööst möödunud sekundite arvu 01.01.1970 , ja see väärtus arvutatakse sajandiksekundite kaupa.

Järgmiseks tuleb tavaline skript, mida me kontrollime. Selle asemel on loomulikult teie stsenaarium. Ja lõpuks, viimane rida näitab erinevust praeguse kellaaja (pärast skripti täitmist) ja selle vahel, mis me skripti käivitamisel salvestasime. Erinevus aja vahel pärast skripti käivitamist ja aja vahel enne selle tööle hakkamist on skripti täitmise aeg.

Ma arvan, et siin on kõik lihtne. Kuid soovitan tungivalt seda aja arvutamise meetodit kasutada. Näiteks kui silusin oma mootori tööd, millel see sait asub, kiirendasin selle tööd peaaegu 2 korda.

Autorilt: mu sõbra poeg tundis keemia vastu nii suurt huvi, et hakkas kodus erinevaid "teste" läbi viima. Pärast seda, kui köögis olev lühter sai nende "ohvriks", palus isa tal oma eelistusi muuta. Selle tulemusena tekkis lapsel huvi statistika vastu ja ta otsustas välja arvutada ühe tiku keskmise põlemisaja. Tulemuseks oli see, et kogu korter süttis peaaegu põlema. Soovitasin tulevasel teadlasel alustada programmeerimist ja määrata PHP skripti täitmise aeg.

Miks mõõtmised programmeerimises?

Esiteks on see ohutum kui keemia ja statistika. Kuid tegelikult on programmikoodi täitmise aeg oluline parameeter, mis mõjutab kogu ressursi ja selle üksikute moodulite jõudlust. See parameeter on optimeerimise ja testimise ajal nõutavam.

Kujutagem natuke ette. Kujutagem ette, et on olemas mingi "kodukirjutatud" mootor, mille arendaja "laadis üles" heasse hostimisse ja käivitas (selle põhjal) oma veebisaidi. Kuid millegipärast on ressursi laadimine kasutaja poolel väga aeglane.

Sellises olukorras langevad esialgu kõik konarused võõrustajale. Tõenäoliselt esitab vihane programmeerija majutuse tugiteenusele kaebuse. Nad ütlevad, et lepingu tingimusi ei täideta, sait on vaevu "elus" ...

Kuid tegelikult võib dünaamilise ressursi lehtede aeglase laadimise probleem peituda mootoris endas. Ja selleks, et mitte hiljem näida välja nagu "mannekeen", mõõdab kogenud arendaja alati enne projekti edastamist PHP skripti täitmise aega.

PHP funktsioonid

Olen seda alati nimetanud üheks kõige mugavamaks programmeerimiskeeleks. Koodi tööaja jälgimiseks ei pea arendaja skripti iga rea ​​pealtkuulamiseks pikki "talmude" kirjutama. See tehnoloogia rakendab mitmeid spetsiaalseid tööriistu. Peamine neist on funktsioon microtime(). See tagastab aja (millisekundites), mis on möödunud 1970. aasta algusest. Nn Unixi ajastu algus. Kui edastate parameetri get_as_float funktsioonile väärtusega true, tagastab see ajaperioodi tervete sekundite ja murdosa millisekunditena.

Mikrotime() kasutamise põhimõte on järgmine: funktsiooni kutsutakse skripti alguses ja lõpus. Seejärel lahutatakse algväärtus viimasest väärtusest. Skripti täitmisaja arvutamiseks tehke järgmist.

"; $last=microtime(true); $value=$last-$first; echo "Skript käivitatakse: ".$value; ?>

Koodi tööaja muutmine

PHP-s saab skripti tööaja väärtust programmiliselt piirata (vähendada või suurendada). Selleks kasutatakse mitmeid funktsioone, millest igaüks kirjutab üle konfiguratsioonifailis (php.ini) oleva parameetrikomplekti.
Esiteks muutkem oma koodi ja suurendame tsükli iteratsioonide arvu 20 korda 200 miljonini. Kui kõik on korras, peaksite pärast skripti käivitamist saama saatusliku veateate.

See tähendab, et seadetes on parameeter max_execution_time seatud vaikeväärtusele (30 sekundit). Suurendame skripti maksimaalset täitmisaega PHP-s 3 korda.

sea_time_limit(90);

Nüüd ei saa me ühtegi veateadet.

15. november 2011, kell 06:52

Skripti täitmine taustal PHP-s ilma crontabita

  • Veebilehe arendus

Olin hämmingus, kui kirjutasin PHP-s deemoni. Need. skript, mis teeb teatud toiminguid teatud arvu kordi teatud arvu tundide jooksul juhuslikul ajal (alati juhuslikult) ja seda kõike ilma cron-i kasutamata.

Ma polnud kunagi varem viitsinud, aga peale ülesande seadmist hakkasin mõtlema, et see on võimatu, et PHP skripti peab brauser välja kutsuma... noh, ülesanne oli seatud, see tuli täita.

Esimene mõte on keelata skripti täitmise ajapiirang. Peremehe poolt keelatud.

Teine idee on korrata Ajaxi taotlust perioodiliselt (jah, vähemalt kord sekundis), kasutades JavaScripti. - pole võimalik (kliendi nõue).

Selgus tegelikult, et brauser ei tohiks olla avatud ja cron ei tohiks olla ning skript peaks töötama sõltumata kasutajast, lõputult. Loomulikult peaks see süsteemi minimaalselt koormama.

1. Pakk sigarette, öö, Google, dokumendid, raamatud, juhendid….
läheb 1…

Väljundil saan:
Task_1:
Rakendage skripti täitmise aja generaator, mis põhineb määratud kordade ja tundide arvul. Hoidke need ajad kuskil.

Task_2:
Töötage pärast brauseri sulgemist

Task_3:
Ärge jookske kokku pärast skripti täitmise tähtaja möödumist

Task_4:
Tehke teatud toiminguid õigel ajal.

Nii…
Kirjutame konfiguratsiooni algandmed:

Seansi_start(); // Seansi alustamine $num_starts = 120; // Skriptide arv teatud ajaperioodi jooksul $hours = 1; // Tundide arv, mille jooksul skripti käitada $num_starts korda. $aeg_sek = $tundi*3600; // Käivitustsükli sekundite arv $time_to_start = array(); // Tegelikult massiiv käivitamisaegadega ignore_user_abort(1); // Ignoreeri ühenduse katkemist brauseriga

Järgmisena kirjutame funktsiooni, mis aitab meil genereerida käivitusaegu.
Selles genereerime juhusliku arvu 0-st kuni sekundite arvuni algses intervallis.
/****** * @desc Loo käivitamiste vaheline intervall. */ funktsioon add_time2start() ( globaalne $time_sec, $time_to_start; $new_time = time()+rand(0, $time_sec); if (!in_array($new_time, $time_to_start)) ( // Kui sellist aega pole massiivi - add $time_to_start = $uus_aeg ) else ( add_time2start(); // Kui selline aeg on juba olemas, genereerige see uuesti. ) )

$k = 1; if ($_SESSION["num_st"] == "" || $_SESSION["num_st"][$num_starts-1]< time()) { // проверка, что в сессию не записаны данные и что эти данные не устарели. do { add_time2start($k); $k++; } while ($k < = $num_starts); sort($time_to_start, SORT_NUMERIC); $_SESSION["num_st"] = $time_to_start; }

Nüüd peame panema skripti jooksma, sõltumata serveri määratud maksimaalsest täitmisajast.
Põhimõte on järgmine:
1) Määrake skripti algusaeg;
2) Määrake täitmisajale kehtestatud piirmäär.
3) Alustame tsüklit, mille jooksul loendame praegust aega ja arvutame skripti kogu tööaja, kontrollime praegust aega algusaegade massiivi väärtustega ja kui on sobivus, täidame määratud toimingud (mul on need failis exec.php). Failide käitamiseks kasutame pistikupesasid.
4) Korrake tsüklit, kuni skripti tööaeg läheneb maksimaalsele lubatud pikkusele. Seadsin kuni maksimumajani on jäänud 5 sekundit.

Niisiis... arvutame esialgsed ajaandmed:

$alguse_aeg = mikroaeg(); // Uurige skripti käivitamise aega $start_array = explode(" ",$start_time); // Eraldage sekundid ja millisekundid $start_time = $start_array; // saada skripti algusaeg $max_exec = ini_get("max_execution_time"); //Hankige skripti maksimaalne võimalik tööaeg
Tegelikult tsükkel. Kommentaarid koodis.

Do( $nowtime = time(); // Praegune aeg //// Kui praegune kellaaeg on massiivis skripti täitmisaegadega...... if (in_array($nowtime, $_SESSION["num_st"]) ) ( // Ühendame sokli toimingute põhisisuga failiga $http = fsockopen("test.ru",80); /// samal ajal edastame sellele seansi andmed ja aja, millal see peaks töötama fputs($http, "GET http://test .ru/exec.php?".session_name()."=".session_id()."&nowtime=$nowtime HTTP/1.0\r\n"); fputs($http, "Host: test.ru\r\ n"); fputs($http, "\r\n") //// sooritas määratud toimingu // Uurige välja; praegune aeg tsükli jätkamiseks või taaskäivitamiseks $now_time = microtime( ,$now_time = $now_time = $now_time =); $now_time - $start_time+$exec_time /// aeglustub sekundiks usleep(1000000) //Skripti peatamine, kui ("stop.txt"); )) exit //Kontrolli tööaega, kui skripti lõpuni on jäänud vähem kui 5 sekundit, lõpetame tsükli . ) while($exec_time< ($max_exec - 5));

Noh, kui lubatud aeg hakkab lõppema, siis lõpetame tsükli ja käivitame sama skripti turvaliselt teistes protsessides (kindlasti hoiame seda 5 sekundi jooksul)

// Käivitage sama skript uue protsessina ja lõpetage praegune $http = fsockopen("test.ru",80); fputs($http, "GET http://test.ru/index.php?".session_name()."=".session_id()."&bu=$max_exec HTTP/1.0\r\n"); fputs($http, "Host: test.ru\r\n"); fputs($http, "\r\n"); fclose($http);

Kui ma kõik kirjutasin, olin hämmingus kasulikust rakendusest... Saate seda teenusena kasutada. See võib võrgus midagi jälgida ja teavitada teid näiteks posti teel. Ja sa ei vaja mingit kroni.

Skripti saab veel optimeerida – ma pole muudatusi teinud.
Muide, siin on see, millest ma end lahti rebida ei suutnud – skripti esmaseks käivitamiseks tuleb ikkagi brauser avada.

Tere päevast, kolleegid! 🙂

Täna otsustasin puudutada sellist teemat nagu PHP skripti täitmise aeg ja selle definitsioon.

Ma ei ütle, et see vajadus tekib iga päev, kuid praktikas tuleb aeg-ajalt ette olukordi, kus on vaja PHP-skripti tööaega saada.

Eriti sageli võite tabada arendajaid seda tegemas koodi ümbertöötamisel ja olemasolevate algoritmide optimeerimisel, kui PHP-skripti täitmise aeg on lõpliku valiku võtmetegur.

Noh, ja mõnikord nõuavad neid numbreid juhid ja kliendid, kes soovivad teada saada, kui palju aega kulub teatud toimingu jaoks koodis.

Seetõttu otsustasin kirjutada selle lühikese märkuse, milles otsustasin visandada sarnases olukorras tegutsemise korra.

Kõigepealt vaatame PHP-skripti täitmisaja määramise algoritmi ennast ja seejärel annan koodi, millega seda rakendatakse.

PHP skripti täitmise aeg – määramisalgoritm

Meie toimingute protseduur on äärmiselt lihtne:

  1. enne skriptis määratud toimingute sooritamist määrake PHP koodis praegune serveriaeg;
  2. pärast skripti käivitamist saame uuesti teada serveri aja;
  3. PHP abil arvutame ajavahe skripti valmimise ja alguse vahel.

Saadud väärtus on PHP skripti täitmise aeg, mida saab edasisel optimeerimisel ja muudel toimingutel arvesse võtta.

PHP skripti tööaeg – algoritmi juurutamine

Praeguse kellaaja kuvamiseks PHP koodis otsustasin kasutada tavalist PHP funktsiooni mikroaeg (), mis tagastab praeguse ajatempli mikrosekunditega Unixi formaadis.

Miks selline täpsus?

Siis, et tabada vähimaidki muutusi skripti täitmise ajas, sest mõnikord võib sekundi murdosa saada saatuslikuks ja põhjustada suuri kaotusi aeglase koodi suures mahus käitamisel.

Noh, pluss, mikrosekundite arvestamine arvutustes mõjutab arvutuste täpsust positiivses suunas.

Oma teoreetiliste lugude demonstreerimiseks kirjutasin lihtsa skripti, mis arvutab tühja tsükli tööaja 30 000 000 iteratsiooniga (selguse huvides otsustasin võtta rohkem):

PHP microtime() funktsioonil on ainult üks parameeter get_as_float, kui väärtused on määratud tõsi saate praeguse PHP aja saada sekundites alates Unixi ajastust mikrosekundi täpsusega.

Kuna mul oli vaja praegust aega, mitte Unixi ajastu algusest saadik sekundite arvu, kasutasin seda parameetrit, mis on minu koodis näha.

Selle tulemusena funktsiooni kasutamine echo(), kuvati ekraanil järgmine teade: Skript täideti 1,3156361579895 sekundiga.

Selle tehnika korrektse toimimise kindlakstegemiseks otsustasin funktsiooni abil määrata skriptile fikseeritud täitmisaja magama (), mis viivitab skripti täitmist määratud sekundite arvu.

Selle tulemusena tagastas järgmine konstruktsioon sõnumi Skript täideti 2,0000510215759 sekundiga:

Määratud viivituse ületamist mikroskoopiliste sekundite murdosade võrra võib seostada koodistruktuuride kutsumise ja nende täitmise tulemuste töötlemisega serveri riistvara poolt, nii et saate nende suhtes täielikult silmad kinni pigistada.

Kui need teid või teie klienti ikka veel ärritavad, võite kasutada häkkimist banaalse sajandiku- või tuhandikuni ümardamise vormis, kasutades PHP funktsiooni round(), kasutades seda järgmiselt:

Round(mikroaeg(tõene) - $algus, 2);

Selle koodilõigu täitmise tulemuseks ülaltoodud näites on 2 sekundit, mis sobib kõige keerukamatele perfektsionistidele :)

Sellega on tänane teave PHP-skripti täitmise aja määramise kohta lõpetatud.

Kirjutage kommentaaridesse oma ülevaated ja esitage projekti avalikel lehtedel sotsiaalvõrgustikes kõik teid huvitavad küsimused.