Úskalia vo foreach ($items ako &$item). Úskalia vo foreach($items as &$item) Final item php

  • 03.11.2019

Mnoho fatálnych a obnoviteľných fatálnych chýb bolo prevedených na výnimky v PHP 7. Tieto chybové výnimky dedia z triedy Error, ktorá sama implementuje Throwable rozhranie (nové základné rozhranie dedia všetky výnimky).

To znamená, že vlastné obslužné nástroje chýb sa už nemusia spúšťať, pretože namiesto nich môžu byť vyvolané výnimky (spôsobujúce nové fatálne chyby pre nezachytené výnimky chýb).

Úplný popis fungovania chýb v PHP 7 možno nájsť na stránke chýb PHP 7. Tento sprievodca migráciou iba vymenúva zmeny, ktoré ovplyvňujú spätnú kompatibilitu.

// Kód z obdobia PHP 5, ktorý sa pokazí.
obsluha funkcie (Výnimka $e ) ( ... )
set_exception_handler("handler");

// Kompatibilné s PHP 5 a 7.
obsluha funkcie ($e ) ( ... )

// Iba PHP 7.
obslužný program funkcie (Throwable $e ) ( ... )
?>

Interní konštruktéri vždy vyvolávajú výnimky pri zlyhaní

Predtým sa niektoré interné triedy vrátili NULOVÝ alebo nepoužiteľný objekt, keď konštruktor zlyhal. Všetky interné triedy teraz v tomto prípade vyhodia výnimku rovnakým spôsobom, ako to už museli urobiť používateľské triedy.

E_STRICT zaznamenáva zmeny závažnosti

Všetky E_STRICT oznámenia boli preklasifikované na iné úrovne. E_STRICT konštanta je zachovaná, takže hovory ako error_reporting(E_ALL|E_STRICT) nespôsobí chybu.

E_STRICT všimnúť si zmeny závažnosti
Situácia Nová úroveň/správanie
Indexovanie podľa zdroja E_NOTICE
Abstraktné statické metódy
"Predefinovanie" konštruktora Upozornenie odstránené, nespustí žiadnu chybu
Nezhoda podpisov počas dedenia E_UPOZORNENIE
Používa sa rovnaká (kompatibilná) vlastnosť v dvoch vlastnostiach Upozornenie odstránené, nespustí žiadnu chybu
Prístup k statickej vlastnosti nestaticky E_NOTICE
Iba premenné by sa mali priraďovať odkazom E_NOTICE
Iba premenné by sa mali odovzdávať odkazom E_NOTICE
Statické volanie nestatických metód E_DEPRECATED

Zmeny v manipulácii s premennými

PHP 7 teraz používa abstraktný strom syntaxe pri analýze zdrojových súborov. To umožnilo mnoho vylepšení jazyka, ktoré boli predtým nemožné kvôli obmedzeniam v analyzátore používanom v predchádzajúcich verziách PHP, ale viedlo to k odstráneniu niekoľkých špeciálnych prípadov z dôvodov konzistencie, čo viedlo k prerušeniam spätnej kompatibility. Tieto prípady sú podrobne opísané v tejto časti.

Zmeny v zaobchádzaní s nepriamymi premennými, vlastnosťami a metódami

Nepriamy prístup k premenným, vlastnostiam a metódam bude teraz hodnotený striktne v poradí zľava doprava, na rozdiel od predchádzajúcej zmesi špeciálnych prípadov. Nižšie uvedená tabuľka ukazuje, ako sa zmenilo poradie hodnotenia.

Staré a nové hodnotenie nepriamych výrazov
výraz Výklad PHP 5 Výklad PHP 7
$$foo["bar"]["baz"] $($foo["bar"]["baz"]) ($$foo)["bar"]["baz"]
$foo->$bar["baz"] $foo->($bar["baz"]) ($foo->$bar)["baz"]
$foo->$bar["baz"]() $foo->($bar["baz"])() ($foo->$bar)["baz"]()
Foo::$bar["baz"]() Foo::($bar["baz"])() (Foo::$bar)["baz"]()

Kód, ktorý používal staré poradie vyhodnocovania sprava doľava, sa musí prepísať, aby sa toto poradie vyhodnocovania explicitne používalo so zloženými zátvorkami (pozri stredný stĺpec vyššie). Vďaka tomu bude kód dopredu kompatibilný s PHP 7.xa spätne kompatibilný s PHP 5.x.

var_dump (1 >> - 1);
?>

Závažná chyba: Nezachytená aritmetická chyba: Posun bitu o záporné číslo v súbore /tmp/test.php:2 Sledovanie zásobníka: #0 (hlavný) v súbore /tmp/test.php na riadku 2

Bitshifty mimo rozsahu

Bitové posuny (v oboch smeroch) za bitovú šírku an celé číslo bude mať vždy za následok 0. Predtým bolo správanie takýchto posunov závislé od architektúry.

Zmeny v delení nulou

Predtým, keď sa 0 používala ako deliteľ pre operátory delenia (/) alebo modulu (%), vydávalo sa E_WARNING a falošné by bolo vrátené. Teraz operátor rozdelenia vráti pohyblivú hodnotu ako +INF, -INF alebo NAN, ako to špecifikuje IEEE 754. Modulový operátor E_WARNING bol odstránený a vyvolá výnimku DivisionByZeroError.

var_dump(3/0);
var_dump(0 / 0);
var_dump(0 % 0 );
?>

Výstup z vyššie uvedeného príkladu v PHP 5:

Upozornenie: Delenie nulou v %s v riadku %d bool(false) Varovanie: Delenie nulou v %s v riadku %d bool(false) Varovanie: Delenie nulou v %s v riadku %d bool(false)

Výstup vyššie uvedeného príkladu v PHP 7:

Upozornenie: Delenie nulou v %s na riadku %d float(INF) Varovanie: Delenie nulou v %s na riadku %d float(NAN) PHP Závažná chyba: Nezachytené DivisionByZeroError: Modulo nulou v %s riadku %d

$str = "0xffff" ;
$int = filter_var ($str , FILTER_VALIDATE_INT , FILTER_FLAG_ALLOW_HEX );
if (false === $int ) (
throw new Exception("Neplatné celé číslo!" );
}
var_dump($int ); // int(65535)
?>

\u( môže spôsobiť chyby

V dôsledku pridania novej syntaxe escape codepoint Unicode , reťazcov obsahujúcich literál \u( nasledovaná neplatnou sekvenciou spôsobí fatálnu chybu. Aby ste tomu zabránili, úvodná spätná lomka by mala byť vynechaná.

Odstránené funkcie

Odstránené smernice INI

xsl.security_prefs

Direktíva xsl.security_prefs bola odstránená. Namiesto toho, XsltProcessor::setSecurityPrefs() mala by byť volaná metóda na riadenie bezpečnostných preferencií na základe jednotlivých procesorov.

Iné spätne nekompatibilné zmeny

Nové objekty nemožno priradiť odkazom

Výsledok Nový príkaz už nemožno priradiť k premennej odkazom:

triedaC()
$c =& nové C ;
?>

Výstup z vyššie uvedeného príkladu v PHP 5:

Zastarané: Priradenie návratovej hodnoty new odkazom je v /tmp/test.php na riadku 3 zastarané

Výstup vyššie uvedeného príkladu v PHP 7:

Chyba analýzy: chyba syntaxe, neočakávané „nové“ (T_NEW) v súbore /tmp/test.php na riadku 3

Neplatné názvy triedy, rozhrania a vlastností

Nasledujúce názvy nemožno použiť na pomenovanie tried, rozhraní alebo vlastností:

  • bool
  • int
  • plavák
  • reťazec
  • NULOVÝ
  • PRAVDA
  • FALSE

Ďalej by sa nemali používať nasledujúce názvy. Aj keď nebudú generovať chybu v PHP 7.0, sú vyhradené pre budúce použitie a mali by sa považovať za zastarané.

  • objekt
  • zmiešané
  • číselné

Značky ASP a skript PHP boli odstránené

Podpora používania značiek ASP a skriptov na oddeľovanie kódu PHP bola odstránená. Ovplyvnené značky sú:

Odstránené značky ASP a skriptov
otvárací štítok Záverečná značka
<% %>
<%= %>

Hovory z nekompatibilného kontextu boli odstránené

Statické volania nestatickej metódy s nekompatibilným kontextom, ktoré boli predtým zastarané v PHP 5.6, budú mať teraz za následok, že volaná metóda bude mať nedefinovaný $toto premennej a vydáva sa varovanie o ukončení podpory.

trieda A (
test verejnej funkcie () ( var_dump($this); )
}

// Poznámka: Nerozširuje A
trieda B (
volanie verejnej funkcieNonStaticMethodOfA() ( A::test(); )
}

(nové B)-> callNonStaticMethodOfA();
?>

Výstup vyššie uvedeného príkladu v PHP 5.6:

Zastarané: Nestatická metóda A::test() by sa nemala volať staticky, za predpokladu, že $this z nekompatibilného kontextu v /tmp/test.php na riadku 8 object(B)#1 (0) ( )

Výstup vyššie uvedeného príkladu v PHP 7:

Zastarané: Nestatická metóda A::test() by sa nemala volať staticky v /tmp/test.php na riadku 8 Upozornenie: Nedefinovaná premenná: toto v /tmp/test.php na riadku 3 NULL

výnos je teraz správny asociatívny operátor

Konštrukt výnosu už nevyžaduje zátvorky a bol zmenený na pravý asociatívny operátor s prioritou medzi nimi vytlačiť a => . Výsledkom môže byť zmenené správanie:

výťažok ozveny - 1;
echo (výťažok) - 1;
// A je teraz interpretované ako
výťažok ozveny (-1);

Výnos $foo or die;
// Predtým bol interpretovaný ako
výnos($foo or die);
// A je teraz interpretované ako
(výnos $foo ) alebo zomrieť;
?>

Zátvorky možno použiť na jednoznačné vymedzenie týchto prípadov.

Funkcie nemôžu mať viacero parametrov s rovnakým názvom

Už nie je možné definovať dva alebo viac funkčných parametrov s rovnakým názvom. Napríklad nasledujúca funkcia spustí E_COMPILE_ERROR:

funkcia foo ($a , $b , $unused , $unused ) (
}
?>

Funkcie kontrolujúce argumenty hlásia prúd hodnota parametra

func_get_arg(), func_get_args(), debug_backtrace() a spätné sledovanie výnimiek už nebude hlásiť pôvodnú hodnotu, ktorá bola odovzdaná parametru, ale namiesto toho poskytne aktuálnu hodnotu (ktorá mohla byť upravená).

funkcia foo ($ x ) (
$ x++;
var_dump(func_get_arg(0));
}
foo(1); ?>

Výstup z vyššie uvedeného príkladu v PHP 5:

Výstup vyššie uvedeného príkladu v PHP 7:

Príkazy Switch nemôžu mať viacero predvolených blokov

V príkaze switch už nie je možné definovať dva alebo viac predvolených blokov. Napríklad nasledujúci príkaz switch spustí príkaz E_COMPILE_ERROR:

vypínač (1 ) {
predvolene:
prestávka;
predvolene:
prestávka;
}
?>

Rozšírenie JSON nahradené rozšírením JSOND

Rozšírenie JSON bolo nahradené rozšírením JSOND, čo spôsobilo tri menšie prerušenia BC. Po prvé, číslo nesmie končiť desatinnou čiarkou (t.j. 34. musí byť zmenené na buď 34.0 alebo 34 ). Po druhé, pri použití vedeckej notácie, e exponent nesmie bezprostredne nasledovať za desatinnou čiarkou (t.j. 3.e3 musí byť zmenené na buď 3,0e3 alebo 3e3). Nakoniec sa prázdny reťazec už nepovažuje za platný JSON.

Porucha vnútornej funkcie pri pretečení

Predtým interné funkcie potichu skracovali čísla, ktoré vznikli z nátlaku typu float-to-integer, keď bol float príliš veľký na to, aby ho bolo možné reprezentovať ako celé číslo. Teraz sa vydá E_WARNING a NULOVÝ budú vrátené.

Opravy návratových hodnôt vlastného obslužného programu relácie

Akékoľvek predikátové funkcie implementované vlastnými obslužnými programami relácie, ktoré vracajú buď FALSE alebo -1 budú fatálne chyby. Ak je akákoľvek hodnota z týchto funkcií iná ako boolovská hodnota, -1 , alebo 0 vráti, potom zlyhá a vydá sa E_WARNING.

Poradie zoradenia rovnakých prvkov

Algoritmus interného triedenia bol vylepšený, čo môže viesť k inému poradiu triedenia prvkov, ktoré sa porovnávajú ako rovnaké, ako predtým.

Nespoliehajte sa na poradie prvkov, ktoré sa porovnávajú ako rovnaké; môže sa kedykoľvek zmeniť.

Nesprávne umiestnené príkazy break a switch

prestávka a ďalej príkazy mimo cyklu resp prepínač riadiace štruktúry sú teraz detekované v čase kompilácie namiesto behu ako predtým a spúšťajú an E_COMPILE_ERROR.

Mnoho ľudí rád píše takéto konštrukcie v tej či onej forme, každý sa stretol:
foreach ($items ako &$item) ( $item += 2; )
Málokto si však uvedomuje nebezpečenstvo, ktoré tu číha.
Zvážte príklad.

Vasya Pupkin vzal pole, prešiel ním a zvýšil všetky prvky o dva:
$items = array("a" => 10, "b" => 20, "c" => 30,); foreach ($items as &$item) ( $item += 2; ) print_r($items);
Pozrel som sa na skládku, videl som, že úloha je vyriešená, a odišiel som spokojný:
Pole([a] => 12[b] => 22[c] => 32)
Po nejakom čase sa Petrovič rozhodol doplniť túto časť kódu o ďalší zoznam a dodal:
$newitems = array("a" => 10, "b" => 20, "c" => 30,); foreach ($newitems ako $key=>$item) ( $newitems[$key] += 5; ) print_r($newitems);
Vyzeral, že jeho úloha je tiež vyriešená a s pocitom úspechu zatvoril súbor:
Pole ([a] => 15 [b] => 25 [c] => 35)
Po nejakom čase sa začali objavovať nevysvetliteľné chyby. prečo?
Urobme var_dump($items) na konci kódu:
array(3) ( ["a"]=> int(12) ["b"]=> int(22) ["c"]=> &int(30) )
tridsať! Vasya Pupkin prisahá, že to skontroloval. Prečo to bolo 32 a po Petrovičovom kóde 30?

Dôvod spočíva v ampersande. Hlási, že na označené údaje odkazuje niekto iný. Pri odchode Vasya za sebou nevymazal dočasnú premennú, ktorú použil na enumeráciu ($item). Premenná bola použitá s povolením na zmenu zdroja ("&"), čo sa tiež nazýva "priradenie odkazom". Bol si istý, že premenná bude použitá iba vo vnútri slučky. Petrovič pomocou premennej s rovnakým názvom v priebehu enumerácie zmenil jej hodnotu a zakaždým sa zmenilo miesto, kde bola táto premenná uložená. A bol uložený na rovnakom mieste ako posledný prvok poľa Pupkin.

Samozrejme, v prípade v článku prehnané. V praxi môžu byť tieto prepojenia veľmi zložité, najmä ak je projekt lacný a zahŕňa neskúsených a rôznorodých webových vývojárov.

Ako to môžete obísť?

  • Po použití zničte dočasné premenné, najmä ak majú nejaké spojenie s používanými údajmi:
    foreach ($items as &$item) $item += 2; unset($item);
  • Buďte opatrní pri premenných, ktoré už niekto použil.
  • Zahrňte svoje akcie do jednotlivých funkcií, metód alebo menných priestorov.
  • Namiesto print_r použite var_dump a dávajte pozor na ampersand. Ak chcete uložiť výpis do súboru namiesto prehliadača, alternatívou k print_r($var,true) by bolo:
    function dump() ( ob_start(); foreach(func_get_args() ako $var) var_dump($var); return ob_get_clean(); )
Na záver poviem, že chyby súvisiace s odkazmi môžu byť nielen vo foreach. A o všetkých sa raz diskutovalo. Tento prípad je však, súdiac podľa mojich skúseností, v praxi taký bežný, že si zaslúži osobitnú pozornosť.

Pozri nedobrovoľne ... Slovník ruských synoným a výrazov podobného významu. pod. vyd. N. Abramova, M .: Ruské slovníky, 1999. nevedome inštinktívne, bez toho, aby si to uvedomovali, spontánne, v panike, inštinktívne, bez toho, aby sme si to uvedomovali, bez toho, aby sme si to uvedomovali, ... ... Slovník synonym

Nezodpovedne, inštinktívne, automaticky, spontánne, naslepo. Cm… Slovník synonym

Mimovoľne, nevedome, nevedome, inštinktívne, mechanicky, mechanicky, naslepo, spontánne; náhodne, neúmyselne; chtiac nechtiac, nech sa páči (volens nolens), z núdze Toto musel urobiť kvôli veciam mimo jeho kontroly... ... Slovník synonym

Slepo, podvedome, vnútorne, bez toho, aby som si to uvedomoval, bez toho, aby si to uvedomoval, spontánne, nevedome, bez toho, aby som si to uvedomoval, nevedome, mechanicky, nevedome, nevedome, intuitívne, nevedome, šiesty zmysel, inštinktívne Slovník rusov ... ... Slovník synonym

Pozri nedobrovoľne ... Slovník ruských synoným a výrazov podobného významu. pod. vyd. N. Abramova, M .: Ruské slovníky, 1999. slepo nevedome, mimovoľne; nezreteľne, neuvážene, nevedome, spontánne, inštinktívne, otrocky, nevedome, nejasne, ... ... Slovník synonym

adv. k nezodpovedným. [Matka] sa chcela otočiť, ale nevedome sa opäť pohla dopredu. M. Gorkij, matka. [Juduška] prosil svoju dobrú priateľku matku, aby implicitne spravovala jeho majetok. Saltykov Shchedrin, páni Golovlevs ... Malý akademický slovník

UNREPORTABLE, unaccountable, unaccountable; (nepoužíva sa krátky mužský rod) nezodpovedateľný, nezodpovedateľný. 1. Nepodlieha žiadnej kontrole, nie je povinný hlásiť. Implicitne (adv.) zlikvidoval v obchode. 2. Bez ohľadu na rozumné úvahy, ... ... Vysvetľujúci slovník Ushakov

- (grécky). Osoba, ktorá je poverená vykonávať živnosť bez zodpovednosti, na náklady inej osoby. Slovník cudzích slov zahrnutých v ruskom jazyku. Chudinov A.N., 1910. ANAGALIST Osoba, ktorá je poverená obchodovaním na náklady inej osoby bez zodpovednosti. Vysvetlenie…… Slovník cudzích slov ruského jazyka

Nevysvetliteľne, nevedome, mechanicky, mimovoľne, automaticky, mechanicky, automaticky, mechanicky, autopilot Slovník ruských synoným. automaticky zobraziť automaticky Slovník synoným ruského jazyka. Praktický sprievodca. M.: rusky... Slovník synonym

Pozri nedobrovoľne ... Slovník ruských synoným a výrazov podobného významu. pod. vyd. N. Abramova, M.: Ruské slovníky, 1999. inštinktívne, nevedome, mimovoľne; mimovoľne, nevedome, vnútorne, spontánne, spontánne, nevedome, naslepo, ... ... Slovník synonym

knihy

  • Cesta Československom, J. Marko, M. Peterka, Praha, 1959. Artia. S množstvom fotografických ilustrácií. Vydavateľská väzba. Bezpečnosť je dobrá. Očarený pútnik z ktorejkoľvek krajiny sveta, ktorý sa ponorí do tejto krásnej knihy, bude môcť ... Kategória: Zápisky cestovateľov, memoáre, výskumy Vydavateľstvo: Artia,
  • Rada alebo Stretnutia na Sennaji, Gennadij Grigorjev, Sergej Nosov, V Petrohrade sú miesta, ktoré sú jednoducho fantazmogénne. Námestie Sennaya je jedným z nich. "Sennaya - kolíska fantazmagórie". Zdá sa, že samotní autori sú prekvapení tým, čo sa im stalo na Sennayi. Áno a... Kategória: Klasická a moderná próza Séria: Petrohradské tváre našej doby Vydavateľ:

Bez ohľadu na to, ako veľmi používame PHP, stále sa objavujú niektoré funkcie, o ktorých sme ani nepočuli. Niektoré z nich by nám boli veľmi užitočné. Vytvoril som krátky zoznam užitočných funkcií, ktoré by mal mať vo svojom arzenáli každý PHP programátor.

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

Pravdepodobne 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 meniť prípad od prípadu.

Najprv si však pripomeňme, ako vytvárame funkcie obvyklým spôsobom:

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

Teraz sa pozrime na to, ako môžete napísať funkciu s neobmedzeným počtom argumentov. Na tento účel sa použije metóda func_get_args():

// nešpecifikujte argumenty function foo() ( // vráti pole odovzdaných argumentov $args = func_get_args(); foreach ($args ako $k => $v) ( echo "arg".($k+1) ." : $v\n"; ) ) foo(); /* vypis nic */ foo("ahoj"); /* výstup arg1: ahoj */ foo("ahoj", "svet", "znova"); /* výstup arg1: ahoj arg2: svet arg3: znova */

2. Použite Glob() na vyhľadanie súborov

Názvy funkcií často hovoria samy za seba. To isté sa nedá povedať o funkcii glob().

Bez toho, aby sme zachádzali do podrobností, jeho funkčnosť je podobná metóde scandir(). Umožňuje vám nájsť požadovaný súbor podľa vzoru:

// nájdenie všetkých php súborov $files = glob("*.php"); print_r($subory); /* výstup: Array ( => phptest.php => pi.php => post_output.php => test.php) */

Ak chcete nájsť súbory niekoľkých typov, musíte písať takto:

// nájdenie všetkých súborov php a txt $files = glob("*.(php,txt)", GLOB_BRACE); print_r($subory); /* výstup: Array ( => phptest.php => pi.php => post_output.php => test.php => log.txt => test.txt) */

Môžete tiež zadať cestu v šablóne:

$files = glob("../images/a*.jpg"); print_r($subory); /* výstup: Array ( => ../images/apple.jpg => ../images/art.jpg) */

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

$files = glob("../images/a*.jpg"); // Aplikujte funkciu "realpath" na každý prvok poľa $files = array_map("realpath",$files); print_r($subory); /* výstup: Array ( => C:\wamp\www\images\apple.jpg => C:\wamp\www\images\art.jpg) */

3. Informácie o použitej pamäti

Ak budete sledovať množstvo pamäte, ktorú zaberajú vaše skripty, pravdepodobne ich budete častejšie optimalizovať.

PHP má výkonný nástroj na sledovanie pamäte. V rôznych častiach skriptu môže byť zaťaženie rôzne. Aby sme získali hodnotu aktuálne používanej pamäte, mali by sme použiť metódu memory_get_usage(). Ak chcete opraviť maximálne množstvo použitej pamäte, použite memory_get_peak_usage()

echo "Initial: ".memory_get_usage()." bajtov \n"; /* Počiatočné: 361400 bajtov */ // poskytuje 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ť, musíte použiť metódu getrusage(). Upozorňujeme však, že táto funkcia nebude fungovať v systéme Windows.

Print_r(getrusage()); /* vytlačí pole ( => 0 => 0 => 2 => 3 => 12692 => 764 => 3864 => 94 => 0 => 1 => 67 => 4 => 0 => 0 => 0 => 6269 => 0) */

Vyššie načrtnutý obrázok bude jasný pre tých, ktorí majú skúsenosti so správou systému. Pre všetkých ostatných ponúkame dešifrovanie:

  • ru_oublock: počet zápisov bloku
  • ru_inblock: počet čítaní bloku
  • 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é množstvo nezdieľaných údajov
  • ru_minflt: počet použitých stránok pamäte
  • ru_majflt: počet chýb stránky
  • ru_nsignals: počet prijatých signálov
  • ru_nvcsw: počet prepínačov kontextu podľa procesu
  • ru_nivcsw: počet vynútených prepnutí kontextu
  • ru_nswap: počet prístupov na disk počas stránkovania
  • ru_utime.tv_usec: čas strávený v používateľskom režime (mikrosekundy)
  • ru_utime.tv_sec: čas strávený v používateľskom režime (sekundy)
  • ru_stime.tv_usec: čas privilegovaného režimu (mikrosekundy)
  • ru_stime.tv_sec: čas privilegovaného režimu (sekundy)

Aby ste zistili, aké zdroje vášho procesora skript využíva, potrebujete hodnotu „čas používateľa“ (čas v používateľskom režime) a „systémový čas“ (čas v privilegovanom režime). Výsledok môžete získať za sekundy aj mikrosekundy. Ak chcete previesť celkový počet sekúnd na desatinné číslo, musíte vydeliť hodnotu mikrosekúnd 1 miliónom a pridať k hodnote sekundy.

Nejako mätúce. Tu je príklad:

// odpočinok 3 sekundy spánok(3); $data = getrusage(); echo "Čas používateľa: ". ($data["ru_utime.tv_sec"] + $data["ru_utime.tv_usec"] / 1000000); echo "Systémový čas: ". ($data["ru_stime.tv_sec"] + $data["ru_stime.tv_usec"] / 1000000); /* vytlačí Čas používateľa: 0,011552 Systémový čas: 0 */

Hoci dokončenie skriptu trvalo približne 3 sekundy, procesor nebol príliš zaťažený. Ide o to, že pri volaní (spánku) skript prakticky nespotrebováva zdroje procesora. Vo všeobecnosti existuje veľa úloh, ktoré zaberajú značné množstvo času, ale nevyužívajú procesor. Napríklad čakanie na operácie súvisiace s diskom. Takže nie vždy využívate čas CPU vo svojich skriptoch.

Tu je ďalší príklad:

// prejsť 10 miliónov krát pre ($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 zabral 1,4 sekundy CPU času. V tomto prípade sú časy systémových hovorov vo všeobecnosti nízke.

Čas privilegovaného režimu (System Time) je čas, ktorý procesor strávi vykonávaním systémových požiadaviek do jadra v mene programu. Príklad:

$start = microtime(true); // volá microtime každé 3 sekundy while(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 */

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

Treba však poznamenať, že zobrazený čas nemusí byť presný, pretože. v tomto okamihu sú prostriedky procesora využívané aj inými programami, čo môže viesť k malej chybe.

5. Magické konštanty

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

Nebudeme ich brať do úvahy všetky. Pozrime sa len na pár:

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

Pri ladení skriptov použite __LINE__:

// kód // ... my_debug("nejaká ladiaca správa", __LINE__); /* výstup Riadok 4: nejaká ladiaca správa */ // ďalší kód // ... my_debug("ďalšia ladiaca správa", __LINE__); /* výstup Riadok 11: ďalšia ladiaca správa */ funkcia my_debug($msg, $line) ( echo "Riadok $riadok: $msg\n"; )

6. Generovanie jedinečných ID

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

// vygenerovanie náhodného reťazca echo md5(time() . mt_rand(1,1000000));

Ale v skutočnosti má PHP na tento účel špeciálnu funkciu uniqid().

// vygenerovanie náhodného reťazca echo uniqid(); /* výstupy 4bd67c947233e */ // ešte raz echo uniqid(); /* vytlačí 4bd67c9472340 */

Voľným okom môžete vidieť, že prvé znaky sú prinajmenšom podobné... Je to spôsobené tým, že táto metóda využíva na generovanie znakov serverový čas. Je to dokonca užitočné, pretože. všetky vygenerované 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ýšiť počet znakov):

// s predponou echo uniqid("foo_"); /* výstup foo_4bd67d6cd8b8f */ // s druhým parametrom echo uniqid("",true); /* výstupy 4bd67d6cd8b926.12135106 */ // oba echo uniqid("bar_",true); /* vytlačí bar_4bd67da367b650.43684647 */

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

7. Serializácia

Museli ste niekedy ukladať zložité údaje do databázy alebo súboru? Na konverziu objektu na reťazec poskytuje PHP špeciálnu funkciu.

Vo všeobecnosti sú tieto metódy 2: serialize() a unserialize()

// komplexné pole $myvar = array("ahoj", 42, array(1,"dva"), "jablko"); // prevod na reťazec $string = serialize($myvar); echo $string; /* výstup a:4:(i:0;s:5:"ahoj";i:1;i:42;i:2;a:2:(i:0;i:1;i:1;s :3:"dva";)i:3;s:5:"jablko";) */ // získajte pôvodnú hodnotu $newvar = unserialize($string); print_r($newvar); /* vytlačí pole ( => ahoj => 42 => pole ( => 1 => dva) => jablko) */

Takto fungujú tieto funkcie. Avšak kvôli rýchlemu rastu popularity JSON boli do PHP 5.2 pridané 2 metódy json_encode() a json_decode(). Ich práca je podobná serialize():

// komplexné pole $myvar = array("ahoj", 42, array(1,"dva"), "jablko"); // prevod na reťazec $string = json_encode($myvar); echo $string; /* vypíše ["hello",42,,"apple"] */ // obnoví pôvodnú hodnotu $newvar = json_decode($string); print_r($newvar); /* vytlačí pole ( => ahoj => 42 => pole ( => 1 => dva) => jablko) */

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

8. Strunová kompresia

Keď hovoríme o kompresii, okamžite nám napadnú archívne súbory vo formáte ZIP. PHP poskytuje možnosť komprimovať dlhé reťazce bez akýchkoľvek súborov.

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

$string = "Lorem ipsum dolor sit amet, consectetur adipiscing elite. Nunc ut elit id mi ultricies adipiscing. Nulla facilisi. Praesent pulvinar, sapien vel feugiat vestibulum, nulla dui pretium orci, non ultricies a situácia elita. , consectetur adipiscing elit. Aliquam pretium ullamcorper urna quis iaculis. Etiam ac massa sed turpis tempor luctus. Curabitur sed nibh eu elit mollis congue. metus, at lacinia augue. Sed magna nisi, ornare in mollis in, mollis sed nunc. Etiam at justo in leo congue mollis. Nullam in neque eget metus hendrerit scelerisque eu non enim. Ut malesuada lacus eu nulla bibendusmod ur ; $compressed = gzcompress($string); echo "Pôvodná veľkosť: ". strlen($string)."\n"; /* výtlačky Pôvodná veľkosť: 800 */ echo "Stlačená veľkosť: ". strlen($compressed)."\n"; /* výstup Komprimovaná veľkosť: 418 */ // return $original = gzuncompress($compressed);

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

9. Spustite pred dokončením

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

Povedzme, že chcete zistiť nejaké informácie... Trvanie skriptu:

// získajte čas začiatku $start_time = microtime(true); // niektoré operácie // ... // vypíše odozvu času chodu "vykonanie trvalo: ". (microtime(true) - $start_time). "sekundy.";

Na prvý pohľad sa to môže zdať ako triviálna úloha. Na tieto účely môžete kód umiestniť na koniec súboru. Ak sa však niekde predtým vykoná funkcia exit(), tento kód nikdy nebude fungovať. Rovnako 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 vo svojom prehliadači);

Pri použití metódy register_shutdown_function() sa kód aj tak vykoná:

$start_time = microtime(true); register_shutdown_function("moje_vypnutie"); funkcia my_shutdown() ( global $start_time; echo "spustenie trvalo: ". (microtime(true) - $start_time). " sekund."; )

Výkon

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

Zaoberáte sa tvorbou a propagáciou webovej stránky pod kontrolou CMS Joomla a ty si zrazu potrebuješ prerobiť podľa chuti a nálady navrhovanie materiálu úpravou štandardných šablón komponentu com_content? Komponent je zodpovedný za generovanie obsahu. Poďme sa pozrieť na štruktúru samotného komponentu.

Umiestnenie štandardnej šablóny materiálu

Pôvodné súbory komponentov com_content nachádza sa v komponentoch\com_content\views\View\tmpl. Ak sa súbory komponentov skopírujú do adresára \templates\template\html\com_content\, ktorý používate, potom sa šablóna materiálu prevezme zo súborov tohto priečinka.

Adresáre a súbory šablón

Adresár umiestnenia šablón obsahuje päť priečinkov na generovanie pohľadov.

priečinok archív

  • Archivujte priečinok výstupnej šablóny. Tento článok nie je braný do úvahy, málokto ho používa. Štruktúra je podobná priečinkom popísaným nižšie;

priečinok článok - Materiál

priečinok predná strana - Hlavná stránka

  • default.php Rovnaký princíp ako category\blog.php;
  • default_item.php Rovnaký princíp ako category\blog_item.php;
  • default_links.php Rovnaký princíp ako category\blog_links.php;

priečinok oddiele - kapitola

  • blog.phpŠablóna blogu sekcie. Rovnaký princíp ako category\blog.php;
  • blog_item.phpŠablóna na samostatný článok zo sekcie blogu. Rovnaký princíp ako category\blog_item.php;
  • blog_links.phpŠablóna na prezentáciu odkazov v sekcii blog. Rovnaký princíp ako category\blog_links.php;
  • default.phpŠtandardná šablóna sekcie. Zobrazuje názov kategórie, jej popis, počet prvkov. Po kliknutí na názov kategórie stránku spracuje category\default.php;

Príklad úpravy šablóny. Zobrazuje počet zobrazení materiálu.

Povedzme, že chceme vytlačiť počet zásahov oddelené materiál z kategórie blog. Ak to chcete urobiť, upravte šablónu category\blog_item.php. Kód na vkladanie informácií o prístupoch bude takýto:

item->hits ?>

Teraz musíte v súbore šablóny category\blog_item.php nájsť miesto, kam vložiť tento kód. Napríklad pred zobrazením dátumu poslednej úpravy materiálu. Hľadá sa linka:

item->modified) !=0 && $this->item->params->get("show_modify_date")) : ?>

A pred ním vložte riadok s kódom.

Príklad zoznam kategórií vo viacerých stĺpcoch .