Rýchlosť php skriptu. Ako merať čas chodu skriptu v php a na čo slúži? Čas a miesto vykonania skriptu

  • 03.11.2019

Spustenie skriptu je dôležité pre účely určenia času vytvorenia stránky alebo jej prvku, pre vytvorenie bezpečného a spoľahlivého kódu pre stránku ako celok.

Pre tento cieľ existujú tri zásadne odlišné možnosti: čas na vytvorenie celej stránky, čas na aktualizáciu prvku stránky a čas vykonania nie je ničím obmedzený, vrátane toho, že reláciu ukončí návštevník.

Čas vykonávania skriptu

V PHP je čas vykonania skriptu určený rovnako ľahko ako v prvých programovacích jazykoch. Určením časových pečiatok na začiatku a na konci skúmaného kódu, výpočtom rozdielu medzi týmito hodnotami, môžete presne určiť, ako dlho trvalo vykonanie všetkých syntaktických konštrukcií, ktoré sú medzi koncovým a štartovacím štítkom.

Jednoduchý skript: príklad určenia času vykonania cyklu.

PHP poskytuje vývojárovi dve funkcie, mikročas () a čas (), ktoré možno použiť na generovanie časových pečiatok. Určením týchto štítkov pred začiatkom skúmaného kódu a po jeho dokončení môžete vypočítať rozdiel, to znamená získať skutočný čas, ktorý bol vynaložený na vykonanie kódu.

Funkcie mikročasu () a času ().

V tomto príklade slučka používa iný počet iterácií: 567 alebo 56789. V prvom prípade slučka beží rýchlejšie, v druhom - desaťkrát pomalšie.

Funkciu microtime () je možné použiť bez parametrov a jej výsledkom potom bude reťazec znakov dvoch čísel oddelených medzerou. Prvé číslo je počet mikrosekúnd, druhé číslo je počet sekúnd, ktoré uplynuli od dátumu, ktorý sa považuje za začiatok éry Unixu.

Ak sa funkcia microtime (true) volá s parametrom a jeho hodnota je pravdivá, výsledkom bude číslo – ako súčet počtu sekúnd a mikrosekúnd. Použitie funkcie bez parametrov je ekvivalentné volaniu: microtime (false).

Funkcia time () nepracuje s mikrosekundami, takže poskytuje nulový čas vykonania pri menšom počte opakovaní.

Praktický význam runtime

PHP je rýchly, moderný a na funkcie bohatý jazyk. Vo väčšine prípadov v PHP ani nemá zmysel určovať čas vykonania skriptu. Vytváranie stránok však možno vykonať na základe údajov prijatých z databázy. V tomto prípade môžu byť okrem oneskorenia pri výbere informácií aj časové výdavky na doručovanie údajov, zohľadnenie zaťaženia servera a iných okolností.

Moderné internetové programovanie je často nútené počítať s požiadavkami na distribuované spracovanie informácií, s potrebou zbierať dáta z rôznych zdrojov na webe online. V týchto a podobných prípadoch hrá odhad času vykonávania skriptu strategickú úlohu a môže mať značný praktický význam.

Najmä pri vývoji vyhľadávacieho nástroja môže byť potrebné systematicky kontrolovať rozsah konkrétnych zdrojov v sieti, či sa v nich počas určitého časového obdobia nevykonajú zmeny. Ale nejaký zdroj môže byť:

  • nie je k dispozícií;
  • zablokované;
  • byť pod údržbou.

V týchto prípadoch skript buď zamrzne, alebo bude čakať neprimerane dlho na udalosť, ktorú potrebuje.

Nastavením presného času na vykonanie skriptu, napr. 10 sek., 1 min. alebo 5 minút, môžete poskytnúť svoj vlastný zdroj s prísnym dodržiavaním pravidiel pre spracovanie všetkých vzdialených zdrojov, ktoré potrebuje na riešenie svojich úloh.

Čas a miesto vykonania skriptu

PHP je jazyk na strane servera, ale to nie vždy znamená, že v PHP je čas vykonávania skriptu určený výlučne rýchlosťou servera. Serverové spracovanie vyžaduje iba obmedzený počet úloh. Prístup k databáze alebo zdroju na webe zo skriptu presahuje kompetencie servera a dodatočný čas, ktorý strávi čakaním na vytvorenie potrebného spojenia a získanie potrebných údajov.

PHP skript je možné spustiť pomocou technológie AJAX, teda po kliknutí návštevníka stránky na prvok stránky. Ide o bežnú prax, keď sa stránka neaktualizuje ako celok, ale iba jej jednotlivý prvok. Spravidla môže byť takéto rozhodnutie spojené s výberom požadovaných údajov. Akékoľvek oneskorenie vykonania je tu pre návštevníka kritické. Ak čas prekročí jeho očakávania, jednoducho prejde k rýchlejšiemu a pohodlnejšiemu zdroju.

Vývojár vie odhadnúť, ako dlho požadovaný proces trvá, a ak v PHP začne čas vykonávania skriptu prekračovať akceptovateľné hranice, môže návštevníkovi namiesto odpovede poslať adekvátnu správu. To výrazne zlepšuje kvalitu zdroja a je to dobré riešenie.

Ak vyvíjate veľký projekt, spracovanie niektorých údajov môže trvať veľa času. Rôzne hostingové služby majú svoje limity pre takéto akcie a ak vás sem priviedla potreba zvýšiť tento čas, podrobne vám poviem, ako to môžete urobiť.

Aby ste pochopili, čo je v stávke, uvediem malý príklad. Ak prekročíte nastavený časový rámec, môže sa zobraziť nasledujúci druh chyby:

Závažná chyba: V pandoge_com.php na riadku 19 bol prekročený maximálny čas vykonania 30 sekúnd

Poviem vám o 4 spôsoboch, ako sa toho zbaviť.

Ale stojí za to začať s tým, že v každom jednotlivom prípade nemusia všetky vyššie uvedené metódy fungovať, pretože niektorí poskytovatelia hostingu sami zakazujú zmenu tohto parametra.

Zvýšte čas vykonávania skriptu PHP pomocou konfiguračného súboru php.ini

Ako prvý spôsob, ako zvýšiť čas vykonávania skriptu, použijeme konfiguračný súbor php.ini.

Ak chcete presne zistiť, kde sa tento súbor nachádza, prečítajte si.

Otvorte ho spôsobom, ktorý vám vyhovuje, a vložte ho úplne dole:

Max_execution_time = 300;

Kde " 300 „Znamená 300 sekúnd (zmena na vaše). Bohužiaľ, tento súbor nie je k dispozícii na úpravu vo všetkých hostingových službách.

Zvýšenie času vykonávania skriptu PHP pomocou vstavanej funkcie „ini_set“

Druhý spôsob je založený na použití funkcie " ini_set". Vložíte ho priamo do samotného súboru skriptu, najlepšie úplne hore. Príklad:

Tu je hodnota" 300 »Za pár sekúnd sa tiež zmeníte na požadovaný. Poznámkaže pri používaní PHP v núdzovom režime nebude táto funkcia dostupná.

Zvýšenie času vykonávania skriptu PHP pomocou vstavanej funkcie "set_time_limit"

Tretím spôsobom, pravdepodobne jedným z najpopulárnejších, je použitie „ set_time_limit„Zmeniť čas vykonania skriptu. Používa sa aj priamo v samotnom súbore PHP. Príklad:

Tu " 300 »Zmeníte tiež na požadovanú hodnotu. Je žiaduce vložiť kód úplne hore.

Zvýšte čas vykonávania skriptu PHP pomocou súboru .htaccess

Poslednou možnosťou je úprava súboru .htaccess, ktorý sa nachádza v koreňovom adresári vášho webu (ak tam žiadny neexistuje, vytvorte ho).

Úplne hore do tohto súboru prilepte:

Php_value max_execution_time 300

význam " 300 »Aj ty sa meníš na svoje.

Poznámkaže vo všetkých prípadoch je čas vykonania skriptu uvedený v sekundách. Okrem toho môže hodnota parametra vo všetkých metódach trvať „ 0 “, Čo znamená neobmedzený čas vykonania.

Ako viete, ako dlho trvá spustenie skriptu PHP?

Potom, čo ste sa pokúsili zmeniť čas vykonávania skriptu jedným zo spôsobov, musíte zistiť, či ste naozaj uspeli.

Ak to chcete urobiť, vytvorte súbor PHP v koreňovom adresári vašej stránky, kde vypíše hodnotu nastaveného času:

Ak sa čas rovná tomu, čo ste uviedli - gratulujeme, dosiahli ste požadovaný cieľ. V opačnom prípade si prečítajte článok ešte raz, napíšte do komentárov svoj problém alebo ho nasmerujte na svojho poskytovateľa hostingu.


Niekedy potrebujete zistiť čas vykonania skriptu. A to sa dá urobiť pomocou vstavaného jazyka PHP funkcie.

Môžu byť poskytnuté rôzne možnosti. Prečo by niekto chcel vedieť čas potrebný na vykonanie kódu.
Môže to byť ako osobný záujem o testovanie rýchlosti vykonávania funkcií iných ľudí, knižníc, tried atď.
Tak je to aj pri vývoji vašich skriptov a meraní rýchlosti vykonávania s cieľom ďalšieho zlepšovania.
Predstavme si, že ste vyvinuli nejakú funkciu, ktorá sa nejaký čas vykonáva a nie ste spokojní s rýchlosťou jej práce.
A vy to postupne vylepšujete. Nie je ale úplne jasné, či tieto vylepšenia prinášajú nejaký prínos v rýchlosti vykonávania alebo nie.
Ak to chcete urobiť, môžete merať rýchlosť jeho vykonávania.

Možnosť jedna(Nie je to úplne presné, ale poslúži ako príklad):
Môžete použiť vstavaný jazyk PHP trieda Dátum Čas za poskytnutie dátumu a času (podporované začalo od PHP 5 až po aktuálnu verziu PHP7).
Hneď urobím výhradu, že v rámci tohto príkladu bude funkcia použitá na meranie rýchlosti spať (), čo oneskorí spustenie programu o zadaný počet mikrosekúnd. Môžete skontrolovať svoj kód, ktorý je potrebné skontrolovať na rýchlosť.

Takže Najprv si označme bod, od ktorého je potrebné začať s časom:

$ startTime = new DateTime ("teraz");
Vytvorte inštanciu triedy Dátum Čas s parametrom "teraz" aby ste získali aktuálny čas.
Potom musíte umiestniť telo skriptu pod test (napríklad toto je funkcia usleep).

$ endTime = new DateTime ("teraz");
A dostaneme rozdiel medzi začiatkom a koncom vykonávania skriptu:
$ interval = $ startTime-> diff ($ endTime);
A zobrazte výsledok ako počet sekúnd a milisekúnd:
echo $ interval-> formát ("% S sekúnd,% f mikrosekúnd");

Ak chcete získať podrobnejší a úplnejší výsledok, môžete pred uvedením roku vykonať úplný výtlačok výsledku v tele.
$ interval-> formát ("% Y rokov,% M mesiacov,% D dní,% H hodín,% I minút,% S sekúnd,% f mikrosekúnd" ");


V dôsledku toho by sme mali dostať čas, za ktorý sa bude skript vykonávať.

Rýchlosť vykonávania skriptu pre mňa:
01 sekúnd, 441 mikrosekúnd

Celý kód pre tento príklad:
$ startTime = new DateTime ("teraz"); spánok (1 000 000); $ endTime = new DateTime ("teraz"); $ interval = $ startTime-> diff ($ endTime); echo ($ interval-> formát ("% S sekúnd,% f mikrosekúnd"));

Možnosť dva:
Využite výhody vstavanej funkcie microtime (), ktorá je v čase písania tohto článku podporovaná od PHP4 po aktuálnu verziu PHP7.

Funkcia Microtime () vracia aktuálnu časovú pečiatku Unix v mikrosekundách. Táto funkcia je dostupná len v operačných systémoch, ktoré majú systémové volanie gettimeofday ().


Vytvorte premennú, ktorá načasuje čas začiatku kontroly:
$ začiatok = mikročas (pravda);
Podľa parametra funkcie mikročas prevod pravda s cieľom získať výsledok v reálnej podobe plavák predstavujúci aktuálny čas v sekundách od začiatku epochy Unix s presnosťou na mikrosekundy.
Potom umiestnime telo skriptu pod test (napríklad toto je funkcia usleep).
spánok (1 000 000); // Funkcia, ktorá oneskoruje spustenie programu o 1 000 000 mikrosekúnd
Teraz dostaneme čas ukončenia skriptu:
$ koniec = mikročas (pravda);
Nájdenie rozdielu medzi začiatkom a koncom skriptu:
$ diff = $ koniec - $ začiatok;
A zobrazte výsledok:
echo "Čas vykonania skriptu:". ($ diff). "s.";

Môj skript bežal pre:
Čas vykonania skriptu: 1,0004560947418 sek.

Celý kód pre tento príklad:
$ začiatok = mikročas (pravda); spánok (1 000 000); $ koniec = mikročas (pravda); $ diff = $ koniec - $ začiatok; echo "Čas vykonania skriptu:". ($ diff). "s.";

Neviem, ktorá možnosť funguje presnejšie, ale predpokladám, že možnosť pomocou funkcie mikročas () by malo byť presnejšie, pretože vo vyššie uvedenej prvej verzii je potrebné vytvoriť inštanciu triedy DateTime ("teraz") treba venovať viac času.

15. novembra 2011 o 06:52 hod

Spustenie PHP skriptu na pozadí bez crontab

  • Vývoj webových stránok

Zmiatli ma tu, aby som napísal démona v PHP. Tie. skript, ktorý vykoná určité akcie pre daný počet krát za daný počet hodín v náhodnom čase (vždy náhodne), a to všetko bez použitia cronu „a.

Predtým som sa nikdy neobťažoval, ale potom po nastavení úlohy som si začal myslieť, že to nie je možné, že php skript by mal volať prehliadač ... no úloha je nastavená, musí sa vykonať.

Moja prvá myšlienka je vypnúť časový limit vykonávania skriptu. Zakázané hostiteľom.

Druhou myšlienkou je periodicky opakovať požiadavku ajax pomocou javascriptu (áno, aspoň raz za sekundu). - je to nemožné (požiadavka zákazníka).

V skutočnosti sa ukázalo, že prehliadač by nemal byť otvorený a koruna by sa nemala používať a skript by mal fungovať nezávisle od používateľa na dobu neurčitú. Prirodzene by to malo zaťažovať systém minimálne.

1. Balíček cigariet, noc, google, doky, knihy, manuály….
dostanem 1...

Na výstupe dostanem:
Task_1:
Implementujte generátor časov vykonávania skriptov na základe zadaného počtu krát a počtu hodín. Tieto časy si niekde uložte.

Task_2:
Pracujte po zatvorení prehliadača

Task_3:
Po uplynutí časového limitu spustenia skriptu nezlyhajte

Task_4:
Vykonajte niektoré akcie v správnom čase.

Takže…
Počiatočné údaje zapíšeme do konfigurácie:

Session_start (); // Spustenie relácie $ num_starts = 120; // Počet spustení skriptu za určité časové obdobie $ hours = 1; // Počet hodín na spustenie skriptu $ num_starts times. $ time_sec = $ hodín * 3600; // Počet sekúnd v počiatočnej slučke $ time_to_start = array (); // V skutočnosti pole s časmi začiatku ignore_user_abort (1); // Ignorovať odpojené pripojenie prehliadača

Ďalej napíšeme funkciu, ktorá nám pomôže vygenerovať časy spustenia.
V ňom vygenerujeme náhodné číslo od 0 do počtu sekúnd v pôvodnom intervale.
/ ****** * @desc Vygeneruje interval medzi spustením. * / funkcia add_time2start () (globálne $ time_sec, $ time_to_start; $ new_time = čas () + rand (0, $ time_sec); if (! in_array ($ new_time, $ time_to_start)) (// Ak takýto čas neexistuje v poli - pridajte $ time_to_start = $ new_time;) else (add_time2start (); // Ak takýto čas už existuje, vygenerujeme ho znova.))

$ 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; }

Teraz musíme spustiť skript, aby fungoval bez ohľadu na maximálny čas vykonávania nastavený serverom.
Princíp je nasledovný:
1) Určite čas začiatku skriptu;
2) Určite stanovený limit času vykonania.
3) Spustíme cyklus, v ktorom spočítame aktuálny čas a vypočítame celkový čas behu skriptu, skontrolujeme aktuálny čas s hodnotami v poli časov spustenia a ak existuje zhoda, vykonáme zadané akcie (mám ich v súbore exec.php). Na spúšťanie súborov používame zásuvky.
4) Opakujte cyklus, kým sa doba behu skriptu nepriblíži maximálnej povolenej hodnote. Dal som - až do maximálneho času 5 sekúnd.

Takže ... vypočítame počiatočné údaje podľa času:

$ počiatočný_čas = mikročas (); // Zistite čas začiatku skriptu $ start_array = explode ("", $ start_time); // Oddelené sekundy a milisekúnd $ start_time = $ start_array; // získame čas začiatku skriptu $ max_exec = ini_get ("max_execution_time"); // Získajte maximálny možný čas spustenia skriptu
Vlastne cyklus. Komentáre v kóde.

Do ($ nowtime = time (); // Aktuálny čas //// Ak je aktuálny čas v poli s časmi vykonania skriptu ...... if (in_array ($ nowtime, $ _SESSION ["num_st"] )) ( // Pomocou zásuvky sa držíme súboru s hlavným obsahom akcií $ http = fsockopen ("test.ru", 80); /// súčasne mu odovzdávame údaje relácie a čas kedy by mal spustiť fputs ($ http, "GET http: // test .ru / exec.php? ". session_name ()." = ". session_id ()." & nowtime = $ nowtime HTTP / 1.0 \ r \ n "); fputs ($ http," Hostiteľ: test.ru \ r \ n "); fputs ($ http," \ r \ n "); fclose ($ http);) //// vykonal zadanú akciu / / Zistite aktuálny čas a skontrolujte, či chcete pokračovať v slučke alebo reštartovať $ now_time = microtime ( ); $ now_array = explode ("", $ now_time); $ now_time = $ now_array; // odpočítanie počiatočného počiatočného $ exec_time = $ now_time - $ start_time + $ exec_time; /// spomalenie na druhý spánok (1 000 000); // Zastavenie skriptu bežiaceho na pozadí. Na iný spôsob som neprišiel. If (file_exists ("stop.txt") ) exit; // Pr Skontrolujeme čas chodu, ak do konca skriptu zostáva menej ako 5 sekúnd //, cyklus ukončíme. ) while ($ exec_time< ($max_exec - 5));

No, ak sa povolený čas blíži ku koncu, ukončíme cyklus a bezpečne spustíme rovnaký skript inými procesmi (udržíme len 5 sekúnd)

// Spustite ten istý skript s novým procesom a ukončite aktuálny $ 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, "Hostiteľ: test.ru \ r \ n"); fputs ($ http, "\ r \ n"); fclose ($ http);

Keď som všetko dopísal, bol som zmätený jeho užitočnou aplikáciou ... Môžete ho použiť ako službu. Môže sledovať niečo na sieti a upozorniť vás napríklad poštou. A nepotrebujete žiadne cron s.

Skript je stále možné optimalizovať – neprešiel revíziou.
Mimochodom, od toho som sa nemohol odtrhnúť - na spustenie skriptu je stále potrebné otvoriť prehliadač.