» »

Spletno gostovanje v oblaku - hitrost najbolj pomembna

Spletno gostovanje v oblaku - hitrost najbolj pomembna

alexa-lol ::

hej :) razmišljam o nekem projektu in imam naslednje zahteva oz. želje...
99% domače strani bi bil fiksen z morda 3 stvarmi, ki bi potrebovale query (baza ustvarjena s CakePHP). Kako bi zagotovil kar najhitrejši response strani... kako bi serverju dopovedal kaj naj da v cache (css, js fajli in nekaj slik) oz. kako bi v CakePHP optimiziral nekatere querije?

No potem je pa še drug del zgodbe kjer hočem, da bi bila stran kar se da prilagodljiva glede na količino obiska, zato sem razmišljal o PHP gostovanju v oblaku... pa ne vem katerega ponudnika izbrati.

Mi lahko kdo da kakšen nasvet (CakePHP ni nujen, lahko kater drug MVC framework).

blackbfm ::

če ti gre za performans pol izberi nek čim bolj lahek framework (slim framework recimo), ali pa pač brez frameworka če ni nek obsežen projekt

cache za statične fajle pa preko htaccess in http headerjev

pegasus ::

varnish + nginx + php-fpm pred frameworkom, za vsak request pravilno nastavi ustrezne caching http headerje, backend se ti lahko pogovarja z varnishem, če je treba kaj flushat, ko objaviš kako novo novico recimo.

Hitreje single server gre le zelo težko oz. moraš podrobno vedeti, kaj delaš. Fantaziranje s spdy / http 2.0 je zaenkrat zgolj to, fantaziranje.

alexa-lol ::

Predvsem želim imeti nek varen način za avtorizacijo uporabnikov. CakePHP ima npr. vsa geslo pod hashom in podobne ugodnosti pač kako priti do vsebine SQL tabele.

Ko smo že pri SQL tabelah.. ve kdo za kakšen tutorial glede dizajniranje baz in tega.. sem že malo pozabil kakšne so te relacije in kako potem optimiziraš...

Baza aplikacije bi sicer imela do miljon vnosov in bila velika do največ 10Gb.

Trenutno imam problem ko želim doseči sledeče: Povezati bazo uporabnikov, ki jo ima CakePHP z nekimi slikami, podatki, ki pripadajo uporabniku.. na način, da bi vse bili logično kar se da optimalno in hitro.

Vem da se naredijo nad podatki B+ drevesa in potem so SQL queriji hitrejši ampak ne vem kako bi to združil z načinom kako CakePHP sestavlja baze in se z njimi sporazumeva.

Načeloma znam naresti bazo, ki bi bila dokaj hitra ne vem pa kako bi jo naredil še varno (tu pride CakePHP, ki ima to saj glede gesel, SQL injectiona in tega pošlihtano).

techfreak :) ::

Glede varnosti baza načeloma nima kakšne velike veze. Za haširanje gesel mora poskrbeti framework in te načeloma naj ne bi skrbelo, za SQL injection pa je pomembno katere funkcije/metode uporabljaš. CakePHP ima vgrajen ORM, ki ti omogoča delati poizvedbe nad bazo ter tabele v bazi predstaviti v obliki modelov.

CakePHP ima velik poudarek na tehniki ORM, tako da mogoče bo lažje (ter tudi hitreje, sploh če rabiš podatke iz večih tabel) kakšne stvari narediti brez njega oz. direktno z pisanjem SQL stavkov.

Pri SQL injection je pomembno samo paziti na to kako podatke združiš s samim SQL stavkom.

//Nevarno, tvegaš SQL injection
$izdelek = 150;
$sth = $dbh->prepare('SELECT * FROM izdelki WHERE id = '.$izdelek);

//Varno
$izdelek = 150;
$sth = $dbh->prepare('SELECT * FROM izdelki WHERE id = ?');
$sth->execute(array($izdelek));


Kolikor pa vem bi ti pa že vsi frameworki morali omogočati zaščito pred tem, dokler uporabljaš metode ki ti jih ponujajo in ki so opisane v dokumentaciji.

Glede ponudnikov je znan recimo Heroku, res pa se baza začne od 50$/mesec naprej. Vem tudi za Google App Engine, ki zaenkrat eksperimnetalno podpira PHP. Mogoče se ti na začetku (sploh če na začetku še ne pričakuješ toliko obiska) bolj splača kakšen VPS, ampak tam boš moral poskrbeti tudi za administracijo sistema.

Baza bo že na začetku tako velika (10GB) ali šele čez čas?

mirancar ::

techfreak :) je izjavil:


//Nevarno, tvegaš SQL injection
$izdelek = 150;
$sth = $dbh->prepare('SELECT * FROM izdelki WHERE id = '.$izdelek);

//Varno
$izdelek = 150;
$sth = $dbh->prepare('SELECT * FROM izdelki WHERE id = ?');
$sth->execute(array($izdelek));


zakaj je v prvem primeru nevarnost sql injectiona ?

alexa-lol ::

hej :) zdaj sem malo razmišljal...
Osnovna baza naj bi ob vrhuncu imela max. 150.000 osebkov/userjev, kjer bi vsak imel recimo 100 slik, videov... . Razmišljal sem če bi dal poseben stolpec "enteries", kjer bi bili ID-ji teh vnosov, potem bi bila pa tabela Enteries, kjer bi bilo razdelano. Recimo v Enteries bi imel nek stolpec, ki bi vseboval array URLjev do slike oz. videa. Te slike ali videe bi pa dal na RackSpace Cloud Files (oz. Amazon S3). Ta "osnovna baza" bi torej vsebovala recimo max. nekaj milijonov vnosov, samo stringe brez slik in česar koli drugega, statične vsebina bi pa na drugem cloudu hostal, da mi ne žre procesorskega časa.

Morda kdo ve kakšna je razlika če bi recimo imel slike na recimo RackSpace Cloud Files (oz. Amazon S3) ali pa če bi jih imel v neki MySQL bazi nekje na nekem serverju .. ?

Ideja je, da bi bile slike in ostale vsebina hostane na nekem oblaku, ki je specializiran za statične vsebina in omogoča hiter response time, ker recimo ob enem loadanju bi moral nalodati cca 50 slik velikosti v skupni velikosti nekje 750kB.

Se taka konfiguracija zdi komu smiselna?

techfreak :) ::

@mirancar: Ta direktni primer ne bi, vendar če bi $izdelek sprejel preko $_GET, $_POST ali kako drugače od uporabnika, bi ta lahko spremenil SQL stavek ki se bo izvedel.

@alexa-lol:
Slike in ostale statične vsebine je veliko boljše imeti na strežniku/Amazon S3, kot pa v bazi. Sploh pri kakšnih zadevah kjer je veliko uporabnikov, saj bi bazo s tem dodatno upočasnjeval, kakšnih prednosti pa ni.

Prednost CDN (Amazon S3, Rackspace Cloud Files) je v tem, da so datoteke na voljo iz najbljižje lokacije do uporabnika (npr. obiskovalec iz Slovenije bo dobil postreženo iz Nemčije, obiskovalec iz Kanade pa iz kanadskega strežnika). Dodatna prednost je pa tudi v tem, da ni razlik v hitrosti delovanja če imaš 1 ali 1000 ogledov strani na minuto.
Če imaš v planu obiskalce iz geografsko različnih področjih je CDN najbolj primerna opcija.

Recimo v Enteries bi imel nek stolpec, ki bi vseboval array URLjev do slike oz. videa.

Shranjevanje arrayjev v bazi ni priporočljivo, sploh če hočeš boš delal poizvedbe za pridobitev samo določenih. Raje naredi novo tabelo kjer vsaka vrstica predstavlja eno sliko/video.

Za samo procesiranje (PHP in MySQL) pa kot že rečeno je v večini primerov dovolj (in ceneje) VPS. Oziroma vsekakor je dobro cenovno primerjati različne opcije ter se potem odločiti.

HardFu ::

Prvo se znebi CakePHP. Resno - framework je performancno cist v pizdi.
http://codeable.io

alexa-lol ::

No to glede tega arraya v Enteries bi bilo tako, da načeloma če bi hotel bi hotel vse... lahko se pa naredi tako kot si ti predlagal in dobiš pač isto lahko vse ven... to bom še premislil, ko bo bolj definirana ideja.

HardFu je izjavil:

Prvo se znebi CakePHP. Resno - framework je performancno cist v pizdi.


No sj trenutno sm še odprt za predloge.. načeloma edina zahteva ki jo imam je da ima ta Login pošlihtan, pa da je odporen na SQL injection. Fajn bi bilo tudi če si zna predstavljati bazo kot model - kot CakePHP.

Načeloma mi je tudi vseeno ali je v PHP ali čemerkoli drugem - nisem tak poznavalec server-side spletnih tehnologij. Načeloma iščem nekaj kar bi imelo omenjeno varnost pri Loginu, bi znal delat z večimi ponudniki baz (da nisi vezan na MsSQL, MySQL, npr. gledal sem bazo Redis, ki ima bazo v RAM z backupi na disku), ter da lahko POST, GET requeste pošiljam, ter da ima zadeva koncept sej (session - z shranjevanja česarkoli že) in pa omogoča delo s piškotki.

Kar se mene tiče bi zadevo naredil v C (pač hitrost) sam ne vem kako bi zraven POST,GET, SESSION in COOKIJE pripel, ter pač povezava z bazo in že prej omenjen Login.

Pač edina cilj je čim manjši footprint aplikacije in s tem povezana hitrost delovanja (v oblaku), slike pa v drugem oblaku. Slike in stran bi bile v 99% uporabljali ljudje iz Slovenije, tako da načeloma ne potrebujem teh filov na serverjih drugje po svetu.

Kakšne zamisli?

Hvalaza odgovore in lep pozdrav :)

brodul ::

Jaz na tvojem mestu nebi pisal v C kode ter se raje malo poducil kako deluje PHP v ozadju. Ne vem kako se to potem maintaina.

PaaS so super, ce moras nekaj hitro launchat, se lepo skalirajo, vendar imajo svojo ceno, ponavadi niso v sloveniji.
Cloud storitve za statiko so super, ce jo je malo ter ce so ljudje razprseni po svetu.
Ce pricakujes, da bo vecina uporabnikov iz Slovenije. Se pomoje ne splaca.

Ce mas res toliko podatkov in pricakujes toliko uporabnikov se ti zdi MySQL res pametna izbira.
Jaz sem preprican, da ce ze noces uporabljati frameworka, da je v PHP napisana kaksna knjiznica, ki handla samo bazo.
Tukaj je tudi tocka, kjer je najtezje menjati, ce stvari performancno ne delajo.

Odvisno koliko casa in denarja imas. Jaz bi si na tvojem mestu zakupil streznik. Se malo poglobil v varnish ali HAproxy, nginx ter php. Ce so te stvari pravilno skonfigurirajo, delajo presenetljivo dobro.

Definitivno si postavi staging. Ce te skrbi kako se stran obnasa pri dosti obiska na staging load/stres teste.
http://funkload.nuxeo.org/

Edit:
Po drugi strani ti samo zalavfaj produkt. Ce je namenjen slovencem naceloma ni problemov z performansom.
Pretending to be a mature adult is so exhausting.

Zgodovina sprememb…

  • spremenilo: brodul ()

blackbfm ::

Kar se mene tiče bi zadevo naredil v C (pač hitrost) sam ne vem kako bi zraven POST,GET, SESSION in COOKIJE pripel, ter pač povezava z bazo in že prej omenjen Login.


Ne da je tezko, ampak tak app bi imel verjetno (ce neves kaj delas) se 100x vec lukenj kot slabo napisan php.

HardFu ::

Ruby on Rails uporabi, itak se CakePHP precej zgleduje po njem, pa Rubyjeva sintaksa je dosti lepsa (subjektivno receno), pa za Rails mas miljon tutorialov in gemov (in ogromen, responsive community), in aplikacijo samo zlagas ko kocke.

Za avtorizacijo mas devise, ko je battle-tested gem, ki pride prakticno z vsem kar rabis.

Nehi cajt zgubljat s PHPjem :)
http://codeable.io

drola ::

Žal je tako, da so frameworki v PHPju res precej počasnejši. Pomoje je najboljša opcija, da za začetek vse napišeš v CakePHP, glede na to, da si z njim že delal in ga ne poznaš. Hkrati dodaj še nek logging odzivnosti aplikacije in neko analitiko, kjer boš videl katere podstrani so najpogosteje uporabljane.
V tem času, ko bo stran v produkciji in boš zbiral statistične podatke, se nauči o delu z Varnishem, potem pa optimiziraj toliko, kot je potrebno. Recimo če imaš scenarij domača stran, ki je enaka za vse obiskovalce, različen je edino login blokec, lahko imaš v cacheu posamezne fragmente strani. Nastaviš, da ti večino strani potegne iz cachea, edino login box se zrenderira vsakič na novo. Če je še to prepočasno, potem lahko nekatere dele aplikacije prepišeš mimo frameworka (ampak to je res že skrajna opcija).
https://drola.si

mirancar ::

techfreak :) je izjavil:

@mirancar: Ta direktni primer ne bi, vendar če bi $izdelek sprejel preko $_GET, $_POST ali kako drugače od uporabnika, bi ta lahko spremenil SQL stavek ki se bo izvedel.

no ja, se mi je zdelo
jaz sicer uporabljam nek doctrine orm, ki je kao najboljše kar PHP community premore (vbistvu sem razočaran, prot rešitev iz microsofta za .net se lahko skrije...)
za nekatere druge stvari in težje query-je pa uporabljam
$izdelek = intval($izdelek); je tukaj kaka slabost?

drola ::

Intval je varen.

Sicer pa se v PHPju mysql_query in ostale mysql_* funkcije opuščajo. Nadomeščata jih PDO in Mysqli.
Medtem ko je po starem potrebno vstavljati parametre direktno v SQL stavek:
<?php
$results = mysql_query(sprintf("SELECT * FROM table WHERE id='%s' AND name='%s'", 
                       mysql_real_escape_string($id), mysql_real_escape_string($name))) or die(mysql_error());
$rows = array();
while($row = mysql_fetch_assoc($results)){
    $rows[] = $row;
}

se po novem uporabljajo prepared statements (če se odločiš za PDO):
<?php
$stmt = $db->prepare("SELECT * FROM table WHERE id=? AND name=?");
$stmt->execute(array($id, $name));
$rows = $stmt->fetchAll(PDO::FETCH_ASSOC);

(Vir primerov: PDO Tutorial for MySQL Developers)

Pri prvem načinu moraš sam paziti na filtriranje vhodnih podatkov (mysql_real_escape_string oz. intval za številke), medtem ko PDO, če ga uporabljaš pravilno, za to poskrbi sam. Prav tako prepared statements podpira tudi Mysqli. Je pa prednost PDOja v tem, da lahko pri PDO uporabljaš isti API za več baz. Še eno relevantno branje: Choosing an API (PHP Manual).
Jaz sicer v svojih projektih večinoma uporabljam Doctrine2. Kjer je potrebno napisati kake bolj specialne poizvedbe, uporabim Native SQL.
https://drola.si

Zgodovina sprememb…

  • spremenil: drola ()

techfreak :) ::

al je tako, da so frameworki v PHPju res precej počasnejši.

Vprašanje je koliko so počasnejši od Ruby in Python frameworkov.

Drugače pa tudi sam priporočam Ruby on Rails ali Django (oz. kakšen drug Ruby/Python framework), ne zaradi hitrosti, vendar zaradi boljše, krajše in lepše kode.

drola ::

@techfreak :) mislil sem v primerjavi s PHPjem brez uporabe frameworka. PHP je še vedno problematičen glede tega, ker se za vsak request vse naloži znova. Sicer Symfony2 zdaj vključuje tudi svoj server, kar pomeni, da tvoja spletna aplikacija ves čas teče, zato je vse skupaj precej hitrejše. Ampak zaenkrat to še ni namenjeno uporabi v produkciji.
https://drola.si

techfreak :) ::

Definitivno, še vseeno je pa PHP svetlobna leta hitrejši od zagona RoR in podobnih zadev. Sicer tako mora biti, ker sem ob vsaki zahtevi na nova zažene.

Še vedno pa je zelo veliko spletnih strani z velikim obiskom, ki brez težav delujejo in ni opaziti da bi jih PHP kaj preveč omejeval. Recimo Dailymotion uporablja Symfony framework, ki se vsaj meni zdi bloated pa tudi benchmarki pravijo, da je v samem dnu po hitrosti. Najbolj obiskana slovenska spletna stran 24ur.com je narejena v PHPju.

Definitivno je priporočljivo izbrati framework in knjižnice, ki so hitre, še vseeno pa verjetno sam framework oz. PHP ni bottleneck.

illion ::

Pri spletnem gostovanju je treba bit pazljiv na podatke, ker se lahko hitro "pokvarijo". Video na to temo:



Vredno ogleda ...

TemaSporočilaOglediZadnje sporočilo
TemaSporočilaOglediZadnje sporočilo
»

Framework

Oddelek: Izdelava spletišč
212501 (1041) techfreak :)
»

Ideje za PHP aplikacije

Oddelek: Programiranje
142029 (1629) Marat
»

PHP in objektno programiranje (strani: 1 2 )

Oddelek: Programiranje
8511277 (9744) kivi113
»

Izdelava gui obrazca za vnos in iskanje podatkov

Oddelek: Izdelava spletišč
61509 (1373) Ales
»

Močno obiskano spletišče

Oddelek: Izdelava spletišč
252559 (1616) Jan

Več podobnih tem