Sziasztok!
Nemrég készítettem egy okostelefonokra optimalizát, webalapú szolgáltatást, ami sütikben tárolja a szolgáltatás használata során a különböző információkat. Hónapok óta a szerveren van a cucc, amit nem én üzemeltetek, hanem önkormányzati fenntartású. Pár napja megadta magát a php-s unserialize() függvény, ami a sütiben tárolt adatokat, tömbbé alakítja vissza és átadja egy tömb-változónak.
$suti_tomb = unserialize($_COOKIE["valami"]) or die("Süti olvasási hiba!!");
Az itthoni helyi-hálózati apache szerveremen hibamentesen működik az alkalmazás, az alkalmazást újra felraktam a szerverre, ott pedig a fenti hiba jelentkezik. Más is járt már így? Telefonáltam a rendszergazdáknak, ők azt mondják, hogy már egy ideje nem frissítették sem a webszervert, sem a PHP-t. Mire tippeltek, mi lehet a gond? Nekem már ötletem sincs, a cookie nyers tartalmát ki tudtam íratni, úgyhogy a cookie létrejött és a tartalma is olvasható, viszont muszáj lenne visszaalakítanom tömbbé, mert a benne tárolt adatokkal műveleteket kell végeznie az alkalmazásomnak. A számlázás már pár hete megtörtént, addig hiba mentesen működött az alkalmazás, a hiba jelentkezéséig nem hajtottam végre semmilyen módosítást.
Köszi.
MysteryKe.
- 8271 megtekintés
Hozzászólások
Mi a pontos hibauzenet? Tehat php error log mit mond?
Miert nem sessionbe tarolod?
- A hozzászóláshoz be kell jelentkezni
nincsen hibaüzenet, pedig bekapcsoltam a display_error-t az ini_set függvénnyel. az error log-hoz nem férek hozzá, nem az én szerverem, hanem az önkormányzat informatikai részlegéjé. Elmondásuk szerint semmilyen biztonsági szabályt nem módosítottak, nem változtattak semmit sem a php beállításokban és nem frissítettek semmit az elmúlt pár hétben. Ők sem értik mi lehet a gond.
Sajnos a felhasználás módjából eredően nem használhatok session változókat. Nem mondhatom el, hogy miért, mert még nem lett nyilvánosságra hozva az alkalmazás, majd csak kb. fél év múlva lesz éppen ezért nem mondhatok róla többet :) Csak hogy pár nappal ezelőttig működött az unserialize, aztán nem :)
- A hozzászóláshoz be kell jelentkezni
phpinfo(); össze hasonlítása a két szerver között meg volt ?
- A hozzászóláshoz be kell jelentkezni
Nagyon sokminden eltér :) php verzió, a használt oprendszer, a használt apache verziószámai.... stb. :) de nincsenek tiltott függvények a szerveren :)
- A hozzászóláshoz be kell jelentkezni
php verzió pontosan ?
mehetne a kódnak egy error_reporting(E_ALL);
- A hozzászóláshoz be kell jelentkezni
PHP Version 5.3.27
- A hozzászóláshoz be kell jelentkezni
$suti_tomb = unserialize($_COOKIE["valami"]);
var_dump($suti_tomb);
Ez vissza adja a dolgokat?
Esetleg $_COOKIE['valami'].
setcookie() milyen paraméterekkel van ellátva?
- A hozzászóláshoz be kell jelentkezni
a var_dump nem ad vissza semmit.
az error_reporting pedig "22519" tért vissza.
- A hozzászóláshoz be kell jelentkezni
Na akkor az a kérdés, hogy mi van a Te szervereden php verzió, cookie lejárat stb... nézd át.
Keres egy free hostingot nézd meg ott is ha a Te gépeden és free-n is megy akkor a cél szerveren van el kurv* valami és rád akarják majd verni...
- A hozzászóláshoz be kell jelentkezni
még nem reggeltem free szerverre, de a cookie biztosan nem járt le, mert 1 óra élettartamot adtam meg neki.
- A hozzászóláshoz be kell jelentkezni
A magyar idő és az UTC különbsége okozhat ilyen hibát, szerintem próbáld meg nagyobb élettartammal. Mivel hibaüzenet nincs, lehet, hogy a böngésző és a szerver ideje közötti különbség miatt a süti azonnal lejár.
- A hozzászóláshoz be kell jelentkezni
" az error_reporting pedig "22519" tért vissza."
Te mégis hogy vállaltál el bármilyen projectet?
// Happy debugging, suckers
#define true (rand() > 10)
- A hozzászóláshoz be kell jelentkezni
:D
- A hozzászóláshoz be kell jelentkezni
Amit unserializ-álsz, annak van értéke? Nem emlékszem pontosan,de néha valamit hack-elni kell az unserialize környékén...
- A hozzászóláshoz be kell jelentkezni
igen, van. simán ki tudom íratni a cookie nyers tartalmát, azzal nincsen gond, elérem.
- A hozzászóláshoz be kell jelentkezni
Ugye nem windows szerver?
Mondom teszteld több helyen.
- A hozzászóláshoz be kell jelentkezni
Amin fejlesztem, az egy XAMPP, Mac OS X 10.7.4-en (Apache/2.2.26 (Unix)), PHP Version 5.3.1
A szerveren pedig linux fut: Apache/2.2.14 (Unix) DAV/2 mod_ssl/2.2.14 OpenSSL/0.9.8l PHP/5.3.1 mod_perl/2.0.4 Perl/v5.10.1
ingyenes helyre nem reggeltem még.
- A hozzászóláshoz be kell jelentkezni
Nekem egy dolog (biztosan) nem tiszta a történetben: minden próbálkozásnál hibázik vagy csak egyes klienseknél?
- A hozzászóláshoz be kell jelentkezni
Minden próbálkozásnál és minden kliensnél hibázik a hét eleje óta. Windows-os és Mac-es Safariban is próbáltam iOS-Safari ügynökre állítva is hibázik, és az összes telefonos böngészőről, előtte nem volt semmi probléma
- A hozzászóláshoz be kell jelentkezni
Akkor ez nem nyert. Arra gondoltam, hogy esetleg valami kliens oldali váltás okozza. (pl. a teszteléshez használt mobilokon felhúzták az androidot 4.3-ra a korábbi verzióról)
Viszont.. ugyan offtopic, de itt az első, a kérdéshez fűzött komment megerősítette, amit csak gyanítottam: óriási sec.hole ha a cookie-ból visszakapott adatot adod oda az unserialize fv.-nek!
ui: ugye azt a hibát nem követed el, hogy a cookie kiírását követően, még abban a menetben vissza is akarod olvasni?
- A hozzászóláshoz be kell jelentkezni
őőőőőő...? Már nagyon fáradt vagyok :)
Mire gondolsz pontosan? Eddig nem volt semmi problémám, minden kliensen működött. Milyen más megoldást javasolsz a cookie-ből való tömb visszanyeréséhez?
Cookie létrehozás és azonnali visszeolvasás sosem történik.
- A hozzászóláshoz be kell jelentkezni
Melyik része nem tiszta?
Cookie-ban max. a session azonosítójára utaló kódot tárolnék, minden mást adatbázisban. (azért a dologhoz hozzátartozik, hogy tavaly foglalkoztam pár hónapig PHP-vel, se előtte, se azóta, szóval nem árt fenntartással kezelni az ilyen megjegyzéseimet)
Egyébként érdemes végigolvasni a php.net/unserialize oldalon a leírást, a WARNING címkével ellátott részeket és a kommenteket is.
- A hozzászóláshoz be kell jelentkezni
Sajnos ebben az esetben nem járható út az adatbázis (sokat gondolkoztam rajta, hogy azzal csináljam-e).
Folyamatosan olvasom az unserialize()-re vonatkozó leírásokat. A függvény egy stringet vár, amit meg is kap, hisz ki tudom nyerni a cookie-ból a tartalmat. Ezért nem értem, hogy miért nem működik a függvény. A fejlesztés ideje alatt, folyamatosan a jelenlegi szervert használtam és a tesztelési időszakban is, amikor számtalan telefonnal és böngészővel próbáltuk ki az alkalmazást, és még utána is kértek módosításokat a megrendelők, utána megint tesztidőszak....... szóval jópár hónapig ment a dolog a jelenlig szerverrel, úgy, hogy a cookie-kezelő részeken azótan nem módosítottam egy karaktert sem és a számlázáskor is működött minden. Egészen a múlt hétig.
szerk.: A cookie nyers tartalmát lazán ki tudom íratani egy változóba: "a:25:{s:4:\"adat1\";s:6:\"valami\".........." stb. Az unserialize()-nek szerintem ezt minden probléma nélkül kellene értelmeznie. Szóval cookie hozzáférési gond nincsen...
- A hozzászóláshoz be kell jelentkezni
A hiba elhárítása kapcsán szerintem le kellene ülni az üzemeltetőkkel és azon a szerveren utánajárni, ahol hibázik.
Serialize helyett inkább használj json formátumot, az talán kevesebb biztonsági problémát okoz. (Biztos nem vagyok benne)
- A hozzászóláshoz be kell jelentkezni
"Leültem" az üzemeltetőkkel, de ők azt állítják, hogy nem történt változás a rendszerükben. Részükről ennyi.
szerk: jaja, éjjel, miközben forgolódtam az ágyban, nekem is eszembe jutott a JSON
- A hozzászóláshoz be kell jelentkezni
Nem beszélgetésre gondoltam. :)
Egyedül nem turkálhatsz éles adatok között, de felügyelet mellett talán megoldható, hogy az éles renszerhez odaengedjenek és közösen keressétek meg a hiba okát.
Ez az egész annyira zűrös, hogy akár php bug is lehet, de akár egy utólag berakott biztonsági eszköz(tűzfalféleség) is belerondíthat. Az utolsó mondat 100%-ig a fantázia terméke, csak már ilyesmi is eszembe jut, ahogy olvasom a történetet.
- A hozzászóláshoz be kell jelentkezni
Ilyenkor szokás tesztelni több szerveren ha már a cél szerver ennyire védett...
Én se szoktam bizonygatni az igazam, hogy nálam jól működik és ha kell akkor be mutatom, hogy egy free tárhelyen is képes működni és a cél szerver szar nem a kód.
- A hozzászóláshoz be kell jelentkezni
Azért ez ennyire nem egyszerű, de nem mennék részletekbe.
Lényeg, hogy meg kell oldani és ez úgy, hogy csak az egyik próbálja, nem fog menni, mert egyikük sem rendelkezik 100%-os rálátással a másik területére.
- A hozzászóláshoz be kell jelentkezni
ha korábban nem volt magic quotes akkor most stripslashes($_COOKIE['akarmi']) t használj.
- A hozzászóláshoz be kell jelentkezni
"unserialize($_COOKIE["valami"])"
Engedje meg, hogy asztakurva. Ezt nagyon gyorsan takaritsd le az internetrol, mielott valaki mas teszi meg.
- A hozzászóláshoz be kell jelentkezni
Egyebkent ja.
----------------
Lvl86 Troll, "hobbifejlesztő" - Think Wishfully™
- A hozzászóláshoz be kell jelentkezni
Egyébként miért is? Mi a baj vele? na, meg "asztakurva" "sz"-el?
- A hozzászóláshoz be kell jelentkezni
- A hozzászóláshoz be kell jelentkezni
Warning
FALSE is returned both in the case of an error and if unserializing the serialized FALSE value. It is possible to catch this special case by comparing str with serialize(false) or by catching the issued E_NOTICE.
Warning
Do not pass untrusted user input to unserialize(). Unserialization can result in code being loaded and executed due to object instantiation and autoloading, and a malicious user may be able to exploit this. Use a safe, standard data interchange format such as JSON (via json_decode() and json_encode()) if you need to pass serialized data to the user.
- A hozzászóláshoz be kell jelentkezni
Kulcs a lábtörlő alatt :)
Pár évvel ezelőtt az előző munkahelyemen egy elég nagy franchise cég frissen elkészült, átadás előtt álló ügyviteli rendszerét vizsgálta a biztonsági auditor.
Bejelentkezett egy korlátozott felhasználóval majd az URL-ben átírta a felhasználó azonosítót az egyesre, így adminisztrátori jogot kapott. A kétperces művelet után felállt a gép elől és nem folytatta tovább az auditot :D
--
maszili
- A hozzászóláshoz be kell jelentkezni
:)
----------------
Lvl86 Troll, "hobbifejlesztő" - Think Wishfully™
- A hozzászóláshoz be kell jelentkezni
Mit serializálsz? Ha osztály, akkor lesz benne egy \0 karakter, amit nem hiszem, hogy túl sok midnen díjazna.
(Az igazán vicc az, hogy ez be is lett jelentve a PHP-soknak, hogy talán nem biztos, hogy a legjobb karaktert választották, erre az volt a válasz, kb. hogy mi a faszt zavar, senki nem mondta, hogy text only lesz a serializálása a PHP-nek. Kár, hogy ezen kívül minden text-be megy PHP-ben, amit serializál és semmi nem indokolja, hogy ez se oda menjen. Cserébe így meg bizonyos esetekben jól meg tudja szivatni az embert.)
----------------
Lvl86 Troll, "hobbifejlesztő" - Think Wishfully™
- A hozzászóláshoz be kell jelentkezni
Fasza is ám a null byte már csak mappa elérés kell egy get-be és kész is a gond.
Azért valami escape-et használnék főleg ha már user-től jön az adat, mert mint tudjuk user-be sose bízunk akkor se ha helyi hálózaton van használva!!!
- A hozzászóláshoz be kell jelentkezni
Pusztán az escape-elés elég? Ezt a függvényt csak egyszer nézegettem, hogy mit lehet kezdeni vele, de úgy rémlik, nem egy életbiztosítás ha a user bármit átadhat neki.
- A hozzászóláshoz be kell jelentkezni
Mimimimi?
----------------
Lvl86 Troll, "hobbifejlesztő" - Think Wishfully™
- A hozzászóláshoz be kell jelentkezni
egy sima asszociatív tömböt szerializálok, amiben van 19 elem, amiben csak 1 elem tartalmaz közvetlenül a felhasználó által bevitt adatot, az is védve van minden cucctól.
- A hozzászóláshoz be kell jelentkezni
És mit okozhat, ha nem azt kapod vissza a cookie-ból, amit belírtál? Ezt végig gondoltad?
- A hozzászóláshoz be kell jelentkezni
most éppen az van, hogy nem kapom vissza a tömböt, amit beleírtam és ez elég nagy baj.
most kipróbáltam, hogy bekopizom a cookie tartalmát egy változóba és azt unserializálom és úgy remekül megy az unserialize()
- A hozzászóláshoz be kell jelentkezni
Nem erre gondoltam. Hanem arra, hogy mondjuk valaki egy nullát egyesre cserél a szerializált tömbödben.
- A hozzászóláshoz be kell jelentkezni
Ha a 19 elembol csak 1 van olyan, ami user input, akkor megis mi a retkes feneert kell halozaton utaztatni es odaadni lehetosegnek, hogy az user buzeralja? Miert nem sessionban van es csak az utazik cookieban, ami valoban client side? Bar az is erdekelne, hogy mi az az egy adat, mert valahogy nekem altalaban egy session id-n kivul mas nem kell cookieba.
Arrol nem is beszelve, hogy a cookiek darabra es meretre is limitalt joszagok.
----------------
Lvl86 Troll, "hobbifejlesztő" - Think Wishfully™
- A hozzászóláshoz be kell jelentkezni
"Arrol nem is beszelve, hogy a cookiek darabra es meretre is limitalt joszagok."
Meg kodolasra es karakterre, illetve bongeszo fuggoen valamelyik nem szeret meg ezt azt.
A kerdezonek:
Eloallitashoz: base64_encode(serialize($idiota_sessionben_utazo_adatom));
Visszaallitashoz: $idiota_sessionben_utazo_adatom = unserialize(base64_decode($_COOKIE['idiota_cookie_amiben_serializalt_adat_utazik']));
// Happy debugging, suckers
#define true (rand() > 10)
- A hozzászóláshoz be kell jelentkezni
Igen, a kódolást már mondtam. Viszont a base64 még annyira sem segít abban, hogy túl sok adat megy egy cookieban. Azon meg főleg nem, hogy oda nem való adat megy.
----------------
Lvl86 Troll, "hobbifejlesztő" - Think Wishfully™
- A hozzászóláshoz be kell jelentkezni
+1
- A hozzászóláshoz be kell jelentkezni
Az elbaszottabb böngészőkben is 64k a limit / cookie, manapság már 4mb. Ha van olyan hülye, hogy cookieban tárol adatokat, akkor utaztassa csak. A base64 meg már csak azért is segíteni fog, mert a cookiek tartalma eléggé restricted, nem véletlen, mivel headerben utazik, így legalább lefedte az összes elcseszett karaktert ami előfordulhat. De ha van jobb ötleted a base64 -en kívül arra hogyan tömörítsen úgy, hogy a szabályoknak is megfelel, örömmel várom.
// Happy debugging, suckers
#define true (rand() > 10)
- A hozzászóláshoz be kell jelentkezni
Igen, ami kliensoldali adat, arra local storage, ami szerver oldalra kell, az post. Egyébként meg tényleg ritka az, hogy kelljen cookie.
----------------
Lvl86 Troll, "hobbifejlesztő" - Think Wishfully™
- A hozzászóláshoz be kell jelentkezni
Azért a cookie használata elkerülhetetlen akár csak session tárolásra, de egy 32 byte hosszú session id-t utaztatni még mindig sokkal egyszerűbb. Persze vannak itt is kerülő utak, pl websocketet használni és akkor a session már adott, viszont a visszatérő látogatók trackelése ott nem megoldott. A cookie jó dolog, csak nem szabad eszeveszett hülyeségbe belemenni mint ahogy a topic nyitója tette, neki marad a base64 és a bazi nagy header
// Happy debugging, suckers
#define true (rand() > 10)
- A hozzászóláshoz be kell jelentkezni
Mivel én 4K-ra emlékeztem, kipróbáltam, de valami nem kerek: ha 4K fölé megy a cookie mérete (HTML4, tehát cookie és nem local storage!), akkor az nginx elhasal azzal, hogy túl nagy a header.
Mivel az nginx-t nem igazán ismerem, csak épp ez volt kéznél, nem tudom, mit gondoljak: szervert kellene átkonfigurálni?
- A hozzászóláshoz be kell jelentkezni
Igen, az nginx alapértelmezettben eléggé szűkre fogja a dolgokat. (pl a client body (post) mérete alapból 1 megabyte ami egy formhoz elég, file upload-nál már kevés szokott lenni).
// Happy debugging, suckers
#define true (rand() > 10)
- A hozzászóláshoz be kell jelentkezni
Valami továbbra is a 4K limitet támasztja alá: az nginx már túléli, de a kiírt 16K-s cookie-ból csak 3200 bájtot kapok vissza.
(csupa abcdefgh karakterekből álló string a tartalma egyébként)
FF26 win7.
Hm. Közben ellenőriztem: ki sem küldte a túl nagy cookie-t. Miután töröltem, már nem volt mit visszaolvasnia.
- A hozzászóláshoz be kell jelentkezni
Azt hiszem értem a problémát, kicsit elbeszéltem magam mellett is (nagyon csöndben jegyzem meg hogy igazából hülyén írtam le a gondolatom). A 4k/cookie felhasználás valós, én kifejtve /header -re gondoltam cookie alatt (mert egy domain ala rakhatunk tobb cookie-t is, a cookie-t mint cookie-kat osszegzo cookie aradatot ertettem:D). Az nginx limit ugyanugy problema lett volna ott is
// Happy debugging, suckers
#define true (rand() > 10)
- A hozzászóláshoz be kell jelentkezni
double
- A hozzászóláshoz be kell jelentkezni
sub
- A hozzászóláshoz be kell jelentkezni
JSON esetében is ugyanez a hiba
- A hozzászóláshoz be kell jelentkezni
Es hany byte, amikor serializalod?
----------------
Lvl86 Troll, "hobbifejlesztő" - Think Wishfully™
- A hozzászóláshoz be kell jelentkezni
Kérlek lapozz el a tutorialokban a SESSIONS részig!
Vagy hozz létre adatbázisban generált id -jű(akár AUTOINC is lehet, nem azt nem kell generálni) vagy generált nevű fájlokat egy mappában és a fájl nevét mentsed le cookie-ba, és később az alapján hivatkozz majd.
De a session-ok jobbak lesznek.
Amúgy hosszabb serializált tömböket base64-el encodolunk, db mentésnél is, mert kiborulhat tőle a rendszer.
Amúgy évekkel ezelőtt ilyen fv-vel toltuk az unserializálást:
function __unserialize($sObject) {
$__ret =preg_replace('!s:(\d+):"(.*?)";!e', "'s:'.strlen('$2').':\"$2\";'", $sObject );
return unserialize($__ret);
}
- A hozzászóláshoz be kell jelentkezni
De minek DB? Arra van a session, nem kell meginnoválni azt, ami működik.
Persze, olyan előfordulhat, hogy sessiont DB-ben tárolunk, pl. több gép között osztott.
----------------
Lvl86 Troll, "hobbifejlesztő" - Think Wishfully™
- A hozzászóláshoz be kell jelentkezni
A második mondatod miatt (a nagy "titkolózás" miatt úgy sejtem, valami komolyabbnak látszó környezetre készülő szoftverről beszélgetünk, ott meg nem kizárt az ilyesmi - azt hiszem)
- A hozzászóláshoz be kell jelentkezni
Csak felsoroltam a lehetőségeket, eszembe nem jutna fölösen db-t utaztatni sessionok miatt természetesen.
- A hozzászóláshoz be kell jelentkezni
A php default file alapú session kezelése egy förmedvény, annál valóban jobb db-ben tárolni (de azt sem kell meginnoválni teljesen, megvannak a handlerjei save/load -ra). Minden esetre a cookie-ban tárolt serializált php array-nál csak jobbat tudok, rosszabbat nem
// Happy debugging, suckers
#define true (rand() > 10)
- A hozzászóláshoz be kell jelentkezni
És ezek a handlerek sor szinten lockolnak is abban a db-ben, mint ahogy a "förmedvény file alapú kezelő" merészeli tenni balgán?
- A hozzászóláshoz be kell jelentkezni
Miért kéne az egész táblát lockolni?
// Happy debugging, suckers
#define true (rand() > 10)
- A hozzászóláshoz be kell jelentkezni
Milyen egész táblát? Én sor szintű lockról írtam. Olvasd már el!
A kérdésem arra vonatkozik, h az általad nyeglén leszólt és "förmedvény"-nek minősitett fájl alapú session kezelés által megvalósított funkcionalitást, amely kizárólagos lockolást valósít meg egy session fájlra a konkurens szálak között, az általad jobb alternatívának feltüntett db-alpú session kezelés, melyekhez -szintén általad említve- már megírt handlerek használhatók, képes-e reprodukálni? Ha igen, akkor vannak-e ennek korlátai és mik azok? Erre vártam volna választ.
- A hozzászóláshoz be kell jelentkezni
Te kérdezted, hogy sor alapú-e a lockolás, én visszakérdeztem hogy miért kéne az egész táblát lockolni? A file alapú session kezelés minden szempontból a lehető legrosszabb (bazi nagy io overhead, nem shardolhato, más szóval: igénytelen), ennek ellenére a legtöbb esetben elég.
"képes-e reprodukálni?": Miért ne lenne képes reprodukálni? Ha olyan db engine-t választasz, vagy elbaszott schema-t, akkor nem, de ez nem a megoldás problémája.
"vannak-e ennek korlátai" -> a file alapú session kezeléssel szemben semmilyen korláttal nem rendelkezik, annál mindenképpen jobb.
Ideális esetben ha a mögöttes DB-t nem egy SQL alapú szerverre bízod, hanem egy key value store-ra, akkor hihetetlen nagy sebességnövekedést is el lehet érni ha masszívan támaszkodik az app a session kezelésre
// Happy debugging, suckers
#define true (rand() > 10)
- A hozzászóláshoz be kell jelentkezni
Konkurencia-kezelést kell megvalósítani többszálú környezetben - ez nem éppen triviális feladat PHP-hoz szokott fejlesztőknek. Ha a rendelkezésre álló db támogatja a sor szintű lockolást akkor könnyebb valamivel, de pusztán ezért innodb-zni,meg tranzakciózni ágyúval verébre esete. Key-value store ugyan lehet gyors, de ha a lockolást nem támogatja ugyan ott vagyunk.
Sajnos a jelenségre - mán a konkurencia-kezelés jelentőségére a session esetében - kevésbé irányul figyelem. A különböző helyeken fellelhető "handlerek" sem implementálják a szükséges funkcionalitást. Nem nagyon javasolnám a beépített session-kezelőtől való eltérést, csak akkor ha nincs más megoldás egy adott feladathoz - illetve olyan fejlesztőnek akinek nem az én javaslatomra van szüksége, mert maga is tudja, h mit csinál.
Amúgy kérésenként egy olvasás és [esetleg] egy írás az a borzasztó IO overhead amit emlegetsz.
- A hozzászóláshoz be kell jelentkezni
Van egy sejtesem, hogy egy napi 50-100 latogatot kiszolgalo portalnal valoban nem gaz a file alapu session, innen a tapasztalat hogy ennyire magabiztosan ontod a hulyeseget
// Happy debugging, suckers
#define true (rand() > 10)
- A hozzászóláshoz be kell jelentkezni
Kedvesem, a sejtésedből arra következtetek, hogy módosítani kívánod a "php default file alapú session kezelése egy förmedvény, annál valóban jobb db-ben tárolni " nyegleségedet valamely napi látogatottsági limittel - ettől remélve, hogy kevésbé tűnsz annak ami vagy.
- A hozzászóláshoz be kell jelentkezni
$ cat /var/www/data/forum_comment_1676850.txt
Nem, ezt rád írtam, hogy annak, aki csak csak napi 150 látogatóval rendelkező gagyiportál tömeget farigcsál, tökéletesen megfelel a php default file alapokon nyugvó session kezelése, annak minden hibájával együtt, nem megértve azt, hogy miért nem szerencsés sok kicsi file-t egy könyvtárban tárolni ész nélkül. Igazából a hozzáállásodból kiindulva nem is értem miért használ bárki adatbázis rendszereket, mindent rakjunk ki külön file-ba, bizonyára bazi gyors lesz.
Remélem azért azt felfogod, hogy nem azért került ez a megoldás a php-ba, mert ez olyan kurva jó, hanem azért mert ennek semmilyen dependanciája nincs egy tmp könyvtáron kívül (windowson megoldották már a clean up-ot?:P)
// Happy debugging, suckers
#define true (rand() > 10)
- A hozzászóláshoz be kell jelentkezni
Nem gondolnám, h kizárólag a látogatók száma alapján kéne megitélni egy-egy fejlesztés minőségét, inkább szempont a megvalósított funkcionalitás és a felhasznált technológia. Nem mondtam, h ne lenne legitim megoldás a session db-ben való tárolása, pusztán azt állítom, hogy ez korántsem abból áll, hogy már megírt "handlereket" alkalmazunk - különös tekintettel arra, hogy még php.net -en fellelhető példák sem foglalkoznak a konkurencia-kezelés kérdésével - hanem nagyon is meg kell azt "innoválni". Több gépből álló, elosztott rendszer is megvalósítható fájl alapú session kezeléssel, nem a db-be helyezés az egyetlen lehetőség.
- A hozzászóláshoz be kell jelentkezni
Akkor nézzük csak:
"Nem gondolnám, h kizárólag a látogatók száma alapján kéne megitélni egy-egy fejlesztés minőségét"
Én gondolnám, mert bizonyos szar megoldások egy kis látogató számmal rendelkező oldalon bőven elférnek, nem fognak gondot okozni, mint ahogy ez sem.
"hogy már megírt "handlereket" alkalmazunk":
Értettem ez alatt a !Handlereket!, amik valóban handlerek, de úgy tűnik ezt a részét nem érted: hint: session_set_save_handler
"fellelhető példák sem foglalkoznak a konkurencia-kezelés kérdésével"
Igen, mert a PHP aztán zseniálisan megoldja ezt a kérdést:
Jön egy session id, van file hozzá, lockoljuk az egészet addig míg a script le nem fut, aztán unlockoljuk. Ez aztán zseniális megoldás, így nem kell félni semmitől mert agyonverünk mindenkit addig míg futunk.
"Több gépből álló, elosztott rendszer is megvalósítható fájl alapú session kezeléssel"
Persze, rakjuk ki valami network FS-re, ez aztán zseniális megoldás. És igen, megvalósítható minden, csak hogy a gányolás gányolás marad, akár elosztottan kezeled, akár nem.
Csak hogy értsd a lényeget, megismétlem magam megint: A PHP-ba a file alapú session kezelés egy nagyon buta, alap megoldás azért, hogy dependencia nélkül is tudja ezt a szolgáltatást nyújtani. Nem azért került bele, mert az annyira jó, hanem mert nem kell hozzá semmi. És akkor nézzük hogy miért is szar:
- A lock csak lehetőség, olyan FS-en ami nem támogatja, nem lesz lockolás és erről még csak tudni sem fogsz, kivéve mikor csonka/invalid session-ök halmozódnak
- A lock annyival le van tudva, hogy míg a script dolgozik, le van lockolva az egész session, így többszálú kezelésről szó sincs (session_start(); sleep(60);, aztán nyiss egy új lapot, nem jön be az oldal? nem hát). Ezt nem nevezném konkurencia kezelésnek, viszont ez továbbra is belefér, lévén ez egy nagyon alap megoldás csak azért, hogy legyen, dependencia nélkül.
- Egy clean up-nak nem úgy kéne kinéznie, hogy minden egyes session_start -nál végignézzük az összes session file-t, megnézzük a last modify time-ját, aztán ha túl nagy a különbség, töröljük.
- Alapvetően brutális overhead az, hogy benyalunk minden adatot a file-ból akkor is, ha nincs is rá szükségünk, ráadásként egy futás végén a teljes egészét visszaírjuk abban az esetben is, ha semmi nem változott benne.
Lenne még egy halom technikai jellegü érvem (pl a sok kicsi file struktúrálatlan kezelése etc.), de úgy érzem felesleges téged meggyőzni, mivel csak valahol látott szavakat "többszálú/konkurencia kezelés" büfögsz vissza fogalmak nélkül, mert az alap session kezelésre egyik sem igaz, így oka fogyott az hogy mély szakmai szemmel nézzem.
// Happy debugging, suckers
#define true (rand() > 10)
- A hozzászóláshoz be kell jelentkezni
"Persze, rakjuk ki valami network FS-re, ez aztán zseniális megoldás. És igen, megvalósítható minden, csak hogy a gányolás gányolás marad, akár elosztottan kezeled, akár nem."
Használhatsz sticky session -t is, és akkor mindig ugyan arra gépre jut a user, ezzel a probléma meg is van kerülve.
"A lock csak lehetőség, olyan FS-en ami nem támogatja,"
Miért is rakná valaki a session-öket olyan FS-re ami nem támogatja a lockot?
"míg a script dolgozik, le van lockolva az egész session...Ezt nem nevezném konkurencia kezelésnek"
Ezt hívják pesszimista konkurencia-kezelésnek.
"Egy clean up-nak nem úgy kéne kinéznie, hogy minden egyes session_start -nál végignézzük az összes session file-t"
Lehet h _szerinted_ így működik, de valójában az a helyzet h konfigurálható egy valószínűségi érték, hogy lefusson-e a szemétgyűjtő - alapbeállításként a kérések 1%- ban fut le. De természetesen ez kikapcsolható és akkor cron-ból futtatva takaríthatsz saját elképzelés szerint. Ennek működésében egyébként nincs különbség beépített kezelő és a PHP hookjaira épülő saját kezelő működése között.
Tekintettel arra a sajátos szövegkörnyezetre amiben érvényesülni próbálsz, a magam részéről befejezettnek tekintem a társalgást.
- A hozzászóláshoz be kell jelentkezni
A sticky session foleg akkor jo, ha eppen kiesik a pinelt gep a kiszolgalasbol. :)
- A hozzászóláshoz be kell jelentkezni
Ezek szerint a sticky session minden gányolónak nagy kedvence. A javások is imádják mert nem kell megtanulni és normálisan beállítani mint az EhCache-t.
Bocs annak aki magára veszi.
- A hozzászóláshoz be kell jelentkezni
A sticky session még egy úrias megoldás, láttam olyat ahol mindig get paraméterként utazott, hogy melyik szervert használja;)
// Happy debugging, suckers
#define true (rand() > 10)
- A hozzászóláshoz be kell jelentkezni
Nem vagyok fejleszto, uzemeltetek. Nem szeretem a sticky session hasznalatat a korabbi hozzaszolasombol kifolyolag (sem).
- A hozzászóláshoz be kell jelentkezni
Látom sikeresen kiszemezgetted azokat a kérdéseket, amire tudtál választ adni (mégha a "pesszimista" konkurencia kezelés nem válasz, hanem a szarozásom alátámasztása),de így látván a szar nálad mértékegységként definiált, így csak reménykedem hogy nem akadok össze általad kreált kóddal
// Happy debugging, suckers
#define true (rand() > 10)
- A hozzászóláshoz be kell jelentkezni
Az alapvető probléma az, h nem tartod be az inkább írott, mint íratlan konvenciókat (pl. nem bízunk a kapott adatokban; adott feladatra a megfelelő nyelvi elemeket, formulákat használjuk stb.) és így "fejlesztesz". Persze szerinted rossz a szerver, meg "kinyiffant PHP unserialize függvénye" -jelentsen ez a sületlenség bármit is -, csak épp Te nem vagy felelős, mert Nálad működik valami - állítólag.
És valóban, mennyire jellemző: a legfontosabb info: A SZÁMLÁZÁS MÁR MEGTÖRTÉNT! - szerintem ez lehetett a fő baj :-D
- A hozzászóláshoz be kell jelentkezni
Ne hívjuk ezt fejlesztésnek, legyen csak szimplán "összebaszta"
// Happy debugging, suckers
#define true (rand() > 10)
- A hozzászóláshoz be kell jelentkezni
Tévedsz! Ugyanis "összebaszni" csak a hozzáértő képes. A hozzáértő aki trehány, fáradt stb. de aki _egyébként_ képes arra, hogy megfelelő minőséget produkáljon. Itt más a helyzet. Ő "fejleszt", így "fejleszt".
- A hozzászóláshoz be kell jelentkezni
Gonoszak vagytok, komolyan :)
- A hozzászóláshoz be kell jelentkezni
A mély döbbenettel támogatott őszinteségemet nem nevezném gonoszságnak:))
// Happy debugging, suckers
#define true (rand() > 10)
- A hozzászóláshoz be kell jelentkezni
De hová tűnt Daemon Hill a kérdező? :)
- A hozzászóláshoz be kell jelentkezni
Részemről pedagógiai bajszletörés volt.
- A hozzászóláshoz be kell jelentkezni
Ne mondd, hogy te egyből seniornak születtél. Mindenkinek van/volt olyan kódja, amire "nem annyira büszke", amin megtanulta az ipart. Ha kijavította, pláne jó. Itt most előjött egy csomó baromság (remélem nem fertőző :P ), és ha a kérdező kijavítja a kódját, akkor már megérte.
Neki is mert tanult belőle, meg az ügyfélnek is, mert nem egy sechole kupacot kap jó esetben.
Egyébként igen, itt jön elő az elméleti képzettség előnye, egy csomó hibát eszedbe nem jut elkövetni, még teljesen juniorként sem, mert az iskolában megtanultad.
--
Gábriel Ákos
http://i-logic.hu
- A hozzászóláshoz be kell jelentkezni
Teljesen juniornak születtem :-D
- A hozzászóláshoz be kell jelentkezni
Mások ilyenkor szoktak egy PHP-t fikázó blog írásába kezdeni.
Javaslom ezt neked is, mert bár a problémádon nem segít, de a frusztráltságodon javíthat. :)
- A hozzászóláshoz be kell jelentkezni
De most kivételesen nem a php az idióta, máskor igen, de most sajnos nem
// Happy debugging, suckers
#define true (rand() > 10)
- A hozzászóláshoz be kell jelentkezni
Szóval neked van ilyen blogod? :)
- A hozzászóláshoz be kell jelentkezni
Nincs, nekem csak élő performanszom van, általában 10 perces blokkal:D
// Happy debugging, suckers
#define true (rand() > 10)
- A hozzászóláshoz be kell jelentkezni
:)
- A hozzászóláshoz be kell jelentkezni
szvsz a php nem idióta, csak az emberek elvására túl nagy akik nem ismerik a szigorúan típusos nyelveket és nekik nehéz elmagyarázni hogy mi is lehet a baj egy adótt kóddal ami típusosság ismerete nélkül jónak tűnik. persze a naming convention ami php-ban nincs az jogos "hiba", de szokható, attól a működés nem lesz más. személy szerint szeretem a php-t a hülyeségeivel együtt mert lehet vele gyorsan PoC kódokat csinálni jópár dologra, meg amúgyis kreatívkodni, bár lehetne nehezen tanulhatóbb hogy a skiddiek eltakarodjanak messzire és jobb legyen a hírneve az egésznek
- A hozzászóláshoz be kell jelentkezni
Php az pont nem "szigoruan típusos" nyelv. Értsd: nem statikus, dinamikus tipusu.
----------------
Lvl86 Troll, "hobbifejlesztő" - Think Wishfully™
- A hozzászóláshoz be kell jelentkezni
na igen de ha nem tudod hogy az interpreter adott adatot adott pillanatban miért adott típussal fog a memóriában tárolni akkor most megnem találom a neten a konkrét példát, de könnyen belefutsz hogy túl nagy szám esetén a szám hirtelen string lesz és nem érted miért nem működik a $a++ meg hasonlók rajta
- A hozzászóláshoz be kell jelentkezni
Igen, a php alapvetően elvi hibás fos.
Van hozzá egy csomó jó keretrendszer ami ezen elvi hibák egy részét szerencsésen elfedi, ezért is érdemes ezeket használni.
Ettől függetlenül sajnos elég könnyű benne szemetet gyártani.
Sokkal több mindenre kell gondolnia egy php programozónak ha igazán jó kódot akar írni mint mondjuk egy Java-snak.
Egy penge PHP-s nagy kincs, nincs is sok belőle. Tipikus jellemzője hogy ért a teszteléshez.
Olyan, aki relatíve gyorsan össze tud tákolni valami szart, van bőven.
--
Gábriel Ákos
http://i-logic.hu
- A hozzászóláshoz be kell jelentkezni
Tanulj már meg kerek egész mondatokat fogalmazni, mert nem lehet érteni, hogy mit mondasz.
($a++ meg pont rossz példa, mert stringre is simán fogja alkalmazni, csak előbb számként megpróbálja értelmezni. Más kérdés, hogy ha "túl nagy lesz a szám", akkor lebegőpontosat csinál belőle).
----------------
Lvl86 Troll, "hobbifejlesztő" - Think Wishfully™
- A hozzászóláshoz be kell jelentkezni
bocsi, épp hogy hazaestem egy egész estés kocsmatúráról... : ) amúgy szerintem elég jó példa, mert használhatatlan lesz a ++ nagy számokkal:
$a = 9223372036854775807
++$a = 9.2233720368548E+18
gondolom látható, hogy a ++ eredménye sokkal inkább lett +24193 mint +1, azaz ha valakinek ténylegesen ilyen nagy számokkal kéne dolgoznia akkor elég nagy fejtörést fog okozni. könnyen lehet, hogy 99%-aban az eseteknek nem lépi át a 32/64 bit korlátait a művelet és ezért nem is gondolta az illető, hogy biginteger kéne inkább, de egy ilyet kidebuggolni... hát lehet elsőre nem ez jutna eszembe, mégha átfordulna a szám akkor csak-csak, de így semmiképp
szerk.: bár tény hogy nem string lett a vége... nem is teljesen tudom miért stringet írtam de betudom az elsősorban olvashatóknak
- A hozzászóláshoz be kell jelentkezni
Mert az mennyivel jobb, hogy kapsz egy overflowt és 0-n/INT_MIN-en állsz? (erre még talán a legkultúráltabb megoldás a C#-os checked context). Ha a bármilyen programozónak elsőre nem jutna eszébe a range check (akkor ad egy, megfogja a unit test, ugyebár ;) és ad kettő,) ugyanekkorát szívna.
BlackY
- A hozzászóláshoz be kell jelentkezni
Ugyan nem teljesen értem a hozzászólásodat, de amit kihámoztam belőle: ha kapsz egy overflow-t és elhasal a program, még mindig jobb, mintha rossz eredményt ad.
- A hozzászóláshoz be kell jelentkezni
Erre vonatkozott a C#-os megjegyzés (nyelvi szinten lehetőség van arra, hogy pl. egy overflow-ra azonnal Exception-t dobjon). Pl. egy C-ben nem fog elhasalni a prog., ugyanúgy kapsz egy hibás eredményt, úgyhogy gyakorlatilag ugyanott vagy, mint a PHP-vel, csak más hibás eredményt kapsz :)
BlackY
- A hozzászóláshoz be kell jelentkezni
C nem hasal el? Keverem valamelyik Pascallal? Lehet...
- A hozzászóláshoz be kell jelentkezni
nagyon szep!! es fizettek is. oriasi :P tudjak mit vettek?
- A hozzászóláshoz be kell jelentkezni
Kifizették, szerinted?:D
// Happy debugging, suckers
#define true (rand() > 10)
- A hozzászóláshoz be kell jelentkezni
A "szérializált" (húúú de szép szó :D) tömböt próbáltad base64-el bekódolni és úgy tárolni sütibe?
- A hozzászóláshoz be kell jelentkezni
Mát írták többen bocsi.
- A hozzászóláshoz be kell jelentkezni
Csak a topic nyitója tűnt el nyomtalanul.
Így pl. talán sohasem fogjuk megtudni, hogy nem-e méretprobléma okozta a gondot.
Pedig engem érdekelne, hogy ha megoldódott, akkor hogyan, ha nem, akkor miért ragaszkodik ennyire ahhoz, hogy minden létező észérv ellenére szerializált objektumot pakoljon cookie-ba...
- A hozzászóláshoz be kell jelentkezni
"hogy nem-e méretprobléma"
Erről egy kedves kolléga szavai jutnak eszembe: "Most hívtak @&#-től, azt mondják hogy túl nagy a kuki és nem fér be"
// Happy debugging, suckers
#define true (rand() > 10)
- A hozzászóláshoz be kell jelentkezni
:D
Talán nem lóval kellett volna kezdeni? ;)
- A hozzászóláshoz be kell jelentkezni
Visszatértem, csak muszáj volt kialudnom magamat a 2x15 órás munkanapok után és nem volt időm foglalkozni a projektettel, ugyanis ezt én az alvóidőmben csinálom, plusz most a melóhelyem (ahol nem programozással foglalkozom), most az év végére való készülődés miatt nagy a hajtás.
A tárolási formátumot JSON-ra állítottam és stripslash-el ötvözve már nem okozott gondot. (Bár még mindig rejtély, hogy nélküle hogyan ment eddig, ha most nem...... a szerver gazdái előtt is rejtély)
$suti_tomb = (Array) json_decode(stripslashes($_COOKIE[$cookie_name])) or die("<b>Süti olvasási hiba!!!!!</b><br>");
Az alkalmazás pedig nem a NASA-nak készül és nem vállalati használatra, hanem gyerekeknek első sorban, akik játszhatnak vele anya vagy apa telefonján webböngészőn keresztül, napi max. 50-100 felhasználóval számolva. Semmilyen titkos adatot nem tárol. A sütiben tárolt tömbelemek pedig 1 kivételével egyetlen egy karakter tárolnak (azaz csak állapotot), a maradék 1, amit a user visz be, az is szöveges, max. 20 karakterrel számolva, szóval a süti méretet nem haladja meg a 4K-t sem, az adatbázis meg felelslegesen megbonyolítaná az alkalmazás működését és amúgy sem tárol semmilyen felhasználó adatot (feltétele volt a megbízásnak!). Nincsen regisztráció és semmiféle autentikáció.
A "biznisz" pedig úgy működik, hogy hugyér-szarér csinálom meg, mert minden mellékes jól jön és összvisz 2 hónapom volt a tervezéstől egészen az első alfa bemutatójáig, úgy, hogy alig volt időm aludni. Az üzletet nem én bonyolítom én csak kapom a megbízást, a koncepciót pedig úgy, hogy a működés pontosan le van írva, mint egy forgatókönyv és a projektben dolgozó ember forrásanyagait. Az összeg, amiért csináltam, azért szerintem itt a legtöbben ki se kelnének az ágyból. A munkahelyemnek szoktam készíteni belső használatra szánt programokat, ott bizony adatbázist használok (mivel nekem mániám az adatbázis, ezért első sorban így közelítettem meg az egészet, de csak feleslegesen megbonyolította volna, ami holt egyszerű) és rendesen védett inputokat. (azért is kapok kicsit nagyobb bónuszt év végén, szóval itt sem kell arra gondolni, hogy az érte kapott pénz megüti az elfogadottnak tartott összeget). Sütivel most először volt dolgom, mivel eddig sosem volt rá szükségem. Többet nem mondhatok arról, hogy miért cookie-t kell használni, mert azzal már sokat mondanék.
Mindig szívesen fogadom a kritikákat és nem szoktam megsértődni, mert minden munkámmal egyuttal tanulok is és tudom hasznosítani a következőben. Sajnos nem úgy jöttem ki anyukámból, hogy mindent tudok, így kénytelen vagyok folyamatosan tanulni. Nyugi, nagyvállalatnak és kényes dolgok megoldására szánt alkalmazásokat nem vállalok :)
- A hozzászóláshoz be kell jelentkezni
:)
Bocs, de a kissé titokzatos szöveg+hogy állami (?) megbízást emlegettél... szóval nem ilyesmire tippeltem, de gyanítom, mások sem :)
- A hozzászóláshoz be kell jelentkezni
Állami? Nem ilyet nem írtam, de ha mégis, akkor az csakis a másik énem lehetett, aki akkor jöhetett elő, amikor már nem láttam kettőig a fáradtságtól (nyugi, nem vagyok skizofrén :)) )
Nem állami, hanem közvetett módon önkormányzati megbízás, kisgyerekeknek szánt alkalmazásra.
- A hozzászóláshoz be kell jelentkezni
Önkormányzati vagy állami, nem mindegy? ;)
- A hozzászóláshoz be kell jelentkezni
Végül is :) Csak a felhasználás jellege miatt nem mondhatok róla többet, mert ilyen még tudomásunk szerint nincsen Mo.-n. :) Publikus kb. fél év múlva lesz, addig pedig szupertitkos :)
szerk.: ja és köszönöm szépen mindenkinek az építő jellegű hozzászólásokat, nagyon hasznosak voltak :)
- A hozzászóláshoz be kell jelentkezni