[ jablan @ 27.12.2015. 13:29 ] @
Poslednji put kad sam aktivno radio sa PHP-om (ima tome skoro 15 godina), nije bilo klasa, nije bilo frejmvorka i sve što se dešavalo dešavalo se u scope-u jednog requesta.

Znam da se u međuvremenu dosta toga promenilo, pokušavam sad da izguglam kako danas sve to funkcioniše, ali ne uspevam. Google: "php process architecture" i slične pretrage ne daju ništa korisno.

Dakle, kada se učitavaju npr. model klase u PHP-u? Da li se čuvaju između requestova ili se uvek iznova učitavaju? U kom procesu žive? Kako se npr. čuvaju singleton instance? Itd.
[ plus_minus @ 27.12.2015. 20:50 ] @
Model klase, logika, itd.. se učitava tim pre to bolje.
Hoćeš li između klasa udenuti po koji if() else pa u zavistnosti od toga, nastaviti dalje sa učitavanjem (require/include) zavisi od samog developera i organizacije.
Sloboda izbora i više načina za jednu te istu stvar.

----------

PHP fajlovi se iznova uvek učitavaju, baš kao i RoR (server side scripting language, trči svaki put od a do š),
ukoliko:

1. podaci nisu smešteni u bazu pa onda na pravom mestu `fetch`, else `require`.
2. sesije nisu u igri.
3. APCu (alternative php cache)
4. Memcache
5. zend opcache
... i verovatno ima još načina.

Jedan jeste napraviti ekstenziju na osnovu gotove i spremne logike nešto tipa Phalcon framework
A to znači, ne php nego C kod. I onda potrči jednom i tu je. I ptica trkačica podseća na puža golaća... ali, to već prelazi u nešto drugo.
Potrebno je više od samo PHP/sql znanja.

Od svih koje sam nabrojao, mislim da je zend opcache glavna stvar.
Jednom se učita, kompajlira se u memoriju servera.
Parser u narednom reqeustu ne čita iz `included fajla` već vadi iz memorije.
Ukoliko je server restartovan, pozvana funkcija za opcache_reset, timeout vrednost dostignuta, fajl ručno modifikovan od strane vlasnika, itd..
u narednom letu se očitava ponovo, smešta u memoriju.

Memcached bi trebalo da može isto što i zend opcache ali nije native/built-in ekstenzija. (php >= 5.5*)
Nikada nisam koristio memcahed, pa, neka onaj ko jeste ispravi, dopuni.

Singleton u PHP...
keyword final.

Code (php):

<?php

final class uniqueInstance
{
 
 public function __construct()
 {
   // code ....
 }
 
}

$obj = new uniqueInstance();

 


Mada, singleton može i da se klonira..
A čuva se - isto kao i sve ostalo i na isti način.

------

Proces u kome se sve to obitava jeste httpd/apache (server) child proces. Ako nije u pitanju command line interface iil php-cli. Onda dobija svoj proces (daemon).
Zavisi i od toga kako je instaliran php pre svega. Uglavnom je to kao apache modul.

Prešaltaj preko ovog članka/tutorijala iz 2011., mislim da će ti biti poprilično jasno kako bi trebalo da izgleda jedna prosta, normalna, bazična PHP zealica za zdravom logikom i prezentacijom.

Kako PHP radi i gde da se informišeš i dobiješ najpreciznije detalje, jeste php.net matični sajt.
[ plus_minus @ 27.12.2015. 21:07 ] @
edit/update: čisto da dodam, da se ispravim, za definisanje singletona nije dovoljno samo final, to zapravo znači da ta klasa ne može poslužiti za `extend` svrhe.
Ali, kada se upotrebi kwd final a unutra jedan protected konstruktor i statične metode, onda se od finalne klase može pozvati finalClass::staticMethod(); međutim, ne i new()...
A koliko je to kompatibilno sa php 7.. za dalju diskusiju, već.
[ jablan @ 28.12.2015. 08:12 ] @
Nismo se razumeli. Nije mi problem da nađem kako se u PHP definiše singleton. Moje je pitanje gde se ta instanca čuva između requestova.

To nema nikakve veze sa time što je PHP scripting jezik. RoR klase se apsolutno ne učitavaju pri svakom requestu. Klase se učitavaju samo jedanput, a jedan isti proces hendluje više requestova. (pročitaj više npr ovde http://stackoverflow.com/quest...ccess-the-same-runtime-variabl) Zato ja u RoR kad definišem singleton, to je zaista jedinstvena instanca, koju vide svi requestovi aplikacije, tokom celog njenog života (dakle, isto kao u Javi npr).

Čini mi se da u PHP-u i dalje sve živi samo tokom jednog requesta - tako da npr. singleton instance to jesu samo u okviru jednog requesta - ako hoćemo da imamo istu instancu klase za dva različita korisnika, moraćemo to da implementiramo preko nekog zajedničkog medija (memcache, fajl, baza)? Da li je ista situacija i kod modernih PHP frejmvorka? Da li se zaista ceo frejmvork učitava prilikom SVAKOG requesta?

BTW memcached je jednostavni key-value store koji koristi memoriju.

[Ovu poruku je menjao jablan dana 28.12.2015. u 09:25 GMT+1]
[ plus_minus @ 28.12.2015. 11:15 ] @
A ja mislim da je tebi jablane poprilično dosadno.
Nismo se razumeli? Šta nisi razumeo?

Memcached ne mora da bude jednostavan zato što može da se distribuira preko više servera, dok apc i opcahce ne mogu.
zend opcache bar ne za sad, dakle nije isto, jer postoji i memcached server setup, a možda može i sa z.opcache, samo ja još nisam upućen.
apcu je za razliku od memcached varijante per client. Dakle, jedan server. Jedan host, jedan domen, itd...

Situacija je potpuno ista preko modernih php frejmworkova i gore sam ti nabrojao 5 najzastupljenijih načina uz pomoć kojih se to izbegava. A i onda kada se opcode čita uvek i uvek iznova, opšte poznata stvar je da php ima najbrži interpreter. Upravo zato i jeste najzastupljeniji. A eto, vele da je php7 i duplo brži nego prethodnik.. i s' obzirom na to da php služi i dalje uglavnom za generisanje teksta, hiperteksta i ostalih propratnih ekstenzija koje sami browser može da kešira, dakle da sami browser pokupi ono što je već bilo na ekranu i da se svede sve samo na `negotiate` bez response-a, a prevashodno se dolazi do jedne tačke gde se dodaje/implementira opcija disk keširanja, eto, to je varijanta broj 6, onda kada uz pomoć early output buffer-a spakuješ izlaz u .html fajl pa ga u narednom requestu u prvoj ili drugoj priključenoj skripti, na osnovu built-in server promenjivih ili već ukucanih vrednosti iz kolačića povuče i preskoči sve na dalje ... i umesto 30ms dobiješ 3ms. Mada, to je već keširanje sažvakanog izlaza, ne i same sirove žvake. Ali eto, kada se i keširanje uključi u igru, onda server i php interpreter maltene pa bukvalno spavaju ... Naravno, kada je nešto komplikovanije gde ima puno dugmića/formi itd., onda se deo posla malo prepusti i javaskripti, ukoliko može/mora da kešira a da rezultat/ishod na ekranu klijenta treba da ostane dinamičan ili se jednostavno kešira više fragmenata stranice. Dakle, da. I ceo frejmwork ide svaki put, ukoliko taj frejmwork nije kao PHP ekstenzija. Linkovao sam ti Phalcon, to je jedan od onih koje bi ti skroz podržao.

Citat:


PHP C-extension (Phalcon)

C-extensions are loaded together with PHP one time on the web server’s daemon start process
Classes and functions provided by the extension are ready to use for any application
The code is compiled and isn’t interpreted because is already compiled to a specific platform and processor
Thanks to its low-level architecture and optimizations Phalcon provides the lowest overhead for MVC-based applications


[ VladaSu @ 29.12.2015. 09:17 ] @
@Jablane. Prvo sam napisao jedan dugacak post da objasnim sve sta je ovde pisano. Uglavnom pogresno se razumelo pitanje i odatle brdo pogresni odgovora. To nekog pocetnika ne zanima.

Ukratko:
Sve potrebno se ucitava prilikom svakog requesta. Ne cuvaju se klase izmedju requesta i uvek se iznova ucitavaju, da li direkt sa diska, da li iz kesa hdd-a ili RAM-a, da li kompajlirano ili mora da krene od parsiranja sve zavisi ali se svaki put ucitava se iz pocetka. Prakticno svaki put ponovo pokreces program i zive dok se kod ne izvrsi i rezultat izvrsavanja prosledi. Instance zive dok se kod ne izvrsi. Sve podignute klase umru kada se kod izvrsi. Zive jedan delic sekunde dok se kod izvrsava.

Pitanje:
Zbog cega bi se neki kod bio zajednicki za vise korisnika?
Ovo je logika server-client aplikacije a ne desktop i to se nije izmenilo od kada postoji PHP.
Ti moras da izvrsis kod i zavrsis izvrsavanje kako bi rezultat poslao korisniku koji moze da ode sa sajta i vise se nikada ne vrati.
Drugim korisnicima moze da bude interesantan rezultat tog korisnika ali to je podatak i to moze da se sacuva recimo u bazi ili kesira u memoriju.
Onda je ovo prica o kesiranju podataka a ne kesiranju koda, zar ne?
Moze i kod da se kesira na razlicitim nivoima i mestima ali i tako kesiran kod sluzi samo za brze izvrsavanje a ne da bude vidljiv izmedju korisnika jer niko ne garantuje da ce korisnici istovremeno izvrsiti taj kod.
Tvoje pitanje je bilo zivot koda a odgovori su se odnosili na brzinu koda. Zivot koda se nije nikada izmenio niti vidim neku logiku po kojoj bi mogao da se menja i zato nisi dobijao odgovore na google.


[ VladaSu @ 29.12.2015. 09:28 ] @
Zbog cega ti u PHP treba deljena klasa kao sto ima RoR? Razumem ako je klasa read-only onda je dovoljno da je jednom kompajliras i onda radi posao. PHP je svaki put kompajlira ali sta te briga zasto to on radi. Nemoj da obracas paznju na to.
Ako klasa nije read-only onda zamislis 1000 korisnika je svake sekunde menja. Zbog cega ce ti to?
[ jablan @ 29.12.2015. 11:45 ] @
Kao prvo, hvala za iscrpan odgovor, saznao sam ono što sam želeo.

Kao drugo, pitanje sam postavio iz radoznalosti, ne zato što hoću nešto da radim sa PHP-om.

Citat:
VladaSu: Drugim korisnicima moze da bude interesantan rezultat tog korisnika ali to je podatak i to moze da se sacuva recimo u bazi ili kesira u memoriju.
Onda je ovo prica o kesiranju podataka a ne kesiranju koda, zar ne?

Vidiš, OOP na neki način podrazumeva "jedinstvo" koda i podataka. Znam da je poslednjih godina PHP stavio akcenat na OOP pristup, ali ovo što kažeš mi govori da je taj pristup na neki način ostao samo "kozmetički" - ako ti pri svakom zahtevu moraš da neke deljene podatke (de)serijalizuješ, čupaš iz baze ili keša i ponovo kreiraš objekte koji će ih nositi.

Banalan primer - imaš neke podatke koje prevlačiš sa nekog partnerskog servisa: kursnu listu, cene i stanje sirovina kod dobavljača, vremensku prognozu. Ili - banalan primer sa ES - lista aktivnih korisnika u poslednjih n minuta. Naravno da sve to možeš da dovučeš, ukeširaš negde i onda prilikom svakog requesta vadiš to iz keša i praviš neku strukturu sa nekim objektima od toga - ali je logičnije da ta struktura živi negde u okviru aplikacije svima dostupna kao objekat.
[ VladaSu @ 29.12.2015. 14:59 ] @
Tacno, na tvom primeru logicnije je da to kursna lista zivi 24 sata.
Tako nesto je moguce i videces da je konstruktor pozvan samo prvi put bilo koliko puta pokrenes ovaj kod.

Code (php):

<?php

class Test
{
    private $result = 'nothing';
    public function __construct()
    {
     echo "change result nothing to something<br>";
     $this->result = 'something';
    }
   
    public function result()
    {
     return "Result is: {$this->result}<br>";
    }
}

$test_class = apc_fetch('test_obj');
if (!is_object($test_class) || !method_exists($test_class, 'result'))
{
    $test_class = new Test();
    apc_store('test_obj', $test_class);
}

echo $test_class->result();

?>

 
[ plus_minus @ 29.12.2015. 16:42 ] @
Jesi li siguran Vlado da će i metode da žive u apc-u kao value uz pomoć apc_store ili apc_add?
Pitam zato što ja inače koristim apcu. PECL/apc koliko se sećam može i da kompajlira, valjda apc_compile_file() upravo ono što radi z.opcache,
ali ne i apcu koji jeste - key->value - only, a ti si u primeru upotrebio baš to.

I mislim da ti je primer loš.
U tvom primeru će uvek ponovo očitati i klasu i sve ostalo.

Možda ovako nekako?

Code (php):

<?php

if(apc_exists('test_obj'))
{
     $test_class = apc_fetch('test_obj');
}
else
{
     class Test
     {
          private $result = 'nothing';
          public function __construct()
          {
           echo "change result nothing to something<br>";
           $this->result = 'something';
          }
       
          public function result()
          {
           return "Result is: {$this->result}<br>";
          }
     }

     if (!is_object($test_class) || !method_exists($test_class, 'result'))
     {
          $test_class = new Test();
          apc_store('test_obj', $test_class);
     }

}

echo $test_class->result();

 



@jablan

Ruby ima jedan framework. Možda i dva, možda i mnogo više, ne znam, ja sam neupućen u ruby, a php ima frejmworkova maltene koliko ruby ima funkcija. Odatle i razlog za kako si to krstio kao `kozmetiku`, zapravo jedan od dobrih razloga. Rails je verovatno poprilično moćan i satkan tako da zadovoljava sve što se zamisliti može. E, a ono što meni nije jasno, jeste kako šljaka čist Ruby. Bez bilo kakvog frejmworka. Možeš li nam opisati to?

[Ovu poruku je menjao plus_minus dana 29.12.2015. u 18:07 GMT+1]
[ VladaSu @ 29.12.2015. 17:25 ] @
To sto si definiciju klase stavio u if else sto se tice kompajlera nisi ama bas nista uradio jer se klasa u svakom slucaju kompajlira.
Ne kompajlira se prolaz uslovljen kodom vec kompletan kod. Kompajliran kod takodje moze da se kesira ali on je kompletno kompajliran a ne specifican prolaz.

Postavljeno pitanje nema veze sa kompajiranjem ili brzinom izvrsavanja koda vec da li se objekti uvek iznova kreiraju za svaki request ili se posebno kreiraju pa ih koriste requesti.
Odgovor je da se zasebno kreiraju za svaki request i traju dok se request ne zavrsi ali u nekom posebnom slucaju moze da se napravi klasa koja zivi izmedju requestova i vise requesta moze da ih koristi.
Konkretan primer potrebe za tim je kursna lista i ima logike ali nema potrebe da se tako resi. Moze i na drugi da kazem PHP-ov nacin.

Ali ako se bas zeli resiti konkretno taj problem sto je Jablan naveo tako sto ce objekat da zivi nezavisno od requestova onda je moj primer dobar.
Nije dovrsen i savrsen ali je dovoljan da se shvati da to moze da funkcionise onako kao je Jablan zeleo.

Evo doradjenog koda.
Code (php):

<?php
class Test
{
    private $result = 'nothing';
    private $i = 0;
    public function __construct()
    {
     echo "change result nothing to something<br>";
     $this->result = 'something';
    }
   
    public function result()
    {
     $this->i = $this->i + 1;
     return "Result is: {$this->result} {$this->i}<br>";
    }
}

$test_class = apc_fetch('test_obj');
if (!is_object($test_class) && !method_exists($test_class, 'result'))
{
    $test_class = new Test();
    apc_store('test_obj', $test_class);
}

echo $test_class->result();
apc_store('test_obj', $test_class);
?>
 

E sada ti pokreni ovaj php u jednom browseru i imaces rezultat:

change result nothing to something
Result is: something 1

Pokreni ponovo i dobices:

Result is: something 2

Pokreni u drugom browseru i dobices:

Result is: something 3

Pokreni na drugom racunaru i dobices:

Result is: something 4

Pokreni ponovo na prvom racunaru i dobices:

Result is: something 5

Jos jednom na prvom racunaru:

Result is: something 6




A da li sam siguran? Pa probao sam, ne mogu biti sigurniji :)

[ plus_minus @ 29.12.2015. 17:46 ] @
^^ Nisam pokrenuo, ali znam da ću pored toga imati i dodatnih linija u error logu.
Sa mojim primerm, ne.

Prvi put, apc_fetch nema odakle da fečuje. Error, notice, garant. To mi ne treba.
Zato i postoji if(apc_exists ... ) pa onda fečovanje.

Citat:

To sto si definiciju klase stavio u if else sto se tice kompajlera nisi ama bas nista uradio jer se klasa u svakom slucaju kompajlira.


Tako je. Ali samo prvi put. Posle toga, klasa/objekat bi trebala da živi samo u apc-u, iskompajlirana.
Ako nije tako, za kojeg onda stoyka služe i if/else i apc i sesije i sve ostalo.. ?

Vrlo prosto. Uzmi i mom primeru definiši jednu konstantu. Nakon else. Pre class
define('CONSTANT_NAME', 'test value');

A tu gde je echo $test_class->result(); ... udeni i echo CONSTANT_NAME;

Prvi put će `ispljunuti` i 'test value'.
Drugi put, neće, nego će ti ispisati da konstanta ne postoji, neki error će da se desi.

Citat:
Ali ako se bas zeli resiti konkretno taj problem sto je Jablan naveo tako sto ce objekat da zivi nezavisno od requestova onda je moj primer dobar.

Nope.

U svakom slučaju, apc_add/store ne bi trebali da se koriste za same klase ili proceduralne funkcije mimo klasa, već apc_compile_file.
Ok je za nizove, teške i gabaritne promenjive, dakle uglavnom stringove, kao zaobilaznica za yet another require_once file a unutra $myVar = array( ... array() ... array() .. ) .. itd.

[Ovu poruku je menjao plus_minus dana 29.12.2015. u 18:58 GMT+1]
[ jablan @ 29.12.2015. 17:55 ] @
Citat:
VladaSu:
Code (php):

$test_class = apc_fetch('test_obj');
 

Ok, kontam, kešira se ceo objekat (btw jako je bitno praviti razliku između pojmova objekat i klasa, ne znam da li je primer tvoj). Problem sa tim keširanjem je što to zapravo nije isti objekat kad se izvuče iz keša, već njegova kopija. Dva requesta koji se izvršavaju istovremeno povući će kopije istog objekta i možda ga promeniti i prepisati original. Kontam da je sinhronizacija ovakvih objekata ekstremno pipava i podložna greškama - apc mi generalno liči na nešto što treba vrlo pažljivo koristiti.

Nisam imao nameru od ove teme da napravim temu "čiji je veći", samo da se informišem malo bolje o PHP-u. U krajnjoj liniji, u svim jezicima se može napisati manje više sve, samo su neki pogodniji za neke primene od drugih.

[Ovu poruku je menjao jablan dana 29.12.2015. u 19:55 GMT+1]
[ jablan @ 29.12.2015. 18:08 ] @
Citat:
plus_minus:
E, a ono što meni nije jasno, jeste kako šljaka čist Ruby. Bez bilo kakvog frejmworka. Možeš li nam opisati to?

Pa ono, startuješ skriptu iz konzole kao bilo koju drugu, krene ruby proces, odradi šta treba, završi se. :)

Ako misliš na ruby na webu, uglavnom se koriste frejmvorci, niko ne piše web app od nule (postoje ultralagani frejmvorci, kao npr. Sinatra, ako ti ne treba sav bloat koji donosi Rails). Ruby kao jezik ne poznaje web - pisan je kao jezik opšte namene. Sam za sebe ne ume da procesira HTTP zahteve. Treba ti neka biblioteka koja to ume - obično je to Rack: http://rack.github.io/ Možemo otvoriti novu temu ako nekog interesuje da sazna više.
[ plus_minus @ 29.12.2015. 18:28 ] @
@jablan

Dakle, ruby je jako sličan pitonu. Jel' da? Ok. Piton mi je već poznat po malo.

Što se tiče samog keširanja, i apc-a, apc pravi svoj interni niz. array. U PHP-u je gotovo sve - niz. :) Smešta se u neki niz. Retko šta nije od ugrađenog, internog i ponuđenog, a da je to superglobal, itd...
I dobro si shvatio kako funkcioniše apc. A i terminologija. Ono što se instancira, dakle new className, ta promenjiva postaje instanca#1, instanca#2, itd.. To se naziva objekat.

Dakle, `__set_state()` se desi onda kada se klasa, neinstancirana, smesti u apc slot, i ne može da bude ništa drugo nego kopija - bez svojih metoda.
Samo svojstva i stanje u kome se klasa nalazila onda kada je spakovana u novi apc slot. Isto je i sa sesijama kada klasa treba da se popakuje u sesiju.

@VladaSu

Odradi var_export($test_class); i dobićeš ono što apc sačuva. Metode? Gde su tu?
A ti inače koristiš, pozivaš metodu iz samog apc-a zato što ti je kod takav da klasu učitava, parsuje uvek, jer je na samom početku, nije uslovljena ničim.

.. tako da će u mom primeru dati i još jedan error pored `no f*ing constant defined bro!` vezan za metodu ($test_class->result();), garant (razmišljam napamet).
Što je validno. Zbog same mogućnosti apc-a. Metoda na ovaj način, neće postojati u apc slotu, ali svojstvo hoće.

opcache je za sada jedini (lagan za svakoga i čist PHP) način da se sačuva kompletna klasa u memoriju.
PECL/APC (ne APCu) koji nije kompatibilan sa built-in zend opcache extenzijom takođe može sa apc_compile_file().

Dakle, starije verzije PHP-a, mogu da koriste PECL/apc, ne moraju da se oslanjaju samo na apcu koji jeste kompatibilan sa z.opcache i koji radi ono što opcache ne.
A to je key -> value mehanizam on demand.
[ plus_minus @ 29.12.2015. 19:27 ] @
edit:
Citat:
Pa ono, startuješ skriptu iz konzole kao bilo koju drugu, krene ruby proces, odradi šta treba, završi se. :)


To Jablane dakle znači da i naredni put kad se pokrene, bez rails-a ili čega već, ruby opet započinje proces, odradi šta treba, završi se.. ?
[ jablan @ 29.12.2015. 19:45 ] @
Da, isto kao kad bilo koji drugi program na mašini pokreneš. Naravno, ako želiš, možeš da napišeš i neki daemon koji je stalno pokrenut i koji reaguje na neke događaje u sistemu - ako su to HTTP zahtevi onda se to zove web server. :)
[ VladaSu @ 29.12.2015. 20:15 ] @
@plus_minius
Pokreni, nemoj napamet da pricas i samo junkujes temu.
Ti se razumes u php i to je cinjenica ali brate nemoj da moram ko nekom pocetnku da pisem jer te je mrzelo da pokrenes program.
Ako key ne postoji apc_fetch vraca false. Nema "garant error i notice".
Ja pricam o principu a ti se hvatas za sintaksne greske i ne kontas razliku izmedju definicije klase i objekta klase.
Jablana interesuje zivot objekta a definicija nema zivot. Definicija je definijcija. Jako skreces temu.
Druze, to sto se neki else ne izvrsi u nekom slucaje ne znaci da se taj else ne kompajlira. I ta konstanta sto u jednom slucaju nije definisana ne znaci da nije kompajlirana vec samo nije
definisana jer nisi usao u taj else. Da ne kazem da se ucitao ceo taj fajl. Ta definicija klase se svaki put ucita bila ona u else ili na pocetku ili na kraju jer kompajler kompajlira ceo fajl a ne uslov
koji je ispunjen u nekom slucaju.
Primer, napravi u C isti program i kompajliraj ga i prvi put ce videti konstatnu a drugi put nece a to je isti program, isti fajl i ni jedan bajt mu nije menjan.
Jos jednom, ne kompajlira se tok programa vec program. Mesas to. To sto isti program u dva slucaja ima razlicite tokovo to nema veze, to je jedan te isti program, isti u svaki bajt.
Tvoji odgovori nemaju ama bas nikakve veze sa pitanjem, uporno promasujes temu i zbunjujes i mesas nebitne stvari.
Pokreni i vidi i kraj price. Radi za kursnu listu.

@Jablane
Upravu si, to je kopija objekata i ta kopija se s vremena na vreme update-je i svaki update moze da prepise update koji su se desili u medjuvremenu.
Siguran sam da postoji i suvise je komplikovano uraditi to sto ti trazis ali ja za 15 godina nisam imao potrebe za tim, mozda i jesam ali sam nalazio druga laksa resenja.
[ plus_minus @ 29.12.2015. 22:35 ] @
@VladaSu

Citat:

Pokreni, nemoj napamet da pricas i samo junkujes temu.
Ti se razumes u php i to je cinjenica ali brate nemoj da moram ko nekom pocetnku da pisem jer te je mrzelo da pokrenes program.
Ako key ne postoji apc_fetch vraca false. Nema "garant error i notice".


A zašto bih pokretao? Ne sviđa mi se logika samog primera. Možda da proverim kako radi apc (za koji znam kako radi) eventualno da se podsetim koja od 5000 i kusur funkcija beše vraća boolean ili ispisuje notice ili fatal error na ekranu .. ? Pa i onda kada funkcija daje false.. a ti očekuješ `felerični`, nepotpuni i spakovani objekat ili niz, a taj fajl gde se to određuje i prisvajaju vrednosti pozvan na require_once, onoga momenta kada $test_class naiđe na deo gde će možda da se provuče kroz neku drugu metodu koja neće samo da `ćuti` ako nije string ili ono što se očekuje već daje određeni error, pa sve to na kraju treba da prođe kroz `gzhandler` ob_start(), ob_get_clean().. znaš šta se dešava? Dešava se da sve stane. A browser biva zbunjen do daske. I tebi ne preostaje ništa drugo nego da čitaš šta kaže error_log. Ovo je baš uprošćeno objašnjenje i verovatno će još neko iskusan u PHP-u, ko čita i koga ne mrzi da na koliko god mesta treba, udene po jedan if(isset()), if(is_*()) pre nego što krene da dodeljuje vrednosti, biti 100% saglasan sa mnom.

Citat:
Ja pricam o principu a ti se hvatas za sintaksne greske i ne kontas razliku izmedju definicije klase i objekta klase.
Jablana interesuje zivot objekta a definicija nema zivot. Definicija je definijcija. Jako skreces temu.


A objekat ima život? Promenjive imaju život? funkcije imaju život? I definicija je definicija.. malčice si se ti meni pogubio ovde.
I drago mi je što se razumem u php i da je to činjenica, ali da ne razumem šta je to definicija klase, a šta sami objekat.

Citat:
Druze, to sto se neki else ne izvrsi u nekom slucaje ne znaci da se taj else ne kompajlira. I ta konstanta sto u jednom slucaju nije definisana ne znaci da nije kompajlirana vec samo nije
definisana jer nisi usao u taj else. Da ne kazem da se ucitao ceo taj fajl. Ta definicija klase se svaki put ucita bila ona u else ili na pocetku ili na kraju jer kompajler kompajlira ceo fajl a ne uslov
koji je ispunjen u nekom slucaju.


Ama, jel' tebi i dalje nije jasno da u tvom primeru postoji i apc, postoji i klasa uvek, postoji i u mom (ali ima jedno else)... i da to što ti misliš da se dešava, .. zapravo se ne dešava, nego se dobija sirova klasa + zauzeće dodatnog apc slota. Koja je tu svrha? Da zaboravimo da class objekat, instanca, class opcode (ma kako ti god drago) `NE MOŽE DA SE SPAKUJE ZA KASNIJE`, da bude komplet u memoriji, zarad performansi ili overheada ili čega već - uz pomoć apc_add, apc_store... MORA drugačije - da - se - radi. U ovom PHP-u, takvom, kakav je. Efekat iz tvog primera je još lošiji i više resorsa troši nego čist OOp bez bilo kakvih dodatnih memcache, apc-a, zend-a itd, itd..

Code (php):


<?php

if(apc_exists('someValue'))
{
     $myValue = apc_fetch('someValue');
}
else
{
     require_once('/path/to/file/where/someValueIs.php');

     if(function_exists('some_function'))
     {
          $myValue = some_function();
          apc_add('someValue', $myValue, 300);
     }
}

echo $myValue;

 


Gornji primer, nakon prvog učitavanja, možeš slobodno sve što se nalazi pod `else` zapakovati u block comment /* */ pa refreš.
U narednih 5 minuta, nakon toga, čist apc radi. Nema priključenog fajla u get_included_files() uopšte.

E, to je svrha apc-a. Glavna.

Citat:

Primer, napravi u C isti program i kompajliraj ga i prvi put ce videti konstatnu a drugi put nece a to je isti program, isti fajl i ni jedan bajt mu nije menjan.
Jos jednom, ne kompajlira se tok programa vec program. Mesas to. To sto isti program u dva slucaja ima razlicite tokovo to nema veze, to je jedan te isti program, isti u svaki bajt.


A zašto bih u C napravio isti takav program? Zato što se iza PHP functionName() krije čist C ili zbog nečeg drugog?
Osim toga, uzeo sam konstantu kao primer. I sa $CONSTANT_NAME = 'test_value'; je potpuno isto, sa apc-om, prvi put će je biti, drugi put neće.
Ne mešam ama baš ništa. Možda imam nesvakidašnji sleng...

Citat:

Tvoji odgovori nemaju ama bas nikakve veze sa pitanjem, uporno promasujes temu i zbunjujes i mesas nebitne stvari.
Pokreni i vidi i kraj price. Radi za kursnu listu.


Moji odgovori su po meni, dovoljno dobri.
Da citiram samoga sebe kad moram.

jablan:
Q: Dakle, kada se učitavaju npr. model klase u PHP-u? Da li se čuvaju između requestova ili se uvek iznova učitavaju? U kom procesu žive? Kako se npr. čuvaju singleton instance? Itd.

+/-:
A1: Model klase, logika, itd.. se učitava tim pre to bolje.
Hoćeš li između klasa udenuti po koji if() else pa u zavistnosti od toga, nastaviti dalje sa učitavanjem (require/include) zavisi od samog developera i organizacije.
Sloboda izbora i više načina za jednu te istu stvar.

----------

PHP fajlovi se iznova uvek učitavaju, baš kao i RoR (server side scripting language, trči svaki put od a do š),

A2: Dakle, da. I ceo frejmwork ide svaki put, ukoliko taj frejmwork nije kao PHP ekstenzija ...

A3: Proces u kome se sve to obitava jeste httpd/apache (server) child proces. Ako nije u pitanju command line interface iil php-cli. Onda dobija svoj proces (daemon).
Zavisi i od toga kako je instaliran php pre svega. Uglavnom je to kao apache modul.

---

Ovo "baš kao i RoR" pod A1 - preskoči, očigledno da nije tačno, moje neznanje vezano za R + Rails.

Za kraj ovog posta.. moram da dodam, primećujem da svi vi koji koristite taj ubuntu, imate neku zajedničku crtu i kratak fitilj.
Šta je to sa vama? Šta je to što cannonical servira a da mi ostali ne znamo?

Sad gledaj da se razjariš i iznapadaš ne ponovo, samo zato što si dao - nekorektnu - PHP praksu kao primer.
[ Nemke_BG @ 29.12.2015. 22:50 ] @
@plus_minus

ubi se citajuci ovaj tvoj post, ali da me ubijes ne znam sta si hteo da kazes. Mozda je do mene, jer me hvata grip pa nisam sav svoj.

Tako da cu generalno da ti odgovorim, mozes stanje objekta da sacuvas za kasnije i da ga u nekom sledecom request-u tako inicijalizujes (http://php.net/manual/en/language.oop5.serialization.php).

Ako se nekome taj pristup ne svidja uvek moze da napise i full server lifetime objekat koristeci sledeci web server:

http://appserver.io/
[ plus_minus @ 29.12.2015. 22:58 ] @
@Nemke_BG

Isto to može i apc_store/add i isti se efekat dobija.

ALI! (podebljano)

citat sa php manuala:

Citat:

serialize() returns a string containing a byte-stream representation of any value that can be stored in PHP. unserialize() can use this string to recreate the original variable values. Using serialize to save an object will save all variables in an object. The methods in an object will not be saved, only the name of the class


PS: Ne daj se sa tim gripom, ako te merka neka temperatura, ne čekaj ništa nego - Febricet.
[ VladaSu @ 29.12.2015. 23:42 ] @
Mozes da stavis taj kod u komentar posle prvog izvrsavanja i sta time dokazujes? Dokazujes da ce u jednom specificnom slucaju tvoj kod da se brze izvrsi.
Da li je to pitanje, da li je to problem, da li se time ovde bavimo?
Bavimo se sustinom a ne ko ce lepse napisati slican kod i ciji kod ce brze da se izvrsi.
Bavimo se sa time da li PHP moze da ima klasu koja se moze koristiti za razlicite requeste. Bavimo se objektom, kada on postoji i gde on postoji i dokle postoji.
Ne bavimo se mestom definisanja klasa i brzim i lepsim kodom.
Da li je za pitanje bitno gde se nalazi kod tj definicija klase ili je bitno kada i gde i do kada postoji objekat te klase?

Vec sam jednom rekao, da, jesi ubrzao izvrsavanje koda u odredjenom slucaju ali to ubrzanje je mizerno i irelevantno za pitanje jer se ovde ne radi o brzini.

Projekat na kojem radim poslednjih par godina ima barem 2 miliona iskucanih redova i 100.000 online korisnika i 5000 klasa.
I zamisli, sve klase se automatski ucitavaju i dovojno mi je da stavim $a = new Class(). Svaka definicija klase je ucitana uvek.
I sta mislis koliko su opale performanse aplikacije? Nista. Nema potrebe za taj if else koji toliko forsiras a nije ni bitan za pitanje.
[ svepomalo @ 29.12.2015. 23:48 ] @
Citat:
VladaSu
Projekat na kojem radim poslednjih par godina ima barem 2 miliona iskucanih redova i 100.000 online korisnika i 5000 klasa.

Ne bih da ulazim u raspravu, imam samo jedno pitanje :)
Da li na tom projektu koristis ovde pomenuti apc ili nesto drugo(opcache?) ili sve ide on the fly?
[ VladaSu @ 29.12.2015. 23:48 ] @
Zanemari stil pisanja i predji na poentu. I moj i tvoj kod radi istu stvar i dobija isti rezultat i to je poenta.
[ VladaSu @ 30.12.2015. 00:04 ] @
@svepomalo Iskreno da ti kazem vise ne znam sta se koristi. Dosta se menjalo kako je aplikacija rasla. Ima nas 20 programera koji rade na jednom projektu 5 godina i vise ni ne ulazim u neke delove koda.
To se radi na nivou FW sa kojim se sluzim ali ne gledam kod FW jer je to prosto nemoguce sve do detalja pratiti a istovremeno uraditi svoj deo posla.
Nemoj me drzati za rec ali misli da smo apc koristili probno nesto kratko i nije dale neke rezultate a opcache je dao bolje rezultate ali mislim da se i od toga odustalo posle nekog vremena i sada se nesto drugo koristi. Uglavnom kada sam poslednji put video performanse servera nismo imali problema sa samim php-om. I pored ucitanih svih klasa bio je vrlo brz.
Za sada PHP7 nam je desetak buda brzi i koristi samo trecinu memorije od ranije.
[ svepomalo @ 30.12.2015. 00:18 ] @
@VladaSu

hvala ti na odgovoru, opcache se meni pokazao kao odlicno resenje, podigao mi je performance za nekih 15%
apc nisam koristio, memcahe za sesije (mada planiramo da implementiramo jwt) i redis za kesiranje ka bazi ali to je druga prica vec :)
PHP 7 nismo podizali jos uvek, imamo 20+ servera, kad prodje ovo ludilo oko nove godine krecemo sa njim :)
valjda ce sve da radi :)
[ plus_minus @ 30.12.2015. 01:40 ] @
@VladaSu

Citat:
Mozes da stavis taj kod u komentar posle prvog izvrsavanja i sta time dokazujes? Dokazujes da ce u jednom specificnom slucaju tvoj kod da se brze izvrsi.

Mogu. Ali ne treba, jer će da istekne vreme ttl, arg3. Pa onda mora ponovo da se očita komplet funkcija.
I ne dokazujem tebi ništa, jednostavno - ukazujem na nepravilno korišćenje.
Video si takav jedan primer (tvoj) sličan pa od njega nalepio/prepravio ovde?
Svašta pišu po svojim blogovima, svakakvi.

Citat:
Da li je to pitanje, da li je to problem, da li se time ovde bavimo?
Bavimo se sustinom a ne ko ce lepse napisati slican kod i ciji kod ce brze da se izvrsi.


Ko će lepše? Šta sad, moj primer je `lepši` od tvog ili je jednostavno - logičniji, korektniji?
Da ima tema dodatnih, različitih syntax highlightera za code tagove ovde po ES, pa da se izglasa, čiji je izbor lepši, ovako.. stvarno ne razumem deo citiranog.
Hint: gde su manje mogućnosti da se desi `unpredicted scenario`. To je bitno, ne čiji kod je lepši. Sa 2 razmaka ili jednim tab space-om...

Citat:
Bavimo se sa time da li PHP moze da ima klasu koja se moze koristiti za razlicite requeste. Bavimo se objektom, kada on postoji i gde on postoji i dokle postoji.

Tako je. To i ja kažem i time smo se bavili. Ukoliko: .. [pa od mene par stavki]... jel' tako beše bilo?
Ja i dalje verujem da ne može sve da se skuca jasno u 3 rečenice na pitanje - "Kako to i to zapravo radi? Šta radi klip, a šta stublina u tom i tom određenom momentu?"

Citat:
Ne bavimo se mestom definisanja klasa i brzim i lepsim kodom.

Ne bavimo se, slažem se. Ali onda.. ne znam ni ko te terao da napišeš loš primer za apc.. ? Neko drugi bi te možda ispravio da to nisam bio ja, ne?
Elem, define `pretty` and than define `logically - correct, error -free in any case` .. to me.. please. :)
Ja nisam nigde napisao da ti imaš greške u sintaksi, nego da nešto drugo nije ok.

Citat:
Da li je za pitanje bitno gde se nalazi kod tj definicija klase ili je bitno kada i gde i do kada postoji objekat te klase?

Kako se uzme.

Citat:
Vec sam jednom rekao, da, jesi ubrzao izvrsavanje koda u odredjenom slucaju ali to ubrzanje je mizerno i irelevantno za pitanje jer se ovde ne radi o brzini.

Nikada ali nikada - ukoliko se ne radi o funkciji sa jednim ternarnim operatorom unutra (i slično tome) - nije na odmet ubrzati deo koda gde god može i zaista treba.

Jel' mi ne veruješ? Mirišem li ja malčice i sujete ovde ili ne?

Citat:
Projekat na kojem radim poslednjih par godina ima barem 2 miliona iskucanih redova i 100.000 online korisnika i 5000 klasa.
I zamisli, sve klase se automatski ucitavaju i dovojno mi je da stavim $a = new Class(). Svaka definicija klase je ucitana uvek.
I sta mislis koliko su opale performanse aplikacije? Nista. Nema potrebe za taj if else koji toliko forsiras a nije ni bitan za pitanje.


Pa zašto onda koristite php7 gde je sve 10 puta brže i 3 puta se manje memorije troši?
Zamisli da je bash 10 puta sporiji nego što jeste, a samim tim i sve tvoje .sh skripte koje si do sad iščukao? Jel' bi bilo bolje?
Zašto je BAŠ to primarna stavka na php7 changelog-u? Speed, performance.

Pa da bi ekipe od nekoliko programera/developera mogli da krkaju i još, dodatno, koliko god treba :) ... između ostalog.
I ne znajući da li ti koristiš apc ili ne, moja namera je bila da skrenem pažnju na neke nepravilnosti iz pozitivnih razloga.

Citat:
Zanemari stil pisanja i predji na poentu. I moj i tvoj kod radi istu stvar i dobija isti rezultat i to je poenta.


Ovde pretpostavljam da si se meni obratio, ali svepomalo upao iznenada...

Onaj ko baca pik na stil pisanja nisam ja.
Ja sam bacio pik na nešto drugo.
Poenta je da li ima efekta i kakav je ishod, da, toga sam se ja dotakao.
Primetio sam da si uzeo loš neefektivan primer.
Moj rad u ovom slučaju figurativno `ne postoji` (prvi primer) a obrazložio sam i detalje oko toga.
Drugi moj primer, to je već ok primenjivati i ima i efekta i logike i utiče i na performanse i to može da postoji.
Nikada ne bih upotrebio tehniku kao na prvom primeru za neki svoj rad ( klasa ---> apc_store/add === incomplete_object copy[useless] ).
Jesmo li se sada razumeli i istrošili dovoljno vremena - oko čega .. !?!
[ jablan @ 30.12.2015. 07:41 ] @
Citat:
VladaSu:
...razliku izmedju definicije klase i objekta klase.
Jablana interesuje zivot objekta a definicija nema zivot. Definicija je definijcija.

Paaa sad... :)

U nekim khm jezicima khm koji su skroz objektni, sve je objekat, pa i klasa. Klase su instance klase Class. :) I klasa može da ima život, što da ona sedi kući i smara se dok se objekti ludo provode; može da se menja u toku rada aplikacije, može da dobija nove metode i gubi i menja postojeće itd.

https://en.wikipedia.org/wiki/Trait_(computer_programming)
https://en.wikipedia.org/wiki/Mixin
https://en.wikipedia.org/wiki/Monkey_patch

Ali to nije tema naše emisije, što se PHP-a tiče, razumeo sam sledeće: u 99% rešenja, i objekti i klase žive samo tokom jednog requesta, i ne vide objekate iz drugih requestova; za komunikaciju između objekata iz različitih requestova (a verovatno isto važi i za procese koji nisu trigerovani HTTP-om, već npr. cron-om) koriste se eksterne strukture (keš, baza, fajlovi), a ne funkcionalnosti samog jezika.
[ Nemke_BG @ 30.12.2015. 08:57 ] @
@plus_minus
Zasto bi pa serijalizacija cuvala metode? Ona cuva interno stanje objekta (stanja varijabli, ime klase i slicno) i onda kad unserializujes ona instancira tu klasu i ti imas opet iste metode.

I smanji molim te malo kolicinu teksta koji pises, naporno je citati romane :)

@jablan

Definicija klase i instanca klase nisu ni u PHP-u a ni u jednom drugom jeziku ista stvar.

Ne razumem zasto si naveo bas ove Wiki definicije, jer PHP podrzava Trait-ove.

Sto se tice same teme, da u 99% resenja je tako, ako zelis da imas objekte koji zive kroz vise requestova moras ili da ih serializujes (integrisano PHP resenje, a gde ces da ih storujes je na tebi da odlucis) ili da koristis web server koji sam naveo ranije u temi i da pises PHP servlet-e.
[ jablan @ 30.12.2015. 09:21 ] @
Citat:
Nemke_BG
Definicija klase i instanca klase nisu ni u PHP-u a ni u jednom drugom jeziku ista stvar.

Ne znam šta tačno podrazumevaš pod "definicijom" klase. Klasa je samo "mustra" za kreiranje instanci. Klasa negde može biti definisana, sors kodom od A do Š, ali i ne mora, može se i dinamički kreirati (u nekim jezicima teže, u nekim lakše) i menjati u toku rada programa, kao što se kreiraju i objekti. Dinamički jezici (a valjda je i PHP dinamički tipiziran) nude nam mogućnost da ne moramo baš sve da definišemo unapred. :)
[ VladaSu @ 30.12.2015. 11:00 ] @
Jablan, evo jedno fino objasnjenje sta je klasa tj definicija klase a sta objekat.
Citat:
Think about classes, instances, and instantiation like baking a cake. A class is like a recipe for chocolate cake. The recipe itself is not a cake. You can't eat the recipe (or at least wouldn't want to). If you correctly do what the recipe tells you to do (instantiate it) then you have an edible cake. That edible cake is an instance of the chocolate cake class.


Svejedno da li je ona unapred definisana ili se dinamicki kreira ili se naknadno doradjuje razlika izmedju klase i objekata je uvek ista.
Kazes " I klasa može da ima život". Ne bih rekao da je menjanje klase njen zivot, menjas definicije. Kao sto mozes da menjas recept ali recept nije torta.

Recept ili cak knjiga recepata ne opterecuje nesto posebno kuhinju. Ono sto opterecuje kuhinju jesu posudje, mikser, jaja, secer, brasno, cokolada ...
Zamisli kada bi uzeo knjigu recepata i napravio sve iz te knjige. Od silnih torti i posudja ti na kraju ne bi ni video knjigu recepeta u kuhinji :)
Meni nije problem da mi tu pri ruci stoji recept uvek pa makar ga i ne koristio. Veci problem je to posudje i sirovine i samo vreme izrade torte.
I onda se neko zakaci sta ce mi recept ako sam ga vec jednom procitao. Tu mi je, ne smeta mi, ne opterecuje me, necu da mislim o tome gde je ako mi slucajno zatreba.
Jos ako neko uzme recept... ovako je u kuhinji na svom mestu svima dostupan i svi znamo gde je i svi znamo da postoji i ne treba da ga trazimo.
Pa cak svaki FW uradi include svih fajlova i svih klasa i posle samo koristis new. Ne znam zasto bi nekom smetalo sto sam ja na primeru tako uradio kako rade svi FW.
Ne kazem da nije bolje raditi include onoga sto ti zaista treba ali eto svi FW koje znam se se odlucili da ipak urade include svih klasa iako se 99% ne koristi u vecini slucajeva.
To je kao kada hoces da pripremis kajganu a nemas ni tiganj i sporet a ti trazis dlaku u jajetu. Promasuje se sustina.

"A class is a blueprint which you use to create objects. An object is an instance of a class - it's a concrete 'thing' that you made using a specific class. So, 'object' and 'instance' are the same thing, but the word 'instance' indicates the relationship of an object to its class."

Mislim da mi treba da pricamo o objektima a ne o klasama.
Tebe zanima da jedna te ista torta postoji za vise korisnika jer bez obzira na isti recept tesko je napraviti dve 100% identicne torte i pitas se zasto bi pravio dve identicne torte kada vec imas jedu. I dobro se pitas i ima nesto u tome. Jedino ako to vreme izrade torte ne predstavlja problem onda nije problem svaki put praviti tortu iz pocetka. Glupo i nepotrebno i upravu si ali niko to ne oseti nesto narocito.
Recept nije problem podeliti niti zahteva neke resurse i vreme vec je problem kako koristiti tu jednu tortu a ne bespotrebno praviti njene duplikate.


[Ovu poruku je menjao VladaSu dana 1.01.2016. u 12:17 GMT+1]

[Ovu poruku je menjao VladaSu dana 30.12.2015. u 12:30 GMT+1]
[ plus_minus @ 30.12.2015. 13:24 ] @
Citat:
Nemke_BG:
@plus_minus
Zasto bi pa serijalizacija cuvala metode? Ona cuva interno stanje objekta (stanja varijabli, ime klase i slicno) i onda kad unserializujes ona instancira tu klasu i ti imas opet iste metode.

I smanji molim te malo kolicinu teksta koji pises, naporno je citati romane :)


Zašto bi parkirao kompletan auto u garažu kad možeš motor da mu izvadiš i zaboraviš taj motor negde? Šta će ti motor?
Da smanjim količinu teksta? Ne mogu, jer, eto, ne postoje varijable unutar klase, nego svojstva.
[ jablan @ 30.12.2015. 13:48 ] @
Citat:
VladaSu:
Mislim da mi treba da pricamo o objektima a ne o klasama.

Izvini, možda sam te zbunio, pošto su u nekim jezicima klase takođe objekti (tvoj primer je dobar, dakle i recept je moguće menjati). Sve to u dinamičkim jezicima može da se dešava u rantajmu, tj. u toku rada aplikacije.

Citat:
Jedino ako to vreme izrade torte ne predstavlja problem onda nije problem svaki put praviti tortu iz pocetka. Glupo i nepotrebno i upravu si ali niko to ne oseti nesto narocito.

Da, sa aspekta performansi aplikacije. Ali to nije jedini aspekt od značaja. Bitno je i vreme izrade programa, količina boilerplate koda (serijalizacija, deserijalizacija, sinhronizacija između paralelnih zahteva itd), pouzdanost toga što dobiješ na kraju (jer unosiš još igrača - keš, baza, itd u igru), troškovi održavanja itd. Ali hajd da ne širimo sad priču...
[ VladaSu @ 30.12.2015. 13:58 ] @
Da, da. Upravu si. Nema tako nesto u PHP da klada bude shared :) Moze se i u PHP u runtime dodati neka metoda, izmeniti, izbrisati. Ali to je vise menjanje recepta u toku pravljenja torte.
[ Mister Big Time @ 26.02.2016. 01:19 ] @
Citat:
jablan:
Poslednji put kad sam aktivno radio sa PHP-om (ima tome skoro 15 godina), nije bilo klasa, nije bilo frejmvorka i sve što se dešavalo dešavalo se u scope-u jednog requesta.

Znam da se u međuvremenu dosta toga promenilo, pokušavam sad da izguglam kako danas sve to funkcioniše, ali ne uspevam. Google: "php process architecture" i slične pretrage ne daju ništa korisno.

Dakle, kada se učitavaju npr. model klase u PHP-u? Da li se čuvaju između requestova ili se uvek iznova učitavaju? U kom procesu žive? Kako se npr. čuvaju singleton instance? Itd.


Mnogo se toga promenilo od tada. Probaj PhalconPHP ako nemas vremena na ruke da se 'igras'. Primenom mnogih dobrih koncepata tipa IoC / DI moze mnogo lepse sve da bude.

Npr. za asinhronu komunikaciju izmedju PHP procesa ja koristim MessageBroker server (RabbitMQ ili Beanstalk koji je mnogo prostoji in memory MQ). Prvi program nesto odradi - spakuje sve to u poruke za drugi proces/program, koji preko MQ pokupi poruke i odradi sta treba u pozadini na-te-nane.

Kolege su vec dosta toga napisali, da se ne ponavljam dodacu samo ono sto smatram da fali.

Mislim da treba istaci osnovno ogranicenje HTTP protokola koje postoji od vajkada - to je stateless protokol. Svi se nekako trude da to zaborave ali ne ide, uz sve tehnike i resenja da se 'nabudzi' da bude statefull.

Opcode cache je nesto najbolje sto se desilo pre koju godinu u PHP svetu, a zatim sada i PHP7. Kao i resenja tipa PhalconPHP kojima nista ne moze prici ni blizu po performansama.

Npr. ja sam napravio sopstvenu implementaciju ORM lejera (modeli). Nisam siguran da bi u bilo kom drugom prog. jeziku tako nesto bilo uopste i moguce. Instanciras model koji ima samo definiciju (naziv klase modela = naziv tabele u bazi). To naravno je normalno u svakom ORM-u. Ali nacin implementacije base model-a koji hendluje sve to je vrlo zanimljiv i nadasve dinamicki.

Laku noc