Ako poznať rýchlosť php skriptu. Čas PHP skriptu

Bez ohľadu na to, koľko používame PHP, niektoré funkcie stále vystupujú, o ktorých sme ani nepočuli. Niektoré z nich by boli pre nás veľmi užitočné. Vytvoril som malý zoznam užitočných funkcií, ktoré by mali byť v arzenáli každého PHP programátora.

1. Vytváranie funkcií s premenlivým počtom argumentov

S najväčšou pravdepodobnosťou už viete, že PHP nám umožňuje vytvárať funkcie s voliteľnými argumentmi. Teraz ukážem funkciu, v ktorej sa počet argumentov môže od prípadu k prípadu líšiť.

Ale najprv si spomeňme, ako vytvárame funkcie obvyklým spôsobom:

  // funkcia s dvomi voliteľnými parametrami funkcia foo ($ arg1 = "", $ arg2 = "") (echo "arg1: $ arg1 \\ n"; echo "arg2: $ arg2 \\ n";) foo "svet"); / * bude výstup: arg1: hello arg2: svet * / foo (); / * bude výstup: arg1: arg2: * /

Teraz sa pozrime na to, ako môžete napísať funkciu s neobmedzeným počtom argumentov. Ak to chcete urobiť, použite metódu func_get_args ():

  // neurčuje argumenty function foo () (// vráti pole argumentov prechádzajúcich $ args = func_get_args (); foreach ($ args ako $ k =\u003e $ v) (echo "arg". : $ v \\ n ";)) foo (); / * nebude výstup nič * / foo ("ahoj"); / * bude tlačiť arg1: hello * / foo ("ahoj", "svet", "znova"); / * bude tlač arg1: hello arg2: svet arg3: znova * /

2. Použite Glob () na vyhľadávanie súborov

Často názvy funkcií hovoria samy za seba. To sa nedá povedať o funkcii glob ().

Bez podrobností sa jeho funkčnosť podobá metóde scandir (). Umožňuje vyhľadanie požadovaného súboru podľa vzoru:

  // nájsť všetky súbory php $ files = glob ("*. php"); print_r ($ súbory); / * bude výstup: Array (=\u003e phptest.php =\u003e pi.php =\u003e post_output.php =\u003e test.php) * /

Ak chcete nájsť súbory viacerých typov, napíšte toto:

  // nájsť všetky súbory php a txt $ files = glob ("*. (php, txt)", GLOB_BRACE); print_r ($ súbory); / * výstup: Array (=\u003e phptest.php =\u003e pi.php =\u003e post_output.php =\u003e test.php =\u003e log.txt =\u003e test.txt) * /

Môžete tiež určiť cestu v šablóne:

  $ súbory = glob ("../ images / a * .jpg"); print_r ($ súbory); / * výstup: Array (=\u003e ../images/apple.jpg =\u003e ../images/art.jpg) * /

Ak chcete získať úplnú cestu k dokumentu, použite metódu realpath ():

$ súbory = glob ("../ images / a * .jpg"); // Použite funkciu "realpath" na každý prvok array $ files = array_map ("realpath", $ files); print_r ($ súbory); / * zobrazuje: Array (=\u003e C: \\ wamp \\ www \\ images \\ apple.jpg =\u003e C: \\ wamp \\ www \\ images \\ art.jpg)

3. Informácie o používanej pamäti

Ak budete sledovať množstvo pamäte, ktoré je zničené prácou vašich skriptov, budete pravdepodobne častejšie ich optimalizovať.

V PHP je výkonný nástroj na sledovanie pamäte. V rôznych častiach skriptu môže byť zaťaženie odlišné. Aby sme získali hodnotu pamäte v súčasnosti, musíme použiť metódu memory_get_usage (). Na stanovenie maximálnej výšky použitej pamäte memory_get_peak_usage ()

Echo "Počiatočné:" .memory_get_usage () "Bajty \\ n"; / * Počiatočná hodnota: 361400 bajtov * / // poskytnúť malé zaťaženie pre ($ i = 0; $ i< 100000; $i++) { $array = md5($i); } // и ещё for ($i = 0; $i < 100000; $i++) { unset($array[$i]); } echo "Final: ".memory_get_usage()." bytes \n"; /* Final: 885912 bytes */ echo "Peak: ".memory_get_peak_usage()." bytes \n"; /* Peak: 13687072 bytes */

4. Informácie o procesore

Ak to chcete urobiť, použite metódu getrusage (). Upozorňujeme však, že táto funkcia nebude fungovať v systéme Windows.

Print_r (getrusage ()); / * Vytlačí Array (=\u003e 0 =\u003e 0 =\u003e 2 =\u003e 3 =\u003e 12692 =\u003e 764 =\u003e 3864 =\u003e 94 =\u003e 0 =\u003e 1 =\u003e 67 =\u003e 4 =\u003e 0 =\u003e 0 =\u003e 0 =\u003e 6269 =\u003e 0) * /

Vyššie uvedený obrázok bude jasný pre tých, ktorí majú skúsenosti s administráciou systému. Pre všetky ostatné ponúkame dekódovanie:

  • ru_oublock: počet blokových zápisových operácií
  • ru_inblock: počet operácií čítania blokov
  • ru_msgsnd: počet odoslaných správ
  • ru_msgrcv: počet prijatých správ
  • ru_maxrss: maximálna veľkosť nestránkovanej množiny
  • ru_ixrss: celková zdieľaná pamäť
  • ru_idrss: celková suma nesdieľaných údajov
  • ru_minflt: počet použitých pamäťových stránok
  • ru_majflt: počet chýbajúcich stránok
  • ru_nsignals: počet prijatých signálov
  • ru_nvcsw: počet kontextových prepínačov podľa procesu
  • ru_nivcsw: počet nútených kontextových prepínačov
  • ru_nswap: počet prístupov na disk pri stránkovaní
  • ru_utime.tv_usec: čas v užívateľskom režime (mikrosekundách)
  • ru_utime.tv_sec: užívateľský režim (sekundy)
  • ru_stime.tv_usec: čas v privilegovanom režime (mikrosekundách)
  • ru_stime.tv_sec: čas v privilegovanom režime (sekundy)

Ak chcete zistiť, aké zdroje váš procesor používa skript, potrebujete hodnotu času používateľa '(čas v užívateľskom režime) a' systémový čas '(čas v privilegovanom režime). Výsledok môžete získať v oboch sekundách a mikrosekundách. Ak chcete zmeniť celkový počet sekúnd na desiatkové číslo, musíte rozdeliť hodnotu mikrosekúnd o 1 milión a pridať ju na druhú hodnotu.

Zmiešané nejako. Tu je príklad:

  // oddych 3 sekundy spánok (3); $ data = getrusage (); echo "Čas používateľa:". ($ data ["en_utime.tv_sec"] + $ dáta ["en_utime.tv_usec"] / 1 000 000); echo "Systémový čas:". ($ data ["ru_stime.tv_sec"] + $ dáta ["ru_stime.tv_usec"] / 1 000 000); / * zobrazuje Čas používateľa: 0.011552 Systémový čas: 0 * /

Hoci skript trval približne 3 sekundy, procesor nebol silne nabitý. Faktom je, že pri volaní (spánku) skript prakticky nevyužíva zdroje procesora. Vo všeobecnosti existuje veľa úloh, ktoré trvajú dlho, ale nepoužívajú procesor. Napríklad čakanie na operácie spojené s diskom. Takže v skriptoch nepoužívate vždy čas CPU.

Tu je ďalší príklad:

  // prejdite 10 miliónovkrát za ($ i = 0; $ i<10000000;$i++) { } $data = getrusage(); echo "User time: ". ($data["ru_utime.tv_sec"] + $data["ru_utime.tv_usec"] / 1000000); echo "System time: ". ($data["ru_stime.tv_sec"] + $data["ru_stime.tv_usec"] / 1000000); /* выводит User time: 1.424592 System time: 0.004204 */

Skript trval 1,4 sekundy času procesora. V tomto prípade je čas pre systémové volania vo všeobecnosti nízky.

Čas prevádzky v privilegovanom režime (systémový čas) je čas, ktorý procesor vynakladá na vykonávanie požiadaviek na systém jadra v mene programu. príklad:

  $ start = microtime (true); // volanie microtime každé 3 sekundy, zatiaľ čo (microtime (true) - $ start< 3) { } $data = getrusage(); echo "User time: ". ($data["ru_utime.tv_sec"] + $data["ru_utime.tv_usec"] / 1000000); echo "System time: ". ($data["ru_stime.tv_sec"] + $data["ru_stime.tv_usec"] / 1000000); /* выводит User time: 1.088171 System time: 1.675315 */

Systémový čas sa teraz vynakladal oveľa viac ako v predchádzajúcom príklade. Všetko vďaka metóde microtime (), ktorá využíva systémové zdroje.

Treba však poznamenať, že zobrazený čas nemusí byť presný, pretože V tomto okamihu sa zdroje CPU používajú v iných programoch, čo môže viesť k malej chybe.

5. Magické konštanty

V PHP je veľa magických konštánt, ako je číslo aktuálnej linky (__LINE__), cesta k súboru (__FILE__), adresárová cesta (__DIR__), názov funkcie (__FUNCTION__), názov triedy (__CLASS__), názov metódy (__METHOD__) (__NAMESPACE__).

Všetci ich nebudeme brať do úvahy. Pozrime sa na pár:

// tento skript závisí od aktuálneho umiestnenia súboru a // môže spôsobiť problémy, ak je použitý z rôznych adresárov require_once ("config / database.php"); // tento skript nespôsobí problémy require_once (dirname (__FILE__). /config/database.php ");

Použite __LINE__ pri ladení skriptov:

  // code // ... my_debug ("nejaká chybová správa", __LINE__); / * bude výstup Riadok 4: nejaká ladiaca správa * / // iný kód // ... my_debug ("iná ladiaca správa", __LINE__); / * vystupuje riadok 11: iná ladiaca správa * / funkcia my_debug ($ msg, $ line) (echo "riadok riadku $: msg msg \\ n";)

6. Vytváranie jedinečných identifikátorov

Sú časy, kedy potrebujete vytvoriť jedinečný reťazec. Mnohokrát som videl, že funkcia md5 () sa používa na vyriešenie tohto problému:

  // generovanie náhodného reťazca echo md5 (time (). mt_rand (1.1000000));

Ale v skutočnosti je pre tento účel v PHP špeciálna funkcia uniqid ()

  // generovať náhodný reťazec echo uniqid (); / * bude tlačiť 4bd67c947233e * / // ešte raz echo uniqid (); / * bude výstup 4bd67c9472340 * /

Voľným okom môžete vidieť, že prvé znaky majú mierne podobné ... To je spôsobené tým, že táto metóda využíva serverový čas na generovanie znakov. Je to dokonca užitočné, pretože všetky generované hodnoty sa získavajú v abecednom poradí, čo umožňuje ich rýchle triedenie.

Aby sme znížili šance na získanie duplikátu, môžeme pridať predponu alebo použiť druhý parameter (zvýšenie počtu znakov):

  // s prefixom echo uniqid ("foo_"); / * vytlačí foo_4bd67d6cd8b8f * / // s druhým parametrom echo uniqid ("", true); / * bude výstup 4bd67d6cd8b926.12135106 * / // ako echo uniqid ("bar _", true); / * bude tlačiť bar_4bd67da367b650.43684647 * /

Táto metóda generuje reťazce menšie ako md5, takže môžete ušetriť miesto.

7. Serializácia

Museli ste niekedy uložiť zložité dáta do databázy alebo do súboru? Na konverziu objektu na reťazec v PHP je poskytnutá špeciálna funkcia.

Všeobecne povedané, tieto metódy sú 2: serialize () a unserialize ()

  // komplexné pole $ myvar = pole ("ahoj", 42, pole (1, "dve"), "apple"); // previesť na reťazec $ string = serialize ($ myvar); echo $ string; / * Zobrazenie: 4: (i: 0; s: 5: "Dobrý deň"; i: 1; i: 42; i: 2; a: 2: (i: 0, I: 1; i: 1, s : 3: "dva";) i: 3; s: 5: "apple";) * / // získame počiatočnú hodnotu $ newvar = unserialize ($ string); print_r ($ newvar); / * zobrazí Array (=\u003e hello =\u003e 42 =\u003e Array (=\u003e 1 =\u003e dva) =\u003e jablko) * /

Takto fungujú tieto funkcie. Avšak vzhľadom na rastúcu popularitu JSON boli do PHP 5.2 pridané 2 metódy PHP json_encode () a json_decode (). Ich práca je podobná serializácii ():

  // komplexné pole $ myvar = pole ("ahoj", 42, pole (1, "dve"), "apple"); // previesť na reťazec $ string = json_encode ($ myvar); echo $ string; / * bude tlačiť ["hello", 42 ,, "apple"] * / // obnoviť pôvodnú hodnotu $ newvar = json_decode ($ string); print_r ($ newvar); / * vytlačí Array (=\u003e hello =\u003e 42 =\u003e Array (=\u003e 1 =\u003e dva) =\u003e jablko) * /

Táto možnosť je kompaktnejšia a kompatibilnejšia s inými jazykmi, ako je napríklad jazyk JavaScript. Pri práci s veľmi hromadnými predmetmi však môže dôjsť k strate dát.

8. Komprimujte linky

Keď hovoríme o kompresii, okamžite prídu do úvahy ZIP archívne súbory. PHP umožňuje skomprimovať dlhé čiary bez súborov.

V nasledujúcom príklade ukážeme fungovanie funkcií gzcompress () a gzuncompress ():

  $ String = "Lorem ipsum dolor sit amet, consectetur adipiscing ELIT. Nunc ut elít id mi ultricies adipiscing. Nulla facilisi. Praesent pulvinaru, Sapien vel feugiat vestibulum, nulla DUI pretium Orci, non ultricies elít Lacus quis ante. Lorem ipsum dolor sit amet , consectetur adipiscing elít. Podeľte pretium ullamcorper urna quis iaculis. Etiam ac Massa sed turpis tempore luctus. Curabitur sed NIBH eu elít mollis rákosníkom. Praesent ipsum priemer, consectetur vitae ornare a, Podeľte nunc. Id magna pellentesque Tellus posuere adipiscing. sed ornare v mollis, ornare v mollis, ornare v mollis, ornare v mollis, moths innos mintis, v leto cone mollis. . "; $ komprimovaný = gzcompress (reťazec $); echo "Pôvodná veľkosť:". strlen ($ reťazec). "\\ n"; / * sa zobrazí veľkosť originálu: 800 * / echo "Komprimovaná veľkosť:". strlen ($ komprimovaný). "\\ n"; / * print Komprimovaná veľkosť: 418 * / // návrat $ original = gzuncompress (komprimovaný $);

Môžeme znížiť množstvo textu o 50%. Na ten istý účel môžete použiť metódy gzencode () a gzdecode (), ktoré používajú odlišný algoritmus kompresie.

9. Spustite pred dokončením

V PHP je funkcia register_shutdown_function (), ktorá vám umožňuje vykonať nejaký kód pred ukončením skriptu.

Predpokladajme, že chcete zistiť niektoré informácie ... Script runtime:

// dostať začiatočný čas $ start_time = microtime (true); // niektoré operácie // ... // vyvodiť odpoveď v priebehu prevádzky. (microtime (true) - $ start_time). "Sekúnd.";

Na prvý pohľad sa to môže zdať ako triviálna úloha. Na tieto účely môžete umiestniť kód na konci súboru. Ak však predtým funguje funkcia exit () niekde, tento kód nikdy nefunguje. Tiež to nebude fungovať, ak sa na stránke vyskytne chyba alebo používateľ preruší načítanie stránky (kliknutím na príslušné tlačidlo v prehliadači);

Ak použijete metódu register_shutdown_function (), kód sa vykoná v každom prípade:

  $ start_time = microtime (true); register_shutdown_function ("my_shutdown"); funkcia my_shutdown () (globálna $ start_time; echo "vykonanie vykonala:". (microtime (true) - $ start_time).

záver

PHP je celá planéta, ktorá nás neprestáva prekvapiť svojim obsahom. Čo si myslíte o týchto funkciách?

10. februára 2012 13 Rubrika :,

Niekedy musíte podrobne venovať pozornosť rýchlosti vykonávania skriptu (alebo časti skriptu), nielen na vaše krátke a vyškolené oči. To je, keď PHP funkcie na meranie rýchlosti sťahovania príde na záchranu. Pravdepodobne ste ich používali a vo všeobecnosti viete, ako to urobiť. Ale len pre prípad, že pre tých, ktorí nevedia, ako to urobiť, ako aj pre sekciu "Dôležité drobnosti", uverejním najjednoduchší kód, ktorý rieši tento problém.

$ start = microtime (true);
// script body
echo "Čas spustenia skriptu:" (microtime (true) - $ start).

Všetko je blázon. V prvom riadku vytvoríme premennú s časom začiatku. Je to dosiahnuté funkciou microtime  s prenesenou pravou - to vám umožní získať počet sekúnd s veľkým počtom desatinných miest. Čas, mimochodom, vo formáte Unix.

Nasleduje celý kód skriptu, po ktorom v treťom riadku odčítame od aktuálneho času začiatok skriptu a voila - máte čas na vykonanie php skriptu s presnosťou desatinnej čiarky.


Ako dlho "ťažké" skripty pokračujú v práci, ak nečakajú na ukončenie svojej práce na zatvorení prehliadača? A budú pokračovať v práci? Ako ukázali pozorovania, pokračujú v živej snahe robiť prácu, ktorá im bola pridelená. Mnohí, ktorí ovládajú tento druh "temného" života skriptov, využívajú typové pokyny

ignore_user_abort (režim booleov)

Ak je tento príkaz volaný s nepravdivý je ekvivalentná jeho absencii. Zvyčajne je to špecifikované parametrom pravdivý - ignore_user_abort (true), Toto je potrebné v prípadoch, keď musíte pokračovať v skripte, a to aj v prípade, že prehliadač zruší pripojenie. Všeobecne platí, že php má možnosť sledovať stav pripojenia. Mala som záujem o situáciu s pokračovaním skriptu aj po zatvorení okna prehliadača. Je veľmi jednoduché skontrolovať: napíšte skript, ktorý beží na chvíľu, spustite ho a zatvorte okno prehliadača skôr, ako skript skončí, nezabudnite pridať značku vypnutia do skriptu, napríklad vytvoriť súbor. Takže môžete sledovať výkon skriptu. Všeobecne platí, že po zatvorení relácie agenta (prehliadača) by skript mal zomrieť, ale ako vidíte, nie je to tak celkom: stále sa snaží žiť dlhšie. V tomto prípade má zmysel preniesť ho na pozadí (cron). Ale bolo ešte zaujímavé analyzovať túto vlastnosť. Táto inštrukcia sa používa na sledovanie stavu pripojenia. connection_status (), Pre ďalšie manipulácie boli obaly napísané:

// návratový kód stavu pripojenia
funkcia getConnectStatus () (
  návrat connection_status ();
}

// vrátiť typ stavu pripojenia podľa kódu
funkcia getConnectStatusByCode ($ connectionStatus) (
  prepínač ($ connectionStatus) (
  puzdro CONNECTION_NORMAL:
  $ status = "Normálna";
  break;
  puzdro CONNECTION_ABORTED:
  $ status = "Ukončenie používateľa";
  break;
  puzdro CONNECTION_TIMEOUT:

  $ status = "Prekročenie max. doby vykonania";
  break;
  prípad (CONNECTION_ABORTED & CONNECTION_TIMEOUT):
  $ status = "Prerušený a vypršaný čas";
  break;
  default:
  $ status = "Neznáme";
  break;
}
  vrátiť stav $;
}



}

Teraz môžete napísať funkciu, ktorá bude simulovať každú dlhú prácu

// imitácia dlhého skriptu
funkcia scriptImitation () (

  $ start = čas ();

  $ limitIteration = 1 000 000;
  pre ($ i = 0; checkConnectionStatus () && ($ i< $limitIteration); $i++) {
  // nejaká dlhá práca ...
}

  $ end = čas ();
  $ runtime = $ end - $ start;

Ak ($ i === $ limitIteration ||! CheckConnectionStatus ()) (
  $ connectStatus = getConnectStatusByCode (getConnectStatus ());
  $ scriptImitationLog = "Stav pripojenia: $ connectStatus";
  $ scriptImitationLog. = ";";
  $ scriptImitationLog. = "Iterácia: $ i";
  $ scriptImitationLog. = ";";
  $ scriptImitationLog. = "Spustiť čas: $ runTime druhý";

File_put_contents ("scriptImitationLog.txt", $ scriptImitationLog);
}

V skutočnosti pravidelne začíname s ukončením práce nášho scenára. Bez ohľadu na to, ako rýchlo som sa snažil zatvoriť okno agenta, skript stále úspešne pracoval a na výstupe bol vytvorený protokol. Nezabudnite na to direktívy max_execution_time, scenár určite nebude žiť dlhšie ako tento čas. V našom prípade to bolo zvýšené. Pozrime sa na protokol:

Stav pripojenia: Normálny; Iterácia: 1 000 000; Čas chodu: 5 sekúnd

Ako vidíte, spojenie je normálne, cyklus funguje až do konca. Takže čo je dohoda? V tomto článku stackoverflow  Toto riešenie som našiel tu - http://stackoverflow.com/questions/2389035/php-connection-status. A to bolo spojené s výstupnou vyrovnávaciu pamäť: periodicky je do výstupnej vyrovnávacej pamäte skriptu zapísaná malá časť dát (napríklad prázdny znak) a potom sa resetuje (zvyčajne php znamená vynútiť odoslanie a vymazanie celého obsahu). Na tento účel sa navrhuje používať zdieľanie funkcií. ob_flush  a prúd, A keďže pre resetovanie je implicitné spojenie (napokon sa vytvorí buffer, ktorý sa posiela v smere prehliadača - iniciátora), potom pri ďalšom resete, ak nie je normálne pripojenie, jeho stav sa prenesie do iného stavu ( Používateľ bol zrušený). A ak v skripte nie je žiadna inštrukcia alebo je uvedená vo formulári

ignore_user_abort (nesprávne);

Potom, keď sa normálny stav pripojenia zmení, skript okamžite prestane bežať, ak existuje inštrukcia

ignore_user_abort (pravda);

Aj keď sa stav pripojenia zmení, skript bude pokračovať až do konca, ale v tomto prípade môže byť monitorovaný stav pripojenia. Vzhľadom na to trochu upravíme jednu z obalov.

// skontrolujte stav pripojenia (true - normal, false - abnormal)
funkcia checkConnectionStatus () (
  vytlačiť "";
  ob_flush ();
  flush ();
  návrat connection_status () === 0;
}

Teraz je všetko pod kontrolou a v prípadoch, keď zatvoríme náš prehliadač, bude skript pozastavený alebo bude možné usporiadať iné správanie.
  Na záver dám výsledky ďalšieho pozorovania. Ak porovnáte dobu chodu skriptu s protokolmi pred vykonaním zmien a neskôr v obálke - checkConnectionStatus,
  možno vyvodiť záver, že resetovanie vyrovnávacej pamäte výstupu trvá dlho. Takže čas na jednu iteráciu v testovacom skripte bez vynulovania vyrovnávacej pamäte sa v priemere - 0,005 ms, s resetom - 0,028 mstzn 0,023 msže v 4,6 krát za čas jednej iterácie. To ukazuje, že vyššie uvedený spôsob sledovania životnosti práce "ťažkých" skriptov môže zvýšiť hlavný čas. Tento test bol vykonaný vo verzii Firefox verzia 29.0.1. Všetok úspech.

Mne ma zmocnil, aby som napísal démona v PHP. tj skript, ktorý bude niekoľkokrát zadaný v danom počte hodín v náhodnom čase (vždy náhodný) na vykonanie určitých akcií a to všetko bez použitia cron "a.

Nikdy som sa neobťažoval predtým, ale po nastavení tejto úlohy som začal myslieť, že je nesprávne, že php skript by mal byť volaný prehliadačom ... no, úloha je nastavená, musí to byť hotovo.

Prvá myšlienka je zakázanie časového limitu spustenia skriptu. Zakázané hosťovanie.

Druhou myšlienkou je pravidelne opakovať žiadosť Ajax (áno, aspoň raz za sekundu). - nie je možné (požiadavka zákazníka).

V skutočnosti sa ukázalo, že prehliadač by nemal byť otvorený a cron nemôže byť použitý a skript by mal fungovať nezávisle od používateľa na neurčito. Prirodzene by mal systém aspoň prepravovať.

  1. balenie cigariet, noci, google, doky, knihy, manuály ....
  goto 1 ...

Na výstupe sa dostanem:
  Zadacha_1:
  Implementujte generátor času na vykonanie skriptu na základe zadaného počtu a počtu hodín. Udržujte niekde v týchto časoch.

Zadacha_2:
  Práca po zatvorení prehliadača

Zadacha_3:
  Po skončení časového limitu scenára nehádajte

Zadacha_4:
  Vykonajte nejaké akcie v správny čas.

Takže ...
  Pôvodné údaje píšeme v konfigurácii:

Session_start (); // Začnite reláciu $ num_starts = 120; // Počet skriptov sa spustí za časové obdobie $ hours = 1; // Počet hodín, počas ktorých musíte spustiť skript $ num_starts times. $ time_sec = $ hodiny * 3600; // Počet sekúnd v spúšťacej slučke $ time_to_start = array (); // Vlastne pole s počiatočným časom ignore_user_abort (1); // Ignorovať prerušenie prehliadača

Ďalej napíšte funkciu, ktorá nám pomôže vytvoriť časy spustenia.
  V ňom vygenerujeme náhodné číslo od 0 do počtu sekúnd v pôvodnom intervale.
  / ****** * @desc Vytvorte interval medzi spustením. * / Funkcia add_time2start () (globálne $ time_sec, $ time_to_start; $ new_time = čas () + rand (0, $ time_sec);! Li (in_array ($ new_time, $ time_to_start)) (// Ak táto doba nie je v poli - pridať $ time_to_start = $ new_time;) else (add_time2start (); // Ak už máte takýto čas, vygenerujte to znova.))

  $ k = 1; ak ($ ​​_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 potrebujeme, aby skript fungoval a nevenoval pozornosť maximálnemu času vykonanému serverom.
  Zásada je:
  1) Určiť čas začiatku skriptu;
  2) Stanovíme stanovený limit pre čas vykonania.
  3) Začnime cyklus, v ktorom spočítame aktuálny čas a vypočítame celkový čas skriptu, skontrolujte aktuálny čas s hodnotami v poli začiatočného času a ak existuje zhoda, vykonajte zadané akcie (mám ich v súbore exec.php). Ak chcete spustiť súbory, použite zásuvky.
  4) Opakujte cyklus, kým sa skrátená doba skriptu blíži povolenému maximu. Nastavil som - maximálny čas je 5 sekúnd.

Takže ... považujeme pôvodné údaje za čas:

  $ start_time = microtime (); // Zistite čas spustenia skriptu $ start_array = explode ("", $ start_time); // Oddelené sekundy a milisekundy $ start_time = $ start_array; // dostať začiatočný čas skriptu $ max_exec = ini_get ("max_execution_time"); // Získajte maximálnu možnú dobu prevádzky skriptu
  Vlastne, cyklus. Komentáre v kóde.

Do ($ nowtime = time (); // Current time //// Ak je aktuálny čas v poli s časy vykonávania skriptu ...... if (in_array ($ nowtime, $ _SESSION ["num_st"]))) // So soketom, ktorý držíme súboru s hlavným obsahom akcií $ http = fsockopen ("test.ru", 80); /// súčasne odovzdáme dáta relácie a čas, kedy by mal spustiť fputs ($ http, "GET http: // test ($ http, "Hostiteľ: test.ru \\ r \\" \\ n "") ); $ now_array = exploduje ("", $ now_time); $ now_time = $ now_array; // vy čítať od aktuálneho času, počiatočná počiatočná $ exec_time = $ now_time - $ start_time + $ exec_time; /// brzda pre druhý usleep (1000000); // Zastaviť skript bežiaci na pozadí.Nemyslel som na žiadny iný spôsob, ak (file_exists ("stop .txt ")) skončiť; // Skontrolovať čas spustenia, ak zostane menej ako 5 sekúnd, až do konca skriptu, ukončíte slučku. ) zatiaľ čo ($ exec_time< ($max_exec - 5));

No, ak skončí čas, skončíme cyklus a bezpečne spustime ten istý scenár iným procesom (za 5 sekúnd budeme len držať)

// Spustite ten istý skript s novým procesom a opustite aktuálny $ http = fsockopen ("test.ru", 80); fputs ($ http, "GET http://test.ru/index.php?" .session_name (). fputs ($ http, "Hostiteľ: test.ru \\ r \\ n"); fputs ($ http, "\\ r \\ n"); fclose ($ http);

Keď som pridal všetko, bol som zmätený o užitočnú aplikáciu ... Môžete ju použiť ako službu. On môže niečo sledovať v sieti a upozorniť vás, napríklad poštou. A nepotrebujú žiadne crony.

Skript môže byť stále optimalizovaný - na revízii to nefungovalo.
  Mimochodom, to je to, čo som nemohol odtrhnúť od seba - prehliadač bude ešte potrebné otvoriť, aby spočiatku spustil skript.

Pozdravte vás, drahí čitatelia blogu webcodius! Takže, okamžite k bodu. Ot notot not notot nototot notot notot not notototototky not τηotkyotkyotkykykyototot τηot τη not not meranie času vykonávania skriptu? Pri práci na ladenie webových projektov, dôležitým faktorom, ktorý by sa mal vziať do úvahy je čas realizácie skriptov. Tento parameter je potrebný na pochopenie toho, ako rýchlo a efektívne funguje tento alebo ten kus kódu. Po určení času stráveného serverom pri vykonávaní php skriptu môžete zistiť, či je alebo nie je potrebná optimalizácia kódu. Ďalej zvážte, ako to urobiť.

Ak chcete analyzovať výkonnosť skriptov php, existujú rôzne rozšírenia a knižnice, ako napríklad XDebug, ktoré môžu ladiť skripty a profilovať ich pomocou runtime. Aby ste však mohli používať takéto rozšírenia, potrebujete čas ich inštalovať a konfigurovať. Samozrejme, optimalizovať prácu veľkých projektov so sólovou architektúrou, veľkým počtom skriptov a miliónmi riadkov kódu je lepšie používať takéto rozšírenia. Ale ak potrebujete optimalizovať 3-4 skripty s jednou alebo dvoma stovkami riadkov kódu, potom môžete použiť nástroje php na meranie času spustenia skriptu.

Ako určiť čas vykonania skriptu v php

Naučte sa vytvárať profesionálne motory v PHP a MySQL

Táto úloha sa dá ľahko vyriešiť pomocou funkcií pre prácu s dátumom a časom, a to vstavanou funkciou microtime (), ktorá vráti počet sekúnd od polnoci dňa 01.1.1970. Zavolaním tejto funkcie dvakrát môžeme vypočítať uplynutý čas medzi hovormi:

Ak spustíte skript, výsledkom bude niečo podobné:

Čas spustenia skriptu: 0.00059400000000001

Stručne povedané, ako to funguje. Pomocou funkcie microtime (true) zapamätáme čas začiatku skriptu v $ start premennej. Ďalej je pracovný kód, ktorý vykonáva určité činnosti. V tomto príklade sa jednoducho nazýva funkcia usleep (), ktorá spomaľuje skript na zadaný počet mikrosekúnd. Potom získame konečný čas skriptu, uložíme ho do koncovej premennej $ a vypočítame čas vykonania kódu odčítaním $ start od $ end. Ako výsledok, dostal runtime skript.

Teraz vedieť, ako definovať php skriptovací čas, môžete začať optimalizovať rôzne bloky kódu. Veľa šťastia a uvidíme sa v nasledujúcich príspevkoch!

Pokračovanie v téme:
Smart TV

Analogová televízia je kľúčovou etapou v oblasti vedy, pokroku a technológií. Predchádzajúce objavy umožnili ľudstvu vedieť o všetkých dôležitých udalostiach. Vynález televíznych ...