PHP-Fusion Mods
Navigacija
Apsauga
Apsauga Neleista registracija: 45216
Å iandien: 37
PrisijungÄ™ nariai
» SveÄ�ių: 2
» Narių: 0

» Viso narių: 10,235
» Naujausias: ruslanas tuk

Prisijungimų istorija:
Zbigniew@ 1 Diena
tabuxnepamenu
sanpernepamenu
CepelinasXnepamenu
VV91DDnepamenu
Minusnepamenu
priezilviciunepamenu
EdvinasG1337nepamenu
rolandas94nepamenu
Edis2nepamenu
klubogerbejasnepamenu
Miskinisnepamenu
Pask. modai
Prisijungti
Vardas

Slaptažodis



Dar ne narys?
Registruotis.

Pamiršai slaptažodį?
Prašyk naujo!.

Naujausi prašymai
[L] testas
Narių apklausa
Ar dar kuriate tinklalapius?

Ne
Ne
0% [0 Balsai]

Taip
Taip
88% [7 Balsai]

Naudojuosi socialiniais tinklais
Naudojuosi socialiniais tinklais
13% [1 Balsas]

Balsai: 8
Kad galÄ—tum balsuoti, turi prisijungti.
PradÄ—ta: 2022-05-29 19:54
Shoutbox
You must login to post a message.

2026-05-29 21:26
Ši sistema turi daug patobulinimų kurie kurti mūsų Šypsosi Buvo planuose pereiti ant v9, bet ....

2026-05-11 16:51
Sveiki. Norėjau pasveikinti jus su atkaklumu arba ištverme. Tai viena iš dviejų paskutinių svetainių, paremtų v7. Ar negaila švaistyti ilgametės patirties ir pereiti prie v9?

2025-07-13 17:07
svx, smagu kad dar atsiranda naujų narių Šypsosi2

2024-03-07 22:13
Oj Tabux… apkabin�iau už tą moderatorių �

2024-02-22 17:40
Å ypsosi2 jo buvo laikai.. Senukai jau mes. Bega laikas greiciau nei noretusi. Smagu matyti kad uzsuka seni nariai, ne as vienas Å ypsosi

Shoutbox Archive
Peržiūrėti temą
PHP-Fusion Mods :: PHP-Fusion modifikacijų forumas :: Modifikacijų, įskiepių diegimas
 Spausdinti temÄ…
v7 Optimizacijos
Elektronix
#1 Spausdinti praneÅ¡imÄ…
parašyta 2010-04-28 14:44
Pradinukas



Reputacija: 0

Pranešimai: 27
Įstojo: 2008-05-10

Gal kas papasakotumet bent keleta be 1 ir 5 punktu ,kaip reik padaryt ? http://www.*a?*/t...vimas,s174

?is straipsnis tiems, kurie turi didelius projektus paremtus Php-Fusion sistema. Tai yra, kai ára?ø skaièius lentelëse pradeda vir?yti 100k.
Taigi, bedarydamas updeitus ?iam tinklapiui, vienas jø yra pabandyti já ka?kiek optimizuoti. Kadangi ?itas didelis dramblys pasidarë labai lëtas kaip pradëjo valgyti lenteles su 500k ára?ø.

Taigi, pirmiausia, ap?velgsiu jau prie? metus, porà ar dar seniau padarytø sistemos atnaujinimø optimizacijos at?vilgiu.

PA?ENGUSIEMS VARTOTOJAMS (advanced-users)


1.Taigi, pirmasis ?ingsnis bûtø - "spauskime srautà" (maincore.php):
ob_start();



eilutës keitimas á
ob_start(ob_gzhandler);




?is ?ingsnis mums leid?ia persiøsti tinklapio srautà vartotojui suspaustu pavidalu. Tai gana ?enkliai átakoja krovimo laikà.
Beje, ádomumo dëlei yra ir kitø srauto spaudimo bûdø, ne tik "ob_gzhandler", taèiau ?is yra, matyt, populiariausias.

2.Antrasis etapas - "sudëkime indeksus"
Kad suprastumëte, kada ir kur tai daryti, nëra sunku. Tiesiog per tinklapio failus pasileiskite koká TC ar Notepad++ kuris jums i?mestø daugiausiai(pagal svarbà, nuo svarbiausio):
1."WHERE" (laukeliai pagal kurios ie?kome - SVARBIAUSIAS ir esminis 2 etapo faktorius)
2."group_by" (kai grupuojame ára?us naudodami kelias lenteles)
3."ON" (kai norime susieti lenteles)
4."AS" + "count()", "sum()" ir t.t. (u?klausos mysql dalys, kai sumuojame, skaièiuojame ar pan. laukelio ára?us dalyje "SELECT")
5."SELECT" COL (?is ?ingsnis aktualus tik ávykd?ius 3 etapà ir pakeistus u?klausas i? "SELECT *" á "SELECT COL(s)"
dalyse naudojamus laukelius.
Taigi, prisijungæ prie PhpMyAdmin ar kokio kito duom. baziø valdymo pulto, tiesiog sudëkime "INDEX" tipo raktus(KEY's) daugiausiai naudojamiems laukeliams.
Kaip pavyzdá tarkim, galime paimti "online_ip" i? lentelës "{prefix}_online", bei "user_ip" i? lentelës "{prefix}_users". Jeigu esame ásidiegæ SIP ar kokias kitas su IP suri?tas saugumo sistemas, tikrai da?nai naudosime "WHERE" u?klausà ?iems laukeliams. Tad sudëti indeksus ?iems lenteliø laukeliams yra pravartu.
Toliau i? aktualiø bûtø galima paminëti:
"thread_id" lentelëje "posts" (kadangi da?nai grupuojame postus pagal temà)
"user_name" lentelëje "users" (da?nai ie?kome vartotojo vardo)
ir daugelá kitø.
Esmë paprasta - sudëkite kuo daugiau á paminëtus punktus patenkanèiø indeksø. ?inoma persistengti neverta, nes vieno indekso teikiama nauda su kiekvienu nauju lentelës indeksu ma?ëja.
Kritiniais variantais toks indekso padëjimas tinkamoje vietoje gali suma?inti tinklapio krovos laikà nuo 15-16 sekund?iø, iki vos 1-2 sekund?iø.

3.Treèio etapo esmë - "NESIRINKIME nenaudojamø laukeliø":
?io punkto esmë manau labai puikiai suprantama - kalbu apie u?klausos, á duom. bazë, dalá "SELECT (laukeliø sàra?as)". Jeigu Jûsø tinklapis pilnas SELECT * tipo u?klausø - vadinasi esate tikrai neoptimizavæs tinklapio ir bereikalingai ?vaistote serverio resursus.
Pagal idëjà, "SELECT laukelis1,laukelis2 " ir t.t. turëtø bûti tik tie lentelës laukeliai, kuriuos i?kviesite ?emiau seksianèioje funkcijos implementacijoje, ar bet kokiame kitame informacijos i? duom. bazës i?transliavime á tinklapio HTML kodà vartotojui.

Tinkamai pasinaudojus ?iuo punktu, tinklapio krovos laikà galite suma?inti iki 10 kartø. Na bet jeigu ka?kiek ribojimo jau buvo, indeksai irgi dalinai sudëti buvo, tai galite tikëtis 2-4 kartus greitesnio krovimo.

4.Ketvirtas etapas - "Nesaugokime ISTORIJOS - archyvuokime jà"
?i funkcija labai aktuali tiems kas stebi lankytojø srautà - i? kokiø tinklapiø lankytojai ateina, kiek per?iûrø padaro, ar dar kada lankësi pastaruoju metu ir t.t.
Prad?ioje galbût nieko ir nejausime, taèiau tinklapiui esant populiaresniam po pusmeèio ar metø, mûsø log'ø lentelës pradës daryti griozdi?kos, i? nejuèiomis nepajusite kaip tinklapio krovos laikas pradës ilgëti. To esmë, ilgos paie?kos didelës apimties lentelëse. Taip èia duoda naudos bûtinø laukeliø SELECT dalyje apibrë?imas, indeksø sudëjimas ir t.t., bet 'net ir geriausias vairuotojas neávarys ma?inos á u? ma?inos plotá siauresná gara?à'. Todël, geriausia tokiu atveju i?eiti - failo pabaigoje pasira?yti papildomà u?klausà, kuri, tarkim Jûsø lentelei vir?ijus 30k (30.000) ára?ø dydá, automati?kai perkeltø juos á archyvine lentelæ, pvz. "{prefix}_users_visited_pages_ARCHIVE", tokiu atveju archyviniai duomenys visuomet bus i?saugoti, taèiau tikrai neátakos tinklapio darbo, be to darant duom. bazës kopijas, nereiks siøstis kaskart(u?teks tik vienà - pradiná kartà) mil?ini?ko dyd?io bylø - U?ARCHYVUOTØ lenteliø turinys tampa statiniu ir nekeièiamu. Taèiau papildomo failo pagalba, galite suteikti administratoriui kartas nuo karto pasi?iûrëti á tà lentelæ - u?klausos bus ilgos, bet jis tai ?inos.

5.Penktas etapas - "Optimizuokime lenteles":
?io etapo prasmë paprasta - visados nepamir?kime pasinaudoti "phpmyadmin" suteikiama funkcija "optimize" duom. bazës lentelëms. Da?nai atsitinka, kad dël ry?io trukiø, ar serverio trikd?iø ar ?iaip kokiø problemø ásivelia klaidø ir atsiranda duomenø perteklius duom. bazës lentelëje, kartais perteklius gali bûtø ir keliasde?imt megabaitø, jeigu lentelës apimtis didelë ir ji buvo ilgà laikà neotimizuota. Optimizuodami lentelæ, i?sprend?iame ?ias 'mini' problemas ir kartu laimime tinklapio krovos laiko. :)

6.?e?tas etapas - "Naudokime LIMIT X funcija":
Bûtinai rekomenduoju naudoti LIMIT funkcija kur tik ámanoma. T.y. verta aukoti tiksumà vardan u?klausos laiko.
Tipinis pavyzdys - u?klausos sutapimø kiekis atliekant paie?kà tarp postø. Visø pirma jeigu turime tarkim 500k ára?ø postø lentelæ, paie?kos rezultatams rekomenduojama gra?inti ne daugiau kaip 100 ára?ø per 5-iuose - 10-tyje puslapiø.
Tai yra ágyvendinta Php-Fusion v7 versijoje, taèiau èia pamir?ama smulkmena - kaip viena eilutë yra pateikiama informacijà apie bendrà sutapimø skaièiø - sakoma "rasta 95521 sutapimai vietoje 100 maksimaliai galimø". TAI KLAIDINGAS SPRENDIMAS[/u]. Verta paaukoti tikslumà ir gra?inti atsakymà pvz. "rasta vir? 500 sutapimø vietoje 100 maksimaliø leistinø". Vartotojui informacijos pilnai u?tenks, taèiau mes galësime i?lo?ti sistemos resursø bema? de?imteriopai ádëjæ á mûsø rezultatø skaièiavimo u?klausos pabaigà kodà "[b]LIMIT 501".

7.Septintas etapas - "Protingai pasirinkime ORDER BY reik?mes":
?io etapo esmë - nedëkite ORDER BY rû?iavimo sql u?klausose, pagal dideliø lenteliø ne pirminius(PRIMARY KEY/ UNIQUE INDEX) atributus. T.y. jeigu pvz. jungiame u?klausà i? keliø lenteliø, kur vienos lentelës dydis yra 10 tûkst. atributø, o kitos lentelës dydis - 500 tûkst. atributø, ir abi lentelës turi datos laukelá, pagal kurá Jûs norite rû?iuoti savo rezultatus, tai esant galimybei verta aukoti dalá tikslumo i?lo?iant u?klausos laikà da?nai net ir de?imteriopai ar ?imteriopai.
Php-Fusion sistemos konkretus pavyzdys bûtø paie?kos sistema:
ORDER BY p.post_datestamp



Verta keisti á:
ORDER BY t.thread_detestamp



Nors ir prarandame tikslumo, esant 10k temø ir 500k prane?imø, mes i?lo?iame u?klausos laiko ?imteriopai.

8.A?tuntas etapas - "Rinkimës ma?esniø lenteliø laukelius":
Logika paprasta - tarkime ie?kome jungdami tris lenteles ".DB_POSTS." p, ".DB_THREADS." t ir ir ".DB_FORUMS." f. Pirmosios dydis yra 500 tûkst. eiluèiø, antrosios - vos 10 tûkst, treèiosios - vos 20 ára?ø.
Todël SELECT dalyje pakeitæ frazæ:
"SELECT p.forum_id, p.thread_id, p.post_id, ..."
Fraze:
"SELECT f.forum_id, t.thread_id, p.post_id, ..."
Galime i?lo?ti iki 5-10 proc. sistemos resursø. Priklausomai nuo eiluèiø lentelëse kiekybinio santykio.


PATYRUSIEMS VARTOTOJAMS (expert-users)


9.Devintas etapas - "Sekime u?klausø "Load time".
?á dalykà ágyvendinti gana paprasta - pasiimkite bet kurià i? microtime() funkcijà reazijuojanèiø mikro-laiko laikmaèiø skriptø(funkcijø) ir tiesiog saugokite:
--> Bendrà tinklapio krovos laikà ("START" prad?ioje po pirmøjø eiluèiø maincore.php faile [PRIE? visas mysql u?klausas ir bet kokias skaièiavimo funkcijas], "END" pabaiga theme.php footer dalies pabaigoje [PO visø mysql u?klausø ir bet kokiø skaièiavimo funkcijø])
--> Kiekvieno modulio krovimo laikà (startinis laikas fiksuojamas i?kart po "opentable()", pabaigos laikas - eilutë prie? closetable() funkcijà)
--> Kiekvienos u?klausos krovos laikas (fiksuojama prie? ir i?kart PO u?klausos)

Taip i?sivedæ á ekranà visus krovos laikus, galësite nesunkiai matyti kuriose bûtent vietose susidaro "tinklapio butelio kakliukai" arba "silpnieji ta?kai". Nesunkiai analizuodami gautà informacijà galime nuspræsti kà daryti su lëtomis u?klausomis(pirmiausia, ?inoma jas pabandæ kiek ámanoma optimizuoti):
a)Retinti jø i?kvietimà (rodysime jà kas kelintà kartà)
b)Apskritai atsisakyti ?iø u?klausø ar funkcijø
c)Ie?koti tobulesnës sistemos ar modifikacijos, kuri atliktø tà patá darbà su kur kas geriau paruo?ta duomenø struktûra ir saugojimu
d)Saugoti funkcijos rezultatà, ir kviesti jà reèiau.
e)Keisti atsakymu tipà (jeigu kalbame apie dbcount(), tai keièiame á "DESC LIMIT 1");
f)Ke?uoti funkcijos duomenis.

Bûtent paskutiná etapà, a? ir rekomenduoèiau - jo principas paprastas. Tarkim norime ?inoti kiek vartotojas para?ë komentarø: jeigu duomenø lentelë nëra didelë, tai mums nëra svarbu kaip tie duomenys bus gaunami. Taèiau lentelei estint gana didelei, tai jau tampa aktualu, nes yra faktinis skaièiavimo nuostolis. Todël tokiu atveju, geriausias sprendimas - "skaitliukas", kuris para?ius kiekvienà naujà komentarà saugotø já vartotojo ára?æ vartotojø lentelëje. Tokiu atveju vietoje ilgo skaièiavimo, atsakymà gauname vienu paprastu u?klausimu.

Taip pat galime keisti atsakymo tipà - tarkime norime ?inoti kiek mûsø tinklapyje yra ?inuèiø. Jø yra keli ?imtai tûkstanèiø, ir ten +-keli tûkstanèiai nieko nerei?kia - atsakymus galime apvalinti. Tokiu atveju, vietoje ilgai trunkanèio skaièiavimo su dbcount() galime tiesiog pakeisti mûsø u?klausà á u?klausà su pabaiga "DESC LIMIT 1". Tokiu atveju i?rinksime naujausià duomenø bazës ára?à toje lentelëje vos vienu u?klausimu ir taupysime krovos laikà.

10.De?imtas patarimas - "Ke?uokime viskà kà galime"
Ilgos ir didelës u?klausos - tikras galvos skausmas dideliems portalams, todël paprastas to sprendimas yra tiesiog kuo didesnis u?klausø ke?avimas:
1. Ke?uokime vartotojø paie?kos rezultatus (tai aktyviai ágyvendinama daugelyje kitø TVS - pvz. "Invision Power Board" ar "phpBB")
2. Ke?uokime aktyvius vartotojus - kam kaskart daryti paie?kas lentelëje su 80 proc. 'mirusiø vartotojø', darykime jas tarp 'gyvøjø'. Na o miræs á tarp gyvøjø bus automati?kai átrauktas kai dar kartà prisijungs.

3. Ke?uokime postø skaièiø per parà, dienà, ar bendrà:
Algoritmas: Turbût ?iam punktui daliai ?moniø gali kilti algoritmo klausimas, na argoritmo sudëtingumas èia yra tiesionis O(n), tad resursø visi?kai nebenaudoja, ir skaièiuojame pasinaudodami "rû?iavimas eile" rû?iavimo metodu.
Tam turime bûti susikûræ papildomà duom. bazës lentelæ, pvz.:
"{prefix}_last_day_posts_cache (toliau DB_PCACHE)". su tokiu VIENINTELIU laukeliu:
Name: post_time
Type: timestamp
Default: [V] CURRENT_TIMESTAMP
Key: primary

Pseudokodas:
/* Ára?ymas */
if(Vartotojas para?o prane?imà temoje) {
then
if(egzistuoja lentelëje ".DB_PCACHE." ára?ø senesniø nei 24 valandos) {
then i?triname visus senesnius nei 24 valandos ára?us i? mûsø ".DB_PACHE." lentelës;
}
then
Áterpiame tu?èià ára?à á mûsø lentelæ ".DB_PCACHE.";
/* Mysql atveju tai bûtø tiesiog komanda "INSERT INTO ".DB_PCACHE." () VALUES ()" */
}
/* Skaièiavimas */
rezultatas := SUMA visø ára?ø tenkinanèiø sàlygà ("DB_PCACHE" LENTELËJE): post_time > time();





4.Ke?uokime nariø postø, komentarø, shoutø ar dar kokios kitos veiklos vykdymà.
5. Ke?uokime nuotraukas, kaip tai daro TinyMCE (imagelist.js) bei vanden?enklintas nuotraukas(watermarked), kaskart taupysime serverio resursus.
6. Negeneruokime to paties skripto rezultato keletà kartà - geriau saugokime já. Tarkim super sudëtingas vartotojo apsaugos kodà - kur kas protingiau já yra tiesiog saugoti duom bazëje, o skriptu bus pasiekiamas tarkim tik koduotas pvz. sha1() jo variantas - tai u?tikrins ir saugumà ir tinklapio na?umà.

11.Vienuoliktas etapas(tik VPS/DS turëtojams) - "Loginkime lëtas u?klausas"
Kartais nutinka taip, kad nariai skund?iasi, jog kartas nuo karto tinklapis labai smarkiai laggina. Tokiu atveju tiems, kurie turi VPS'us ar DS'us, rekomenduoju ásidiegti koká nors padoresná "Slow-queries log" modulá á savo serverá. Tarkim "CentOS" oper. sistemai yra puikus "log-slow-queries" modulis, kuris á spec. failà saugo visas lëtas u?klausas, lëtesnes nei X sekund?iø. Taèiau ?is modulis efektyvus yra kai norime rasti 'i?si?okusá lëtûnà', o ne bendrai padidinti tinklapio krovimo laikà - tokiu atveju moduli logintø tûkstanèius u?klausø ir pats lëtintø serverá.

Redagavo Elektronix 2010-04-28 14:47
 
PM
Peršokti į forumą: