Išsaugota talpykla, PHP generuoja miniatiūras lėtai

Klausimo A dalis (100 bounty, apdovanota)
Pagrindinis klausimas buvo, kaip greičiau įkelti šią svetainę. Pirmiausia teko perskaityti šiuos krioklius. Dėkojame visiems už pasiūlymus, kaip analizuoti krioklį. Akivaizdu, kad įvairios čia pateiktos krioklio diagramos yra pagrindinė kliūtis: sukurta PHP miniatiūrų. Dovydo pasiūlyta nesugebėjimas įkelti iš CDN, nes mano svetainė buvo tik 3% greitesnė ir neatsakė į pagrindinę svetainės kliūtį. Laikas paaiškinti mano klausimą ir kitas atlygis:

Klausimo B dalis awarded (100 premijų)
Naujas dėmesys dabar buvo skirtas išspręsti problemą, turinčią 6 jpg vaizdus, ​​kurie sukėlė didžiąją apkrovos vėlavimą. Šie 6 vaizdai yra miniatiūros, sukurtos PHP, mažos ir tik 3 ~ 5 kb, bet įkeliamos gana lėtai. Atkreipkite dėmesį į „laiką iki pirmo baito“ skirtingose ​​diagramose. Problema išliko neišspręsta, tačiau bounty nuvyko į Jokūbą, kuris pataisė antraštės klaidą, kurią pabrėžė „RedBot“: „Jei modifikuotas, nes grąžino sąlyginį prašymą, visas turinys nepasikeitė“.

Klausimo C dalis ▉ (mano paskutinė dosnumas: 250 taškų)
Deja, pakoregavus antraštės REdbot.org klaidą, PHP sukeltų vaizdų sukeltas delsimas liko nepakitęs. Kokie yra šie nedideli girtuokliai? Visa ši antraštės informacija gali siųsti raketas į mėnulį ir atgal. Bet kokie pasiūlymai dėl šios kliūtys labai vertinami ir laikomi galimu atsakymu, nes aš jau septynis mėnesius buvau sulaikęs šią siaurą problemą. Ačiū iš anksto.

[Kai kurios pagrindinės informacijos mano svetainėje: CSS yra viršuje. JS apačioje (jQuery, jQuery UI, nusipirkau meniu awm / menu.js variklius, js variklio skirtukus, video swfobject.js) Antrojo paveikslėlio juodos linijos rodo, kas sukelia atsisiuntimą. Piktas robotas - mano augintinis „ZAM“. Jis yra nekenksmingas ir dažnai laimingesnis.]


Parsisiųsti krioklys: chronologinis | http://webpagetest.org 2019

177
27 янв. Sam yra nustatytas sausio 27 dieną. 2011-01-27 01:29 '11 ne 1:29 2011-01-27 01:29
@ 19 atsakymų

Visų pirma, naudojant šiuos kelis domenus reikia atlikti kelias DNS paieškas. Geriau derinti daugelį šių vaizdų į sprite, o ne platinti prašymus.

Antra, kai įkelsiu jūsų puslapį, matau daugumą blokavimo (~ 1.25) visų.js. Matau tai pradedant (senąja versija) jQuery. Turėtumėte kreiptis į tai iš „Google“ CDN, o ne sumažinti parsisiuntimo laiką , bet visiškai pašalinti HTTP užklausą .

Visų pirma, naujausios jQuery ir jQuery naudotojo sąsajos bibliotekos gali remtis šiais URL (žr. Šį įrašą, jei įdomu, kodėl aš praleidžiau http: :

 //ajax.googleapis.com/ajax/libs/jquery/1.4.4/jquery.min.js //ajax.googleapis.com/ajax/libs/jqueryui/1.8.9/jquery-ui.min.js 

Jei naudojate vieną iš standartinių „jQuery“ naudotojo sąsajos temų, galite ištraukti CSS ir vaizdus iš „Google“ CDN .

Optimizavus „jQuery“ prieglobą, taip pat turėtumėte derinti awmlib2.js ir tooltiplib.js į vieną failą.

Jei išspręsite šiuos dalykus, turėtumėte matyti didelį pagerėjimą.

61
27 янв. Atsakymą pateikė Dave Ward 27 d. 2011-01-27 12:12 '11, 12:12, 2011-01-27 12:12

Panašią problemą turėjau prieš kelias dienas, ir aš rasiu galvą. Tai „JavaScript“ papildinys, leidžiantis atsisiųsti visus paralys js failus. Tikiuosi, kad tai padės.

17
31 янв. atsakymas suteiktas 000 31 sausio. 2011-01-31 00:44 '11 prie 0:44 2011-01-31 00:44

Aš toli nuo ekspertų, bet ...

Dėl šios priežasties „sąlyginis„ If-Modified-Kadangi “prašymas grąžino visą turinį nekeičiant.“ ir mano komentarai.

Kodas, naudojamas miniatiūrų kūrimui, turėtų patikrinti, ar:

  • Ar yra miniatiūros talpyklos versija.
  • Ar laikinoji versija yra naujesnė už originalų vaizdą.

Jei kuri nors iš jų yra klaidinga, miniatiūra turėtų būti generuojama ir grąžinta, nesvarbu. Jei abu yra teisingi, atlikite šiuos patikrinimus:

  • Ar yra HTTP_IF_MODIFIED_SINCE antraštė
  • Ar paskutinis pakeistas talpyklos laikas yra toks pat kaip HTTP_IF_MODIFIED_SINCE

Jei kuri nors iš jų yra klaidinga, turite grąžinti talpyklą.

Jei abi jos yra teisingos, grąžinama 304 „http“ būsena. Nesu tikras, ar tai yra būtina, bet aš asmeniškai grąžinu „Cache-Control“, „Expires“ ir „Last-Modified“ antraštes kartu su 304.

Kalbant apie „GZipping“, man buvo pranešta, kad nereikia GZip vaizdų, todėl ignoruokite šią mano komentaro dalį.

Redaguoti: nepastebėjau jūsų skelbimo papildinio.

 session_cache_limiter('public'); header("Content-type: " . $this->_mime); header("Expires: " . gmdate("D, d MYH:i:s", time() + 2419200) . " GMT"); // I'm sure Last-Modified should be a static value. not dynamic as you have it here. header("Last-Modified: " . gmdate("D, d MYH:i:s",time() - 404800000) . " GMT"); 

Taip pat esu įsitikinęs, kad jūsų kodas turėtų patikrinti HTTP_IF_MODIFIED_SINCE antraštę ir atsakyti į jį. Tiesiog įdiekite šias antraštes ir jūsų .htaccess failas nesuteiks norimo rezultato.

Manau, kad jums reikia kažko panašaus:

 $date = 'D, d MYH:i:s T'; // DATE_RFC850 $modified = filemtime($filename); $expires = strtotime('1 year'); // 1 Year header(sprintf('Cache-Control: %s, max-age=%s', 'public', $expires - time())); header(sprintf('Expires: %s', date($date, $expires))); header(sprintf('Last-Modified: %s', date($date, $modified))); header(sprintf('Content-Type: %s', $mime)); if(isset($_SERVER['HTTP_IF_MODIFIED_SINCE'])) { if(strtotime($_SERVER['HTTP_IF_MODIFIED_SINCE']) === $modified) { header('HTTP/1.1 304 Not Modified', true, 304); // Should have been an exit not a return. After sending the not modified http // code, the script should end and return no content. exit(); } } // Render image data 
12
09 февр. Atsakymą pateikė James 09 Feb. 2011-02-09 16:40 '11 at 16:40 2011-02-09 16:40

Wow, sunku paaiškinti dalykus naudojant šį vaizdą. Tačiau čia yra keletas bandymų:

  • 33-36 yra pakraunami, nes jie yra dinamiškai įkelti į swf, o swf (25) pirmą kartą visiškai pakraunama prieš įkeliant bet kokį papildomą turinį.
  • 20 ir 21 failai gali būti (aš nežinau, nes nežinau jūsų kodo), kurie yra įkeliami naudojant all.js (11), bet 11, jis laukia, kol visas puslapis (ir turtas) bus įkeltas (tai reikia pakeisti dom domene)
  • 22-32 failai yra pakraunami šiose dviejose bibliotekose.
6
27 янв. atsakymas duodamas pakabintas 27 sausis 2011-01-27 01:39 '11 at 1:39 2011-01-27 01:39

Pabandykite paleisti Y testus! Lėtai ir greičiau spustelkite savo svetainę / puslapį ir sekite instrukcijas, kad išsiaiškintumėte galimas našumo kliūtis. Jei gausite daugiau taškų Y! Lėtas arba Page Speed.

Šie testai parodys, kas yra negerai ir ką keisti.

4
27 янв. Livingston Samuel atsakymas, sausio 27 d 2011-01-27 11:55 '11 at 11:55 2011-01-27 11:55

Taigi, ar jūsų PHP scenarijus generuoja miniatiūras kiekvieną kartą, kai puslapis įkeliamas? Pirma, jei vaizduose, kurie rodomi miniatiūroje, dažnai nepasikeičia, galite reguliuoti talpyklą taip, kad jų nereikėtų analizuoti kiekvieną kartą, kai puslapis įkeliamas? Antra, imagecopyresampled() jūsų PHP scenarijus naudoja kažką panašaus į imagecopyresampled() kad sukurtumėte miniatiūras? Šis ne trivialus žemyninis pavyzdys ir PHP scenarijus nieko neatsisakys, kol baigsis jo sumažinimas. Naudojant „ imagecopymerged() vaizdo kokybė sumažės, tačiau procesas bus paspartintas. Ir kiek gabalų darote? Ar šios miniatiūros yra 5% pradinio vaizdo dydžio arba 50%? Tikriausiai, didesnis originalo atvaizdo dydis sukelia sulėtėjimą, nes PHP scenarijus turi gauti originalų vaizdą atmintyje, kol jis negali suspausti ir išleisti mažesnį miniatiūrą.

4
07 февр. atsakymas pateikiamas MidnightLightning 07 vasario mėn. 2011-02-07 23:31 '11, 11:31 val. 2011-02-07 23:31

Radau jūsų svetainės URL ir iš pagrindinio puslapio patikrinau atskirą jpg failą. Nors paleidimo laikas dabar yra pagrįstas (161 ms), jis laukia 126 ms, o tai per daug.

Jūsų naujausios antraštės yra 2011 m. Sausio 1 d., 12:00:00 GMT, kuri atrodo pernelyg „apvali“, kad būtų tikra generavimo data; -)

Kadangi „Cache-control“ yra „public, max-age = 14515200“, savavališkos antraštės su paskutiniu pakeitimu gali sukelti problemą po 168 dienų.

Bet kokiu atveju tai nėra tikroji vėlavimo priežastis.

Jūs turite patikrinti, ką jūsų miniatiūrų generatorius veikia, kai miniatiūra jau egzistuoja, ir kad atvaizdo tikrinimas ir pristatymas gali užtrukti.

Galite įdiegti „ xdebug “ scenarijų profiliui ir pamatyti, kur yra kliūčių.

Galbūt visa tai naudoja sistemą arba nieko nesusijungia prie duomenų bazės. Kai kuriuose serveriuose mačiau labai lėtą mysql_connect (), daugiausia dėl to, kad jie buvo prijungti naudojant TCP, o ne lizdą, kartais su kai kuriomis DNS problemomis.

Suprantu, kad čia negalite skelbti savo mokamo generatoriaus, bet bijau, kad yra per daug galimų problemų ...

4
24 февр. Capsule atsakymas 24 vasaris 2011-02-24 02:14 '11 at 2:14 am 2011-02-24 02:14

Jei nėra jokios tikrai geros priežasties (dažniausiai ne), jūsų atvaizdai neturėtų būti vadinami PHP vertėjais.

Sukurkite perrašymo taisyklę savo žiniatinklio serveriui, kuris tiesiogiai įkelia vaizdą, jei jis yra failų sistemoje. Jei taip nėra, nukreipkite PHP scenarijų, kad generuotumėte vaizdą. Kai redaguojate vaizdą, pakeiskite vaizdo failo pavadinimą, kad priverstumėte vartotojus, turinčius talpyklą, gauti naujai redaguotą vaizdą.

Jei jis neveikia, bent jau dabar jūs neturite nieko bendro su vaizdų kūrimo ir testavimo būdu.

4
25 февр. atsakymas pateikiamas Goran Jurić 25 vasario mėn. 2011-02-25 00:27 '11 at 0:27 2011-02-25 00:27

Tiesiog atspėkite, nes tokia analizė reikalauja daug A / B testų: jūsų domeno „.ch“ atrodo sunku pasiekti (ilgos žalios juostos prieš pirmąjį baitą).

Tai reiškia, kad .ch svetainė yra prastai išdėstyta arba kad jūsų paslaugų teikėjas neturi gerų maršrutų.

Atsižvelgiant į diagramas, tai gali paaiškinti didelę sėkmę.

Pastabos pusėje yra šis kietas įrankis, padedantis išsiaiškinti, priklausomai nuo jūsų išteklių išteklių atsisiuntimo tvarkos.

4
27 янв. Jerome WAGNER atsakymas 2011-01-27 01:41 '11 prie 1:41 2011-01-27 01:41

Sužinokite, kaip naudoti PHP sesijos duomenis. Galima (galbūt), kad vaizdo generavimo PHP scenarijus laukia seanso duomenų užrakto, kurį užblokuoja pagrindinio puslapio, kuriame vis dar pateikiami vaizdai, ar kitų vaizdų atvaizdavimo scenarijų. Tai leistų visai „JavaScript“ / naršyklės optimizacijai beveik nesvarbu, nes naršyklė tikisi serverio.

PHP blokuoja sesijos duomenis kiekvienam scenarijui, kuris yra paleistas nuo to momento, kai sesija prasideda iki momento, kai scenarijus baigiasi, arba kai sesija_write_close () yra vadinama. Tai efektyviai serializuoja dalykus. Peržiūrėkite sesijų PHP puslapį, ypač tokias pastabas.

3
12 февр. Atsakymą pateikė Ricardo Pardini , vasario 12 d. 2011-02-12 02:31 '11 at 2:31 am 2011-02-12 02:31

Tai tik laukinis atspėjimas, nes aš nežiūrėjau į jūsų kodą, bet manau, kad sesijos gali vaidinti čia, iš PHP vadovo straipsnio apie session_write_close() :

Sesijos duomenys paprastai išsaugomi po to, kai jūsų scenarijus buvo baigtas be poreikio skambinti session_write_close (), bet kadangi sesijos duomenys yra užrakinti, kad būtų galima vienu metu rašyti tik vieną scenarijų, bet kuriuo metu gali dirbti sesijoje. Kai naudojate rėmelius su sesijomis, tai yra šios užrakto priežastis. Jūs galite sutrumpinti laiką, per kurį reikia įkelti visą sesijos nutraukimą, kai tik atliksite visus sesijos kintamųjų pakeitimus.

Kaip jau sakiau, aš nežinau, ką daro jūsų kodas, bet šie grafikai atrodo keistai įtartini. Turėjau panašią problemą, kai kodavau kelių failų aptarnavimo funkciją , ir turėjau tą pačią problemą. Kai aptarnaujate didelį failą, negalėjau dirbti su daugelio puslapių funkcijomis ir negalėjau atidaryti kito puslapio, kol atsisiuntimas baigtas. Skambinimas session_write_close() fiksuotas ir mano problemos.

3
05 марта '11 в 0:38 2011-03-05 00:38 atsakymą pateikė „ Alix Axel“ kovo 05'11 d. 0:38 2011-03-05 00:38

Ar bandėte pakeisti php sukurtus „thumnails“ su įprastais vaizdais, kad pamatytumėte, ar yra skirtumas? Problema gali būti aplink - jūsų php kodo klaida, dėl kurios miniatiūra bus atkuriama kiekvieną kartą, kai skambinate serveriui - kodo vėlavimas (miegas ()?) Susijęs su laikrodžio problema - kietojo disko problema, kuri sukelia labai blogą varžybų būklę, nes viskas miniatiūros įkeliamos / generuojamos tuo pačiu metu.

2
25 февр. atsakymą pateikė Jerome WAGNER 25 vasaris. 2011-02-25 05:13 '11 at 5:13 am 2011-02-25 05:13

Manau, užuot naudojęs šį miniatiūrinį scenarijų generatorių, TinySRC turėtų suteikti bandymą greitai ir drumstai parengti eskizą. Ji yra labai paprasta ir paprasta naudoti API, kurią galima naudoti kaip: -

http://i.tinysrc.mobi/ [aukštis] / [plotis] /http://domain.tld/path_to_img.jpg

[plotis] (pasirinktinai): - tai plotis pikseliais (kuris viršija adaptyvųjį arba šeimos dydį). Jei priešdėlis yra "-" arba "x", jis atima arba sumažina tam tikro dydžio procentą.

[aukštis] (pasirinktinai): - tai aukštis pikseliais, jei taip pat yra plotis. Ji taip pat nepaiso adaptyvaus arba šeimos kalibravimo ir gali turėti prefiksą „-“ arba „x“.

Čia galite peržiūrėti API santrauką .


DUK

Ką man kainavo tinySrc?

Nieko

Kada aš galiu pradėti naudoti tinySrc?

Dabar

Kiek patikima yra paslauga?

Mes negarantuojame „tinySrc“ paslaugos. Tačiau ji veikia su pagrindine debesų infrastruktūra , todėl ji užtikrina aukštą prieinamumą visame pasaulyje. Tai turėtų pakakti visiems jūsų poreikiams.

Kaip greitai?

tinySrc saugo atmintyje esančių vaizdų dydį ir mūsų duomenų saugyklą iki 24 valandų . Dėl to paslaugos naudotojų požiūriu yra neįtikėtinai greito . (Ir sumažina serverio apkrovą kaip gerą šalutinį poveikį.)


Sėkmės. Tiesiog sakinys, nes u mums nerodomas kodas: p

2
04 марта '11 в 23:43 2011-03-04 23:43 atsakymą Salmanas Abbasas pateikė kovo 4 d. 11 val. 11.43 val. 2011-03-04 23:43

Kai tik kai kurios naršyklės įkelia tik 2 lygiagrečius atsisiuntimus kiekvienam domenui, ar galėtumėte pridėti papildomų domenų, kad būtų apibrėžti prašymai nuo dviejų iki trijų skirtingų kompiuterio pavadinimų. pvz. 1.imagecdn.com 2.imagecdn.com

2
11 марта '11 в 19:32 2011-03-11 19:32 atsakymas suteiktas Tom 11 d. 11 val. 19:32 2011-03-11 19:32

Dauguma lėtos problemos - jūsų TTFB (laikas iki pirmojo baito) yra per didelis. Tai sudėtingas klausimas, nesusijęs su jūsų serverio konfigūracijos failais, kodu ir pagrindine aparatine įranga, bet galiu matyti, kad kiekvienas prašymas yra siaubingas. Turite per daug žalių juostų (blogų) ir labai mažų mėlynų juostų (gerų). Galite šiek tiek nutraukti sąsajos optimizavimą, nes manau, kad šioje srityje atlikote daug. Nepaisant to, kad „ 80–90% galutinio vartotojo atsako laiko praleidžiama sąsajoje “, manau, kad jūsų backend.

TTFB yra „backend“, „server stuff“, „pre-exit“ apdorojimas ir „handshaking“.

Kodo vykdymo laikas lėtiems failams ieškoti, pvz., Lėtos duomenų bazės užklausos, laikas įvesti ir išeiti iš funkcijų / metodų lėtoms funkcijoms ieškoti. Jei naudojate PHP, pabandykite „ Firephp“ . Kartais atsitinka, kad paleidžiant arba inicijuojant paleidžiama viena ar dvi lėtos užklausos, pavyzdžiui, traukiant seanso informaciją ar autentiškumą ir kas ne. Užklausos optimizavimas gali sukelti gerų rezultatų. Kartais kodas veikia naudojant PHP prepend arba spl autoload, kad jis veiktų visiems. Kitais atvejais jis gali būti konfigūruojamas apache conf ir nustatymas, kuris išsaugo dieną.

Ieškokite neveiksmingų kilpų. Ieškokite lėtų talpyklų arba lėtai I / O dėl blogų diskų arba didelės vietos diske. Ieškokite atminties naudojimo ir kas yra ir kur. Paleiskite „webpagetest“ pakartotinį pakartotinį bandymą iš 10, veikiančių tame pačiame paveikslėlyje ar faile, naudojant tik pirmą vaizdą iš skirtingų vietų visame pasaulyje, bet ne toje pačioje vietoje. Ir perskaitykite prieigos ir klaidų žurnalus, per daug kūrėjų ignoruoja ir remiasi tik ekrano klaidomis. Jei jūsų žiniatinklio priegloboje yra palaikymas, paprašykite jų pagalbos, jei jie gali ne mandagiai paprašyti jų pagalbos, nesėkmingai.

Galite išbandyti „DNS Prefetching“, kad galėtumėte susidoroti su daugeliu domenų ir išteklių, http://html5boilerplate.com/docs/DNS-Prefetching/

Ar jūsų serveris yra geras / tinkamas serveris? Kartais geresnis serveris gali išspręsti daugelį problemų. Aš esu pigios įrangos gerbėjas , programuotojai yra brangūs, jei turite galimybę ir pinigus atnaujinti serverį, ir / arba naudoti CDN, pvz., Maxcdn arba cloudflare ar panašius.

Sėkmės!

(ps aš neveikiu nė vienoje iš šių kompanijų. Taip pat nuoroda į aukščiau pateiktą „debesų atspalvį“ parodys, kad TTFB nėra toks svarbus, aš jį ten išmetiau, kad galėtumėte gauti kitą variantą.)

1
24 июля '12 в 4:34 2012-07-24 04:34 atsakymą pateikė Anthony Hatzopoulos liepos 24 d., 12 val.

Ar bandėte nustatyti kelis NGINX tinklo serverio sub-domenus, skirtus statiniams duomenims, pvz., Vaizdams ir stiliaus lapams, teikti? Šiame skyriuje galima rasti kažką naudingo.

1
22 февр. atsakymas pateikiamas nefo_x 22 vasaris 2011-02-22 03:49 '11 at 3:49 2011-02-22 03:49

Kalbant apie laukiančias miniatiūras, pabandykite įdėti skambutį () iškart po paskutinio skambučio į antraštę () scenarijaus miniatiūrų generavimo metu. Po to atkurkite savo krioklio diagramą ir pažiūrėkite, ar vietoj antraščių yra uždelsimas ant kūno. Jei taip, reikia ilgai pažvelgti į logiką, kuri generuoja ir / arba atvaizduoja vaizdo duomenis.

Scenarijus, kuris apdoroja miniatiūras, tikiuosi, naudos tam tikrą talpyklą, kad bet kokie veiksmai, atliekami ant jūsų atvaizduojamų vaizdų, įvyktų tik tada, kai tai yra absoliučiai būtina. Atrodo, kad kai kurie brangūs veiksmai atliekami kiekvieną kartą, kai aptarnaujate miniatiūras, kurios atideda skripto išėjimą (įskaitant antraštes).

1
28 февр. Atsakymą pateikė AR Younce 28 vasaris. 2011-02-28 22:11 '11 10:11 val. 2011-02-28 22:11

Visų pirma, jums reikia tvarkyti „ If-Modified-Since prašymus ir taip gerai, kaip sakė Jamesas. Ši klaida nurodo, kad: „Kai paklausiu jūsų serverio, ar šis vaizdas pasikeitė nuo paskutinio karto, jis siunčia visą vaizdą vietoj paprasto„ taip “/„ ne “.