Kuvaus com_content-mallin rakenteesta. Sudenkuoppi foreachissa($items kuin &$item) Tappava kohde php

Monet kohtalokkaat ja korjattavat kohtalokkaat virheet on muutettu poikkeuksiksi PHP 7:ssä. Nämä virhepoikkeukset periytyvät Error-luokasta, joka itse toteuttaa Throwable-rajapinnan (uusi perusrajapinta perii kaikki poikkeukset).

Tämä tarkoittaa, että mukautettuja virhekäsittelijöitä ei voida enää laukaista, koska sen sijaan voidaan heittää poikkeuksia (aiheuttaa uusia vakavia virheitä havaitsemattomille virhepoikkeuksille).

Täydellinen kuvaus siitä, miten virheet toimivat PHP 7:ssä, löytyy PHP 7 -virhesivulta. Tämä siirto-opas vain luettelee muutokset, jotka vaikuttavat taaksepäin yhteensopivuuteen.

Sisäiset rakentajat tekevät aina poikkeuksia epäonnistumisen yhteydessä

Aiemmin jotkin sisäiset luokat palauttivat NULL-arvon tai käyttökelvottoman objektin, kun rakentaja epäonnistui. Kaikki sisäiset luokat heittävät nyt poikkeuksen tässä tapauksessa samalla tavalla kuin käyttäjäluokat joutuivat tekemään.

E_STRICT huomaa vakavuusmuutoksia

Kaikki E_STRICT-ilmoitukset on luokiteltu uudelleen muille tasoille. E_STRICT-vakio säilyy, joten kutsut kuten error_reporting(E_ALL|E_STRICT) ei aiheuta virhettä.

E_STRICT huomaa vakavuusmuutoksia Tilanne Uusi taso/käyttäytyminen
Indeksointi resurssin mukaan E_NOTICE
Abstraktit staattiset menetelmät
Rakentajan "uudelleenmäärittely". Ilmoitus poistettu, ei laukaise virhettä
Allekirjoitusvirhe perinnön aikana E_VAROITUS
Sama (yhteensopiva) ominaisuus kahdessa käytetyssä ominaisuudessa Ilmoitus poistettu, ei laukaise virhettä
Staattisen omaisuuden käyttö ei-staattisesti E_NOTICE
Vain muuttujat tulisi määrittää viitteellä E_NOTICE
Vain muuttujat tulee välittää viittauksella E_NOTICE
Ei-staattisten menetelmien kutsuminen staattisesti E_DEPRECATED
Muutoksia muuttuvaan käsittelyyn

PHP 7 käyttää nyt abstraktia syntaksipuuta jäsentäessään lähdetiedostoja. Tämä on mahdollistanut monia parannuksia kieleen, jotka olivat aiemmin mahdottomia PHP:n aikaisemmissa versioissa käytetyn jäsentimen rajoitusten vuoksi, mutta on johtanut muutamien erityistapausten poistamiseen johdonmukaisuuden vuoksi, mikä on johtanut taaksepäin yhteensopivuuden katkoihin. Näitä tapauksia käsitellään yksityiskohtaisesti tässä osiossa.

Muutoksia epäsuorien muuttujien, ominaisuuksien ja menetelmien käsittelyyn

Epäsuora pääsy muuttujiin, ominaisuuksiin ja menetelmiin arvioidaan nyt tiukasti vasemmalta oikealle järjestyksessä, toisin kuin aiemmassa erikoistapausten yhdistelmässä. Alla oleva taulukko näyttää, kuinka arviointijärjestys on muuttunut.

Epäsuorien ilmaisujen vanha ja uusi arviointi Lauseke PHP 5 tulkinta PHP 7 tulkinta
$$foo["baari"]["baz"] $($foo["bar"]["baz"]) ($$foo)["baari"]["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"]()

Koodi, joka käytti vanhaa oikealta vasemmalle -arviointijärjestystä, on kirjoitettava uudelleen käyttämään tätä arviointijärjestystä aaltosulkeilla (katso yllä oleva keskimmäinen sarake). Tämä tekee koodista eteenpäin yhteensopivan PHP 7.x:n kanssa ja taaksepäin yhteensopivan PHP 5.x:n kanssa.

Vakava virhe: Uncaught AritmeticError: Bittisiirtymä negatiivisella luvulla tiedostossa /tmp/test.php:2 Pinojäljitys: #0 (main) heitetty tiedostoon /tmp/test.php rivillä 2

Bittisiirrot alueen ulkopuolella

Bittisiirrot (kumpaankin suuntaan) kokonaisluvun bittileveyden yli johtavat aina nollaan. Aikaisemmin tällaisten siirtymien käyttäytyminen oli arkkitehtuurista riippuvaista.

Muutoksia Division By Zero

Aikaisemmin, kun 0:ta käytettiin jakajana joko jako- (/) tai moduuli (%) -operaattoreille, lähetettiin E_VAROITUS ja palautettiin false. Nyt jako-operaattori palauttaa floatin joko +INF-, -INF- tai NAN-muodossa IEEE 754:n määrittämänä. Moduulioperaattori E_WARNING on poistettu ja antaa DivisionByZeroError-poikkeuksen.

Yllä olevan esimerkin tulos PHP 5:ssä:

Varoitus: Jako nollalla %s rivillä %d bool(false) Varoitus: Jako nollalla %s rivillä %d bool(false) Varoitus: Jako nollalla %s rivillä %d bool(false)

Yllä olevan esimerkin tulos PHP 7:ssä:

Varoitus: Jako nollalla %s rivillä %d float(INF) Varoitus: Jako nollalla %s rivillä %d float(NAN) PHP Vakava virhe: Uncaught DivisionByZeroError: Modulo nollalla %s rivillä %d

\u( voi aiheuttaa virheitä

Uuden Unicode-koodipisteen pakotussyntaksin lisäämisen vuoksi merkkijonot sisältävät literaalin \u( ja sen jälkeen virheellinen sekvenssi aiheuttaa vakavan virheen. Tämän välttämiseksi kenoviiva tulee jättää pois.

Poistetut funktiot Poistetut INI-ohjeet xsl.security_prefs

Direktiivi xsl.security_prefs on poistettu. Sen sijaan menetelmää XsltProcessor::setSecurityPrefs() tulisi kutsua ohjaamaan suojausasetuksia prosessorikohtaisesti.

Muut taaksepäin yhteensopimattomat muutokset Uusia objekteja ei voi määrittää viittauksella

Tulos Uusi lausetta ei voi enää määrittää muuttujalle viittauksella:

Yllä olevan esimerkin tulos PHP 5:ssä:

Vanhentunut: Uuden palautusarvon määrittäminen viittauksella on vanhentunut tiedostossa /tmp/test.php rivillä 3

Yllä olevan esimerkin tulos PHP 7:ssä:

Jäsennysvirhe: syntaksivirhe, odottamaton "uusi" (T_NEW) tiedostossa /tmp/test.php rivillä 3

Virheelliset luokan, käyttöliittymän ja piirteiden nimet

Seuraavia nimiä ei voi käyttää luokkien, käyttöliittymien tai ominaisuuksien nimeämiseen:

  • bool
  • int
  • kellua
  • merkkijono
  • TYHJÄ
  • TOTTA
  • VÄÄRÄ

Lisäksi seuraavia nimiä ei tule käyttää. Vaikka ne eivät aiheuta virhettä PHP 7.0:ssa, ne on varattu myöhempää käyttöä varten ja niitä tulisi pitää vanhentuina.

  • esine
  • sekoitettu
  • numeerinen
ASP ja script PHP-tunnisteet poistettu

Tuki ASP- ja skriptitunnisteiden käyttämiselle PHP-koodin rajaamisessa on poistettu. Vaikuttavat tunnisteet ovat:

ASP- ja skriptitunnisteet poistettu Avaa tunniste Sulkee tunniste
Puhelut yhteensopimattomasta kontekstista poistettu

Aiemmin vanhentunut PHP 5.6:ssa, staattiset kutsut ei-staattiseen menetelmään, jolla on yhteensopimaton konteksti, johtavat nyt siihen, että kutsutulla menetelmällä on määrittelemätön $tämä muuttuja ja käytöstäpoistovaroitus annetaan.

Yllä olevan esimerkin tulos PHP 5.6:ssa:

Vanhentunut: Ei-staattista menetelmää A::test() ei pitäisi kutsua staattisesti, jos $this on yhteensopimattomasta kontekstista tiedostossa /tmp/test.php rivillä 8 objekti(B)#1 (0) ( )

Yllä olevan esimerkin tulos PHP 7:ssä:

Vanhentunut: Ei-staattista menetelmää A::test() ei pitäisi kutsua staattisesti tiedostossa /tmp/test.php rivillä 8 Huomautus: Määrittelemätön muuttuja: tämä tiedostossa /tmp/test.php rivillä 3 NULL

tuotto on nyt oikea assosiatiivinen operaattori

Tuottorakenne ei enää vaadi sulkeita, ja se on muutettu oikeaksi assosiatiiviseksi operaattoriksi, jonka etusija on välillä Tulosta ja => . Tämä voi johtaa muuttuneeseen käyttäytymiseen:

Sulkuja voidaan käyttää näiden tapausten yksiselitteisyyteen.

Funktioilla ei voi olla useita samalla nimellä olevia parametreja

Ei ole enää mahdollista määrittää kahta tai useampaa funktioparametria samalla nimellä. Esimerkiksi seuraava toiminto laukaisee E_COMPILE_ERROR:n:

Argumentteja tarkastelevat funktiot raportoivat nykyinen parametrin arvo

func_get_arg() , func_get_args() , debug_backtrace() ja poikkeus backtraces eivät enää raportoi alkuperäistä arvoa, joka välitettiin parametrille, vaan sen sijaan tarjoavat nykyisen arvon (jota on saatettu muokata).

Yllä olevan esimerkin tulos PHP 5:ssä:

Yllä olevan esimerkin tulos PHP 7:ssä:

Switch-käskyissä ei voi olla useita oletuslohkoja

Switch-käskyssä ei ole enää mahdollista määrittää kahta tai useampaa oletuslohkoa. Esimerkiksi seuraava kytkinkäsky laukaisee E_COMPILE_ERROR:n:

JSON korvasi laajennuksen JSOND:lla

JSON-laajennus on korvattu JSOND:lla, mikä aiheuttaa kolme pientä BC-katkoa. Ensinnäkin luku ei saa päättyä desimaalipilkuun (esim. 34. on vaihdettava jompaankumpaan 34.0 tai 34 ). Toiseksi, kun käytetään tieteellistä merkintää, e eksponentti ei saa välittömästi seurata desimaalipistettä (esim. 3.e3 on vaihdettava jompaankumpaan 3.0e3 tai 3e3). Lopuksi tyhjää merkkijonoa ei enää pidetä kelvollisena JSONina.

Sisäinen toimintahäiriö ylivuodosta

Aiemmin sisäiset funktiot katkaisivat äänettömästi kellunta-kokonaislukupakotteilla tuotetut luvut, kun kelluvuus oli liian suuri esitettäväksi kokonaislukuna. Nyt lähetetään E_WARNING ja palautetaan NULL.

Korjaa mukautetun istunnonkäsittelijän palautusarvot

Kaikki mukautettujen istunnonkäsittelijöiden toteuttamat predikaattifunktiot, jotka palauttavat joko EPÄTOSI tai -1 tulee olemaan kohtalokkaita virheitä. Jos näistä funktioista on jokin muu arvo kuin looginen arvo, -1 , tai 0 palautetaan, se epäonnistuu ja E_WARNING lähetetään.

Lajittele yhtäläisten elementtien järjestys

Sisäistä lajittelualgoritmia on parannettu, mikä voi johtaa siihen, että elementtien lajittelujärjestys on erilainen kuin ennen.

Älä luota samanarvoisten elementtien järjestykseen; se voi muuttua milloin tahansa.

Väärin sijoitetut tauko- ja vaihtolausekkeet

tauko ja jatkaa lausekkeet silmukan ulkopuolella tai vaihtaa ohjausrakenne tunnistetaan nyt käännösaikana ajon aikana, kuten aiemmin, ja laukaisevat E_COMPILE_ERROR .

Oletko luomassa ja mainostamassa CMS Joomlaa käyttävää verkkosivustoa ja yhtäkkiä sinulla on tarve muokata materiaalin suunnittelua makusi mukaan ja omalla tavallasi muokkaamalla com_content-komponentin vakiomalleja? Komponentti vastaa sisällön luomisesta. Ymmärretään itse komponentin rakenne.

Vakiomateriaalimallin sijainti

Alkuperäiset com_content-komponenttitiedostot sijaitsevat komponenteissa\com_content\views\View\tmpl-kansiossa. Jos komponenttitiedostot kopioidaan käyttämääsi hakemistoon \templates\template\html\com_content\, materiaalimalli otetaan tämän kansion tiedostoista.

Hakemistot ja mallitiedostot

Mallin sijaintihakemisto sisältää viisi kansiota näkymien luomista varten.

arkistokansio

  • Arkistoi tulostemallikansio. Tätä artikkelia ei käsitellä harvoin. Rakenne on samanlainen kuin alla kuvatut kansiot;

artikkelikansio - Materiaali

etusivun kansio - Kotisivu

  • oletus.php Sama periaate kuin category\blog.php;
  • oletus_tuote.php Sama periaate kuin category\blog_item.php;
  • oletuslinkit.php Sama periaate kuin category\blog_links.php;

kansioosio - osio

  • blogi.php Osaston blogimalli. Sama periaate kuin category\blog.php;
  • blogi_tuote.php Malli erilliselle materiaalille jaksoblogista. Sama periaate kuin category\blog_item.php;
  • blog_links.php Malli linkkien esittämiseen blogi-osion alla. Sama periaate kuin category\blog_links.php;
  • oletus.php Vakioosion malli. Näyttää luokan otsikon, sen kuvauksen ja elementtien lukumäärän. Kun olet napsauttanut kategorian otsikkoa, sivu käsitellään kategoriassa\default.php;
Esimerkki mallin muokkaamisesta. Näyttää materiaalin näyttökertojen määrän.

Oletetaan, että haluamme näyttää luokkablogin yksittäisen artikkelin osumien määrän. Voit tehdä tämän muokkaamalla kategoria\blog_item.php-mallia. Koodi osumien tietojen lisäämiseksi on seuraava:

Nyt sinun on löydettävä kategoria\blog_item.php-mallitiedostosta paikka, johon voit lisätä tämän koodin. Esimerkiksi ennen materiaalin viimeisimmän muokkauksen päivämäärän näyttämistä. Etsimme linjaa:

Ja ennen sitä lisäämme rivin koodilla.

Esimerkki luokkaluettelon näyttäminen useissa sarakkeissa .

Monet ihmiset haluavat kirjoittaa tällaisia ​​rakenteita muodossa tai toisessa, jokainen on törmännyt:
foreach ($item nimellä &$item) ( $item += 2; )
Mutta monet ihmiset eivät epäile täällä piilevää vaaraa.
Katsotaanpa esimerkkiä.

Vasya Pupkin otti taulukon, käveli sen läpi ja lisäsi kaikkia elementtejä kahdella:
$kohteet = array("a" => 10, "b" => 20, "c" => 30,); foreach ($item &$item) ( $item += 2; ) print_r($item);
Katsoin kaatopaikkaa, huomasin, että ongelma oli ratkaistu, ja lähdin tyytyväisenä:
Taulukko ([a] => 12 [b] => 22 [c] => 32)
Jonkin ajan kuluttua Petrovich päätti täydentää tätä koodin osaa toisella haulla lisäämällä alla:
$uudet kohteet = array("a" => 10, "b" => 20, "c" => 30,); foreach ($newitems muodossa $avain=>$kohde) ( $newitems[$key] += 5; ) print_r($newitems);
Hän näki, että hänen tehtävänsä oli myös ratkaistu, ja onnistuneena hän sulki tiedoston:
Taulukko ([a] => 15 [b] => 25 [c] => 35)
Jonkin ajan kuluttua alkoi ilmaantua selittämättömiä vikoja. Miksi?
Tehdään var_dump($items) koodin lopussa:
array(3) ( ["a"]=> int(12) ["b"]=> int(22) ["c"]=> &int(30) )
kolmekymmentä! Vasya Pupkin vannoo tarkistaneensa. Miksi se oli 32 ja Petrovitšin koodin jälkeen 30?

Syy on et-merkissä. Hän ilmoittaa, että joku muu viittaa merkittyihin tietoihin. Lähtiessään Vasya ei pyyhkinyt taakseen väliaikaista muuttujaa, jolla hän käytti raakaa voimaa ($item). Muuttujaa käytettiin lähteen muutosluvalla ("&"), jota kutsutaan myös "määrittely viitteellä". Hän oli varma, että muuttujaa käytettäisiin vain silmukan sisällä. Petrovich muutti haun aikana samannimistä muuttujaa sen arvoa, ja joka kerta, kun tämä muuttujan tallennuspaikka vaihtui. Ja se tallennettiin samaan paikkaan kuin Pupkin-taulukon viimeinen elementti.

Tietenkin artikkelin tapaus on liioiteltu. Käytännössä tällaiset yhteydet voivat olla hyvin monimutkaisia, varsinkin jos projekti on edullinen ja siinä ei ole tarpeeksi kokeneita ja hajallaan olevia web-kehittäjiä.

Kuinka voit käsitellä tätä?

  • Tuhoa väliaikaiset muuttujat käytön jälkeen, varsinkin jos niillä on jokin yhteys käytettävään dataan:
    foreach ($item kuin &$item) $item += 2; unset($item);
  • Ole varovainen muiden jo käyttämien muuttujien kanssa.
  • Kapseloi toimintasi erillisiin funktioihin, menetelmiin tai nimiavaruuksiin.
  • Käytä var_dump eikä print_r ja kiinnitä huomiota et-merkkiin. Jos haluat kopioida tiedostoon selaimen sijaan, vaihtoehto print_r($var,true) on seuraava rakenne:
    function dump() ( ob_start(); foreach(func_get_args() as $var) var_dump($var); return ob_get_clean(); )
Lopuksi sanon, että linkkeihin liittyviä vikoja voi esiintyä paitsi foreachissa. Ja niistä kaikista keskusteltiin jossain vaiheessa. Kokemukseni perusteella tämä tapaus on kuitenkin niin yleinen käytännössä, että se ansaitsee erityistä huomiota.

Riippumatta siitä, kuinka paljon käytämme PHP:tä, jotkut toiminnot tulevat näkyviin, joista emme ole koskaan edes kuulleet. Jotkut niistä olisivat meille erittäin hyödyllisiä. Olen luonut pienen luettelon hyödyllisistä toiminnoista, joiden pitäisi olla jokaisen PHP-ohjelmoijan arsenaalissa.

1. Luodaan funktioita, joissa on vaihteleva määrä argumentteja

Todennäköisesti tiedät jo, että PHP antaa meille mahdollisuuden luoda toimintoja valinnaisilla argumenteilla. Nyt näytän funktion, jossa argumenttien määrä voi vaihdella tapauskohtaisesti.

Mutta ensin muistetaan, kuinka luomme toimintoja tavalliseen tapaan:

// funktio kahdella valinnaisella parametrilla function foo($arg1 = "", $arg2 = "") ( echo "arg1: $arg1\n"; echo "arg2: $arg2\n"; ) foo("hei", "maailman"); /* tulostaa: arg1: hei arg2: world */ foo(); /* tulostaa: arg1: arg2: */

Katsotaanpa nyt, kuinka voit kirjoittaa funktion, jolla on rajoittamaton määrä argumentteja. Tätä varten käytetään func_get_args() -menetelmää:

// älä määritä argumentteja function foo() ( // palauttaa joukon välitettyjä argumentteja $args = func_get_args(); foreach ($args muodossa $k => $v) ( echo "arg".($k+1) ." : $v\n" ) ) foo(); /* ei tulosta mitään */ foo("hello"); /* tulostaa arg1: hello */ foo("hei", "maailma", "taas"); /* tulostaa arg1: hello arg2: world arg3: again */

2. Käytä Glob()-komentoa tiedostojen etsimiseen

Usein funktioiden nimet puhuvat puolestaan. Samaa ei voida sanoa glob()-funktiosta.

Menemättä liian yksityiskohtiin, sen toiminnallisuus on samanlainen kuin scandir()-menetelmä. Sen avulla voit löytää tarvittavan tiedoston mallin avulla:

// etsi kaikki php-tiedostot $files = glob("*.php"); print_r($tiedostot); /* tulostaa: Array ( => phptest.php => pi.php => post_output.php => testi.php) */

Jos haluat etsiä usean tyyppisiä tiedostoja, sinun on kirjoitettava seuraavasti:

// etsi kaikki php- ja txt-tiedostot $files = glob("*.(php,txt)", GLOB_BRACE); print_r($tiedostot); /* lähtö: Array ( => phptest.php => pi.php => post_output.php => testi.php => log.txt => testi.txt) */

Voit myös määrittää polun mallissa:

$tiedostot = glob(../images/a*.jpg"); print_r($tiedostot); /* lähtö: Array ( => ../images/apple.jpg => ../images/art.jpg) */

Saat asiakirjan täydellisen polun käyttämällä realpath()-menetelmää:

$tiedostot = glob(../images/a*.jpg"); // Käytä "realpath"-funktiota jokaiseen taulukkoelementtiin $files = array_map("realpath",$files); print_r($tiedostot); /* tulostaa: Array ( => C:\wamp\www\images\apple.jpg => C:\wamp\www\images\art.jpg) */

3. Tiedot käytetystä muistista

Jos pidät kirjaa komentosarjojesi kuluttamasta muistin määrästä, optimoit niitä todennäköisesti useammin.

PHP:llä on tehokas muistinseurantatyökalu. Kuormat voivat olla erilaisia ​​skriptin eri osissa. Saadaksemme tällä hetkellä käytetyn muistin arvon, meidän tulisi käyttää memory_get_usage() -menetelmää. Korjaa käytetyn muistin enimmäismäärä käyttämällä memory_get_peak_usage()

Echo "Alkuperäinen: ".memory_get_usage()." tavua \n"; /* Alkuperäinen: 361400 tavua */ // antaa pienen kuorman kohteelle ($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. Prosessorin tiedot

Tätä varten sinun on käytettävä getrusage()-menetelmää. Muista kuitenkin, että tämä ominaisuus ei toimi Windowsissa.

Tulosta_r(getrusage()); /* tulostaa taulukon ( => 0 => 0 => 2 => 3 => 12692 => 764 => 3864 => 94 => 0 => 1 => 67 => 4 => 0 => 0 => 0 => 6269 => 0) */

Yllä oleva kuva tulee selväksi niille, joilla on kokemusta järjestelmänhallinnasta. Kaikille muille tarjoamme transkription:

  • ru_oublock: lohkon kirjoitustoimintojen määrä
  • ru_inblock: lohkon lukutoimintojen lukumäärä
  • ru_msgsnd: lähetettyjen viestien määrä
  • ru_msgrcv: vastaanotettujen viestien määrä
  • ru_maxrss: sivuttamattoman joukon enimmäiskoko
  • ru_ixrss: jaetun muistin kokonaismäärä
  • ru_idrss: jakamattomien tietojen kokonaismäärä
  • ru_minflt: käytettyjen muistisivujen määrä
  • ru_majflt: sivuilta puuttuvien virheiden määrä
  • ru_nsignals: vastaanotettujen signaalien määrä
  • ru_nvcsw: prosessin kontekstikytkimien määrä
  • ru_nivcsw: pakotettujen kontekstikytkimien määrä
  • ru_nswap: levyn käyttökertojen määrä sivutuksen aikana
  • ru_utime.tv_usec: käyttöaika käyttäjätilassa (mikrosekuntia)
  • ru_utime.tv_sec: käyttöaika käyttäjätilassa (sekunteina)
  • ru_stime.tv_usec: käyttöaika etuoikeutetussa tilassa (mikrosekuntia)
  • ru_stime.tv_sec: käyttöaika etuoikeutetussa tilassa (sekunteina)

Jotta saat selville, mitä prosessorisi resursseja komentosarja käyttää, tarvitset arvon 'user time' (user time) ja 'system time' (privileged mode time). Voit saada tuloksen sekä sekunneissa että mikrosekunneissa. Jos haluat muuntaa sekuntien kokonaismäärän desimaaliluvuksi, sinun on jaettava mikrosekuntien arvo 1 miljoonalla ja lisättävä sekuntien arvo arvoon.

Se on tavallaan hämmentävää. Tässä on esimerkki:

// lepää 3 sekuntia unta(3); $tiedot = getrusage(); echo "Käyttäjäaika:". ($data["ru_utime.tv_sec"] + $data["ru_utime.tv_usec"] / 1000000); echo "Järjestelmäaika:". ($data["ru_stime.tv_sec"] + $data["ru_stime.tv_usec"] / 1000000); /* tulostaa Käyttäjäaika: 0,011552 Järjestelmän aika: 0 */

Vaikka komentosarjan valmistuminen kesti noin 3 sekuntia, prosessoria ei kuormitettu raskaasti. Tosiasia on, että kun komentosarja kutsutaan (sleep), se ei kuluta käytännössä mitään prosessoriresursseja. Yleensä on monia tehtäviä, jotka vievät paljon aikaa, mutta eivät käytä prosessoria. Esimerkiksi levyyn liittyvien toimintojen odottaminen. Joten et aina käytä suorittimen aikaa komentosarjoissasi.

Tässä on toinen esimerkki:

// kävele 10 miljoonaa kertaa for($i=0;$i hello => 42 => Array ( => 1 => two) => apple) */

Näin nämä toiminnot toimivat. JSONin suosion nopean kasvun vuoksi PHP 5.2:een lisättiin kuitenkin kaksi menetelmää json_encode() ja json_decode(). Heidän työnsä on samanlainen kuin serialize():

// monimutkainen taulukko $myvar = array("hei", 42, array(1"kaksi"), "omena"); // muuntaa merkkijonoksi $ string = json_encode($myvar); echo $string; /* tulostaa ["hello",42,"omena"] */ // palauttaa alkuperäisen arvon $newvar = json_decode($string); print_r($uusimuuttuja); /* tulostaa Array ( => hei => 42 => Array ( => 1 => kaksi) => apple) */

Tämä vaihtoehto on kompaktimpi ja yhteensopiva muiden kielten, kuten JavaScriptin, kanssa. Kuitenkin, kun työskentelet erittäin monimutkaisten kohteiden kanssa, tietoja voi hävitä.

8. Merkkijonojen puristus

Kun puhumme pakkaamisesta, arkistotiedostot ZIP-muodossa tulevat heti mieleen. PHP tarjoaa mahdollisuuden pakata pitkiä merkkijonoja ilman tiedostoja.

Seuraava esimerkki osoittaa, kuinka gzcompress()- ja gzuncompress()-funktiot toimivat:

$string = "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nunc ut elit id mi ultricies adipiscing. Nulla facilisi. Praesent pulvinar, sapien vel feugiat vestibulum, nulla dui pretium orci, non ultricies adipiscing elit. , consectetur adipiscing quis iaculis. Posuere adipiscing, in mollis. $pakattu = gzcompress($string); echo "Alkuperäinen koko:". strlen($string)."\n"; /* tulostaa alkuperäisen koon: 800 */ echo "Pakattu koko: ". strlen($pakattu)."\n"; /* tulostaa Pakatun koon: 418 */ // palauttaa $alkuperäinen = gzuncompress($pakattu);

Voimme vähentää tekstin äänenvoimakkuutta 50%. Samoihin tarkoituksiin voit käyttää gzencode()- ja gzdecode()-menetelmiä, jotka käyttävät eri pakkausalgoritmia.

9. Suorita ennen poistumista

PHP:ssä on register_shutdown_function()-funktio, jonka avulla voit suorittaa jonkin koodin ennen komentosarjan sulkemista.

Oletetaan, että haluat saada tietoja... Skriptin ajoaika:

// hanki aloitusaika $aloitusaika = microtime(true); // jotkut toiminnot // ... // näyttävät ajoajan echo "suoritus kesti: ". (mikroaika(true) - $aloitusaika). "sekuntia.";

Ensi silmäyksellä tämä saattaa tuntua vähäpätöiseltä tehtävältä. Näitä tarkoituksia varten voit sijoittaa koodin tiedoston loppuun. Jos exit()-funktio kuitenkin käynnistyy jossain ennen tätä, tämä koodi ei koskaan toimi. Se ei myöskään toimi, jos sivulla on virhe tai käyttäjä keskeyttää sivun latauksen (napsauttamalla vastaavaa painiketta selaimessaan);

Käytettäessä register_shutdown_function() -menetelmää koodi suoritetaan joka tapauksessa:

$aloitusaika = mikroaika(tosi); register_shutdown_function("my_shutdown"); function my_shutdown() ( globaali $aloitusaika; echo "suoritus kesti: ". (mikroaika(true) - $aloitusaika). " sekuntia."; )

Johtopäätös

PHP on kokonainen planeetta, joka ei lakkaa hämmästyttämästä meitä sisällöllään. Mitä mieltä olette näistä toiminnoista?

Katso tahattomasti... Sanakirja venäjän synonyymeistä ja ilmaisuista, joilla on samanlainen merkitys. alla. toim. N. Abramova, M.: Russian Dictionaries, 1999. alitajuisesti vaistomaisesti, tietämättään, spontaanisti, paniikkiin, vaistomaisesti, tajuamatta sitä, ymmärtämättä sitä,... ... Synonyymien sanakirja

Vastuuttomasti, vaistomaisesti, mekaanisesti, spontaanisti, sokeasti. Katso... Synonyymien sanakirja

Tahattomasti, tiedostamatta, tiedostamatta, vaistomaisesti, mekaanisesti, mekaanisesti, sokeasti, spontaanisti; vahingossa, tahattomasti; tahtomattaan, halusimme tai et (volens nolens), pakosta Hänen täytyi tehdä tämä hänen vaikutusmahdollisuuksiensa ulkopuolella... ... Synonyymien sanakirja

Sokeasti, alitajuisesti, sisäisesti, ymmärtämättä, tietämättä, spontaanisti, tiedostamatta, tajuamatta, tiedostamatta, mekaanisesti, tiedostamatta, tiedostamatta, intuitiivisesti, tiedostamatta, kuudes aisti, vaistomaisesti Venäjän kielen sanakirja... ... Synonyymien sanakirja

Katso tahattomasti... Venäjän synonyymien ja vastaavien ilmaisujen sanakirja. alla. toim. N. Abramova, M.: Russian Dictionaries, 1999. sokeasti tiedostamatta, tahattomasti; epäselvästi, piittaamattomasti, vastuuttomasti, spontaanisti, vaistomaisesti, orjallisesti, tiedostamatta, epäselvästi,... ... Synonyymien sanakirja

adv. vastuuttomaksi. [Äiti] halusi kääntyä takaisin, mutta alitajuisesti meni taas eteenpäin. M. Gorki, äiti. [Juudas] rukoili hyvää ystäväänsä äitiä hoitamaan omaisuuttaan vastuuttomasti. Saltykov Shchedrin, herrat Golovlev ... Pieni akateeminen sanakirja

TILINPÄÄTÖS, vastuuton, vastuuton; (lyhyt maskuliininen ei käytetty) vastuuton, vastuuton. 1. Ei minkään valvonnan alainen, ei velvollisuutta raportoida. Hän oli vastuuttomasti (adv.) vastuussa kaupasta. 2. Ei riipu kohtuullisista näkökohdista,... ... Ushakovin selittävä sanakirja

- (Kreikka). Henkilö, jonka tehtävänä on käydä kauppaa vastuuttomasti toisen henkilön lukuun. Venäjän kielen vieraiden sanojen sanakirja. Chudinov A.N., 1910. ANAGALISTI Henkilö, jolle on uskottu kauppaa toisen henkilön kustannuksella ilman vastuuvelvollisuutta. Selitys... ... Venäjän kielen vieraiden sanojen sanakirja

Vastuuttomasti, tiedostamatta, mekaanisesti, tahattomasti, automaattisesti, mekaanisesti, automaattisesti, mekaanisesti, autopilotti Venäjän synonyymien sanakirja. automaattisesti nähdään automaattisesti Venäjän kielen synonyymien sanakirja. Käytännön opas. M.: Venäjä... Synonyymien sanakirja

Katso tahattomasti... Venäjän synonyymien ja vastaavien ilmaisujen sanakirja. alla. toim. N. Abramova, M.: Russian Dictionaries, 1999. vaistomaisesti, tiedostamatta, tahattomasti; tahattomasti, tiedostamatta, suolistossa, spontaanisti, spontaanisti, tiedostamatta, sokeasti,... ... Synonyymien sanakirja

Kirjat
  • Matka Tšekkoslovakian läpi, J. Marko, M. Peterka, Praha, 1959. Artia. Mukana monia valokuvakuvia. Kustantajan sidos. Kunto on hyvä. Lumottu vaeltaja mistä tahansa maailman maasta, joka syventyy tähän upeaan kirjaan, pystyy... Kategoria: Matkailijoiden muistiinpanoja, muistelmia, tutkimusta Kustantaja: Artia,
  • Hallitus tai Kokoukset Sennajassa, Gennadi Grigorjevissa, Sergei Nosovissa, Pietarissa on yksinkertaisesti fantasmogeenisiä paikkoja. Näitä ovat Sennaya Square. "Sennaya - fantasmagorian kehto". Kirjoittajat itse näyttävät olevan yllättyneitä siitä, mitä heille tapahtui Sennayalla. Ja... Luokka: Klassinen ja moderni proosa Sarja: Aikamme Pietarin kasvot Kustantaja: