ugrás a tartalomhoz

Minek neveznétek? (a kérésekre lefutó php kódokat)

inf · 2011. Nov. 14. (H), 15.58
Van egy kis gondom az elnevezésekkel:

A process is an executing instance of an application. For example, when you double-click the Microsoft Word icon, you start a process that runs Word. A thread is a path of execution within a process. Also, a process can contain multiple threads.

Ez alapján a php.exe egy Process, és az egy-egy kérésre lefutó kódok mind-mind egy-egy Thread-et alkotnak.

Ez az elnevezősdi nekem a cachelés miatt fontos. Amikor egy-egy kérésnél a Bootstrap felépíti a környezetet, meg konfigurál ezerrel, az egy csomó erőforrást felemészt. Ezt szeretném megspórolni, úgy, hogy lementem a Bootstrap utáni állapotot, majd egy új kérésnél visszatöltöm azt (osztályokkal együtt).

Valahogy így gondoltam el a nevezéktant:

interface Thread
{
	public function run();
	public function recover(RecoveryPoint $recoveryPoint);
	public function getEnvironment();
}

interface RecoveryPoint
{
	public function save();
	public function load();
	public function getEnvironment();
}
Mondjuk ha a Thread nem talál visszaállítási pontot, akkor lefut a Bootstrap, és létrehoz egy visszaállítási pontot, ha viszont talál, akkor onnan tölti be az osztályokat és az aktuális környezetet, nem pedig egyesével a fájlrendszerből.

Kérdés, hogy jók e ezek az elnevezések? (Mindenesetre én jobbnak találom őket, mint a Zend Framework-ben a BootstrapBootstrap-et...)
 
1

Daemont próbáltál már írni?

Hidvégi Gábor · 2011. Nov. 14. (H), 16.09
Daemont próbáltál már írni? Esetleg a node.js-t nézted már? Hasonló problémákkal küzdök a munkám során, és úgy látom, a php az ilyen típusú feladatmegoldásra nem a legtökéletesebb.
2

Nagyon nem jó az

Protezis · 2011. Nov. 14. (H), 17.08
Nagyon nem jó az elnevezés.

...a thread is contained inside a process. Multiple threads can exist within the same process and share resources such as memory, while different processes do not share these resources.
4

Szóval inkább akkor Process

inf · 2011. Nov. 14. (H), 17.40
Szóval inkább akkor Process lenne a jó elnevezés? Egyébként annyira nem számít, mert php-ban nincsen több szál egymás mellett, legalábbis nem tudok róla.
17

Hali! Szerintem is process.

prom3theus · 2011. Nov. 15. (K), 13.46
Hali! Szerintem is process. Igaz, hogy - ha igencsak megkopott op-re emlékeimben még bízhatok - egy process-en belül egy thread azért mindig van (nevezzük ezt main-nek), de PHP esetében ez az egy egyben a maximum is, így nincs igazán jelentősége, hogy thread vagy process. Mivel azonban a PHP jellemzően nem igazán támogatja a multi-threaded techinikákat, tehát process-centrikus, egyszálú, következetesebbnek tartom a nyelv irányába a "process" használatát abban a szituban, amiben kérdezted.
19

Ahm, hát én abban a reményben

inf · 2011. Nov. 15. (K), 15.47
Ahm, hát én abban a reményben neveztem Thread-nek, hogy hátha a későbbiekben fejlesztenek annyit a php-n, hogy többszálú lesz.
20

Szerintem még a PHP 6

prom3theus · 2011. Nov. 16. (Sze), 15.36
Szerintem még a PHP 6 roadmap-jében sem szerepel a multi-threading :) az pedig vagy azt jelenti, hogy majd idő közben belecsempészik mint a Trait-eket, vagy azt hogy a következő 2-8 évben valamikor esetleg lehet, hogy elképzelhető lesz a támogatás felvetése :D
21

Akkor marad a Process. :-)

inf · 2011. Nov. 16. (Sze), 19.58
Akkor marad a Process. :-) Nem biztos, hogy lesz egyébként ilyen objektumom, attól függ, hogy hogyan mentem az aktuális állapotát a rendszernek és a kérésnek. Lehet memento-val meg lehet simán szerializálni is, ha memento lesz, akkor nem kell a Process. Ugye ezt valahogy így lehetne szemléltetni:

$system=$process->restoreSystem('how to find serialized system');
//vagy:
$system=new System();
$system->recover('how to find the memento of the system');
Ez utóbbival bonyolultabb az adatok mentése, viszont nem kell még egy külön rendszer feletti objektum is. Hát egyelőre csak agyalok rajta, hogy mi lenne a legjobb megoldás a feladatok szétosztására...

Most egyelőre ilyen feladatokat (vagy inkább eseményeket) írtam össze:
  1. Rendszer visszaállítás kezelése
  2. Bootstrap - Autoload készítése, framework regisztráció bele, stb..
  3. Autoload - class fájlok betöltése
  4. Autoload - loggolás, hogy később egy fájlba lehessen csomagolni a rendszer visszaállításhoz szükséges osztályokat
  5. Application futtatása
  6. Client visszaállítása Session-ből
  7. Client kéréseinek kezelése az Application-ök segítségével


Ezt a cache-et végülis úgy is fel lehet fogni, hogy a rendszer állapotát állítjuk vissza egy korábban elmentett formára, vagy mondjuk ha a HTML-t cacheljük, amit visszadob a rendszer, akkor a Response állapotát állítjuk vissza egy mentett formára, és így tovább. Aztán vannak olyan tényezők, amik alapján ki lehet keresni ezt a korábban mentett verziót, ilyen mondjuk a kérés, a jogosultságok, stb... Ilyen elágazások a verziókezelőkben is vannak, úgyhogy utánanézek, hogy ők milyen elnevezéseket használnak a témában.
22

A Memento-val az a baj, hogy

inf · 2011. Nov. 17. (Cs), 00.05
A Memento-val az a baj, hogy mondjuk ha van ez a System példány, és vannak benne Application példányok, akkor az Application példányokban is valamilyen tulajdonságként ott lehet maga a System példány. Tehát ha a System példány belső állapotát (amihez ugye hozzá tartozik egy csomó létrehozott objektum) szerializálom, akkor abban maga a System példány is benne lenne. Ezért a Memento szerintem nem alkalmas ilyen módon rekurzív állapotok mentésére, inkább csak egyszerűbb objektumok vagy stringek mentésére... Szóval marad az, hogy van egy külön objektum, ami be- és kicsomagol, meg letakarítja az előző példányt...
3

A RecoveryPoint helyett

inf · 2011. Nov. 14. (H), 17.33
A RecoveryPoint helyett valszeg Memento lesz, viszont a Thread helyett akkor mit javasoltok?

Egyébként még nem próbálkoztam többszálú dolgokkal meg deamon írással, nyilván azért nem stimmelnek az elnevezéseim, mert nem értek hozzá :-)

Itt igazából arról van szó, hogy amikor lefut a bootstrap, akkor betöltődik egy csomó osztály, meg létrejön a környezetben egy csomó erőforrást menedzselő program. Aztán meg létrejön a Session, meg elkezd dolgozni a Distributor, hogy megtalálja a Controller-t, ami a kérést fogja kezelni.

Na most a Session létrejötte előtti szakasz csak akkor változik, ha cserélgetjük a rendszer fájlokat, szóval azt érdemes betenni egyetlen fájlba, vagy a memóriába, és onnan visszatölteni.

Persze a többit is érdemes cachelni, csak az a rész már elágazik jogosultságtól, erőforrás használattól, meg minden mástól függően, szóval ott már bonyolultabb dolog a cachelés...
5

Szerintem érdemes Janoszen Y

Hidvégi Gábor · 2011. Nov. 14. (H), 17.57
Szerintem érdemes Janoszen Y Proclub cikkét elolvasnod, hátha találsz benne olyat, ami érinthet.
6

Meglátjuk :-)Tákolok egy új

inf · 2011. Nov. 14. (H), 18.36
Meglátjuk :-)

Tákolok egy új keretrendszert, mert nem érzem úgy, hogy a meglévők passzolnának az elképzeléseimhez. Mindig ott rontom el az eszköz keresést, hogy belenézek a forrásba :D

szerk:
Jah azt a cikket olvastam, de amikor rákérdeztem egy-két alapvető kérdésre, akkor elküldtek a wikipediára :D


Egyébként ha jól értem, akkor van a process, ami valamilyen oprendszer alatt éppen futó program. Van a daemon, ami olyan program, amihez nincs ablak, csak úgy a háttérben futogat (gondolom megegyezik a windows-nál a service-el, csak a service-nek gondolom szabványos a felülete). A processen belül meg ha jól gondolom vannak thread-ek, amik párhuzamosan futnak, szóval a process a kapott processzor idejét köztük osztja szét.

Szóval itt az a kérdés, hogy amikor bejön a http szerverhez egy kérés, akkor új process vagy új thread jön e létre, vagy esetleg valami más?

Asszem kicsit jobban bele kell ásnom magam a php script lifecycle kérdésbe, hogy erre választ kapjak...
7

Attól függ

janoszen · 2011. Nov. 14. (H), 19.11
Attól függ, hogy írod meg. Van olyan daemon, amely sem threadet, sem processt nem csinál, hanem egy async IO loopon várakozik interakcióra. Ez főleg akkor jó, ha nagyon kevés CPU-t igénylő feladatod van, viszont sokat kell várni háttérfeldolgozásra (pl. MySQL, külső API, chat, stb). Ha szabvány webkiszolgálás a célod, akkor PHP-val leginkább a multi process modell jön szóba olyan formán, hogy a memleakek elkerülésére időnként újraindulnak a workereid. Transzport protokollnak javaslom a FastCGI-t. Ugyan kevésbé formális leírás nem nagyon létezik hozzá, de viszonylag egyszerű. Ha érdekel, elmondom, hogy működik. Vagy akár cikket is írhatok róla.

Ami a "szabvány" webkiszolgálást illeti, két model van. Vagy mod_php fut a rendszer alatt, vagy FastCGI. Az első esetben az Apache MPM függvényében vagy processt vagy threadet indít (inkább az előbbi) és abban szolgálja ki a beállított mennyiségű kérést. FastCGI-nél egy spawner indítgat a háttérben PHP processeket a kiszolgálásra, amikre a webszerver rácsatlakozik. Ez esetben irreleváns, hogy a webszerver mit csinál, mert a PHP-t nem érinti, az mindenképp processeket fog indítgatni.

Off: Miért érzem úgy, hogy a projektjeid sosem annyira gyakorlati jellegűek, mint inkább kísérletezni akarsz ezekkel? Ha ilyen projektre áhítozol, érdemes lenne elmenned a DotRollhoz dolgozni, mert ugyan most távozom külföldre, pont egy olyan rendszeren dolgozik a csapat, amelyik async IO looppal működik.
8

Hát az elmélet sokszor jobban

inf · 2011. Nov. 14. (H), 19.19
Hát az elmélet sokszor jobban érdekel, mint a gyakorlat, legalábbis programozásban.
9

Tannenbaum

janoszen · 2011. Nov. 14. (H), 20.40
Ez esetben ajánlom alapos tanulmányozásra Andrew S. Tannenbaum könyveit.
10

+1

Poetro · 2011. Nov. 14. (H), 20.50
Én az Andrew S. Tanenbaum: Operációs rendszerek könyv alapján értettem meg a többszálú működést.
11

Nektek hogy van időtök ennyit

inf · 2011. Nov. 14. (H), 23.30
Nektek hogy van időtök ennyit olvasni? :D Én egy könyvet próbálok elolvasni már több hete, de még az sem jön össze :D Mindig van valami más helyette...
No leszedtem azt a könyvet, de előbb clean code lesz, amit végigtolok... Azt hiszem akkor Thread helyett meg maradok az Application elnevezésnél, amíg nem találok ki valami jobbat...
12

..

Greg · 2011. Nov. 14. (H), 23.45
Tanenbaum konyveit elvezet olvasni(legalabbis nekem az volt). A
leszedtem
az szerintem nem szep dolog. Hidd el hogy megeri kifizetni azoknak a konyveknek az arat.
13

Vettem már én is pár könyvet,

inf · 2011. Nov. 15. (K), 02.34
Vettem már én is pár könyvet, de nincs pénzem állandóan könyveket vásárolni. Egyébként érdekes kérdés, hogy legális e az oldal, ahonnan leszedem a könyveket, vagy sem. Mindenesetre fizetni kell az account-ért, és felajánlja, hogy amazonon vedd meg a könyvet, ha nem vagy regisztrálva, és már nagyon sok éve megy ez az oldal...
15

Gondolom mennyire legalisan

Greg · 2011. Nov. 15. (K), 10.59
Gondolom mennyire legalisan mukodhet az az oldal. Ha nincs penz konyvre akkor ossze kell szedni a netrol ingyenes forrasokbol az informaciokat. Egyebkent amikor nekem nincs penzem tejre en sem setalok be hozzatok es veszem ki a hutobol :). Ha erted mire gondolok.

Masik, hogy szerintem itt egy kis felreertes van(vagy en ertelek felre). A kerdesed igazabol arra iranyult hogy minek nevezd el azokat a reszeket a keretrendszeredben amik felallitjak a rendszert, betoltik a config-okat, stb. Ezeket te csak ritkan szeretned meghivni es cache-ben tarolni. Ennek kb 0 koze van a threadhez is, meg a processhez is szerintem.
Egyebkent ha keretrendszert fejlesztesz akkor szerintem, de a zend es symfony mintajan indulj el, ahol nagyon sok eroforras a rendszer felallitasa, hanem probalj meg valami kevesbe resource-hungry megoldast.
18

Az oldal a pdfchm.net,

inf · 2011. Nov. 15. (K), 15.39
Az oldal a pdfchm.net, utánakerestem, van ahol azt írják, hogy legális, van ahol azt, hogy nem, de kevés róla az info a neten. Már legalább 5 éve megy amúgy.

A kerdesed igazabol arra iranyult hogy minek nevezd el azokat a reszeket a keretrendszeredben amik felallitjak a rendszert, betoltik a config-okat, stb.

A kérdésem nem erre irányult. Ami feállítja a rendszert az a Bootstrap... Engem az érdekel, hogy magát a teljes "rendszert" minek nevezzem. Egyelőre annál a változatnál maradtam, hogy a Server a teljes rendszer, ami képes Application-öket futtatni. Az Application-ök esemény kezelőket regisztrálnak be a szerveren. Van még ezen kívül a Client, amit kiszolgál a Server miután az alkalmazásokat elindította.

pl egy webshop esetében az index.php valahogy így néz ki:

require_once('Framework/Server.php');

$server=new Framework\Server();

$webshop=new Framework\Application();
$webshop->setDirectory('Webshop');
$server->execute($webshop);

$client=new Framework\Client();
$server->handle($client);
Egyébként engem is az zavar ezekben a rendszerekben, hogy feleslegesen túl vannak bonyolítva. Ezért kezdtem el sajátot írni. A cache meg egyébként pont arra van, hogy az erőforrás igényt csökkentse. Pl a fenti kódnál a $server->execute($webshop); részig lehet Memento-t készíteni a $server állapotáról, mert az a rész minden kérésnél egyforma... Egyelőre egyébként nem foglalkozom ezzel a Memento kérdéssel, majd csak akkor ha a fontosabb részei megvannak a keretrendszernek.
14

Ha daemont szeretnél írni,

Hidvégi Gábor · 2011. Nov. 15. (K), 10.07
Ha daemont szeretnél írni, akkor ahhoz thread safe php kell, vagy pedig ebben az esetben nem számít?
16

Nem számít

janoszen · 2011. Nov. 15. (K), 11.06
Nem számít, csak akkor, ha threaded MPM-es Apache-ot használsz.