Fancybox + php-s file-listázás + sok kép = browser crash
Üdv
Egy olyan problémával kapcsolatban kérnék segítséget, mellyel gondolom, páran már összefutottak. Tehát adva vagyon egy fancybox, meg egy mappa, pár jó minőségű képpel (szám szerint 29).
Egy oldalon függvénnyel behívom rejtett divbe a kért könyvtár tartalmát, s linkre kattintva bejön az adott galéria. Valamiért viszont egyszerűen nem boldogul ennyi képpel, ha ilyen jó minőségűek (s fájlméretűek is). Nincs valami megoldás, függvényoptimalizálási mód, képoptimalizálás generálás közben, vagy bármi, amivel ki lehetne küszöbölni ezt a hibát?
A fancybox behívása s a rejtett div hozzá:A behívó függvény, ami a galéria tartalmát generálja:Előre is köszönöm a hozzászólásokat !
C.
■ Egy olyan problémával kapcsolatban kérnék segítséget, mellyel gondolom, páran már összefutottak. Tehát adva vagyon egy fancybox, meg egy mappa, pár jó minőségű képpel (szám szerint 29).
Egy oldalon függvénnyel behívom rejtett divbe a kért könyvtár tartalmát, s linkre kattintva bejön az adott galéria. Valamiért viszont egyszerűen nem boldogul ennyi képpel, ha ilyen jó minőségűek (s fájlméretűek is). Nincs valami megoldás, függvényoptimalizálási mód, képoptimalizálás generálás közben, vagy bármi, amivel ki lehetne küszöbölni ezt a hibát?
A fancybox behívása s a rejtett div hozzá:
<ul class="ered">
<li><a href="<?php echo _URL; ?>fancybox/photos/2009/tournament_001.jpg" rel="gallery2009" class="fancy">Képgaléria 1</a></li>
</ul>
<div style="display:none;">
<?php slideLoad(_DOCROOT . '/' . $forras09, _URL . $forras09); ?>
<?php slideLoad(_DOCROOT . '/' . $forras10, _URL . $forras10); ?>
</div>
function slideLoad($path, $link) {
$dir_handle = @opendir($path) or die("Unable");
while ($file = readdir($dir_handle)) {
if($file != "." && $file != "..") {
echo "\t\t\t\t\t\t\t" . '<a rel="gallery2009" href="' . $link . $file . '" class="fancy"><img class="load" src="' . $link . $file . '" alt="" /></a>' . "\n\r";
}
}
closedir($dir_handle);
}
C.
Mit jelent?
Fájlméret
Miniatűrök
Tegyél ki kisebb (mondjuk kb. 600x400 px) képeket, és ráklattyolva egy-egy nagyot (mint régen, csak szebben), vagy slide-show-t, ami szintén 1-esével mutogat.
Nem lehet, hogy a nagy darabszám miatt timelimit-be ér a szkript?
A képeket nem töltöm fel
C.
Próbáltad?
Ezt próbáltad is?
Egyébiránt:
- én ezt a "fancy"-t nem ismerem;
- soha meg sem próbáltam 811 képet egy oldalra betölteni, pláne nem ekkorákat - és nagyon nem is javaslom. (Gondolj az egyre terjedő mobileszközökre, amiknek egyes helyeken a sávszélessége alig éri el a 30 kbit/s-t);
- tényleg nem értem, miért ekkora (fájl)méretűek a képek a neten, ha ennek esetleg "letöltheti a Júzer" oka van, akkor is nézegessen kisebbeket, amelyiket meg le akarja tölteni nagyban, azt add neki;
- a kódodból és az iménti adatból (811 db kép, eddig 29-re gondoltunk!) számomra ezek derülnek ki:
1. A while ciklus és benne az if feltétel több, mint 811 x hajtódik végre. Nem tudom, mennyi a szerveren a szkriptek beállított maxi futásideje, de elképzelhetőnek tartom (a rengeteg egyesével hívott echo miatt is), hogy nem fér bele és a szerver letiltja. Bocs, de nem jut eszembe a php-változó neve, ami állítja.
2. A böngésző dolga a maga memóriáját intézni az oprendszerrel, sztem vár az magától, ha kevés. De(!) 811 x min 1 MB az testvérek közt is van 1 giga, kérdem én: van-e a böngésződnek ekkora cache-területe? Ha van, nincs tele?
3. Nekem ennyi jutott hirtelen fejembe, biztos van más is, de leírhatnád: mi a bánatnak kell ennyi és ilyen marhanagy kép egyetlen oldalra? Érdekelne.
3+1. Oldd meg a dolgot másképp, hogy ilyen nagy képből max 1-et kelljen egy oldalon letölteni. Le se töltődik 6-8 db (MB) 2-3 s alatt, vagy akik nézni fogják az oldalt, azok Gbit/s-os nagyságrendű kapcsival rendelkeznek? Számolj ilyenkor utána, átlag Júzer névleges (!) 1 Mbit/s - al 1 sec alatt ugye 128 kB tartalmat tölt le... És ez csak névleges. Én nem emlékszem, hogy csináltam-e olyan oldalt (letöltéstől eltekintve), amelyik css-el, kép(ek)pel, mindennel együtt meghaladta volna az 512 kB-ot.
Remélem, segítettem.
Bocs, de nem jut eszembe a
Ami a 811 képet illeti, nekem egy hónapra is sok volna. Akármilyen jók, 10-20 után már kezdem unni.
A memória limit sem tárgytalan ekkora kódnál
Ez ugyan alapjáraton 128 mega, de 811 kép-hez mire mindent végigcsinál...
php.ini => memory_limit = 128M; Maximum amount of memory a script may consume (8MB)
Azonban lényegét tekintve a dolognak én is másképpen csinálnám és mindenképpen használnék php kép átméretezést kis képek létrehozásához!
Ha másképpen nem is, egy külön futtatható php fájlra gondoltam, ami végigmegy a könyvtáron, és előállítja a képek miniatűrjét (értelem szerűen akinek van kicsinyített mása, azt kihagyja).
engem is érdekelne a megoldás
az 1.8as dualcore-omon, chromeban és ffban is csúnyán szaggatni/lagolni kezdenek az animációk... :(
(a nagyképek pl max. 1275×1650px-es álló a4-es pdf-preview-k lennének)
ha csak 5-öt linkelek neki, még érszevehető a lag, de már nem zavaró.
Látom nem egyedüli a példa
Pepita, nagyon szépen köszönöm a válaszod, felnyitotta a szeme igen. Nos 29 az egyik galéria, 781 a másik galéria tartalma. Összeadtam őket, mert eszembe jutott közben, hogy a két függvény közvetlenül egy más alatt fut le s így nem a 29 kép töltődik, hanem a 810... xD Továbbá agyaltam, hogy meglehet oldani, hogy a nagyobbik tömböt N elemenként kissebb tömbökre bontom fel, s úgy iratom ki csak tartalmukat a kezelővel. Itt jönnek rögtön a felmerülő dolgok:
- de meglehet azt oldani, hogy egymás után írja ki a kis tömbök tartalmát oda, ahova kell? - valahogy biztos meg... maximum a kis tömböket bejárom foreach -el a nagy tömbön belül, ehhez maximum módosítom a függvényem
- meg lehet oldani, hogy egy-egy N-tagú tömb lekezelése után várjon kicsit, hogy ne fagyassza ki rögtön a böngészőt? - meglehet, ott a sleep(time_to_be_sleeping_beauty)
- meg lehet oldani, hogy a moratórium közben ne halljon le a többi folyamat? - ebben már nem vagyok biztos...
- page-load eseménynél csak az első kis tömb lekérése fusson le, linkre klikkelve a másodiké is, s onnantól menjen időzítve a többi, pl 20mp -ként? - erre se tudom sajnos a választ
Viszont ha valaki értelmes elgondolásnak látja, ahogy én is járatom az agyam ,az szóljon hozzá :)
C.
betöltődéskor semmi gond,
az a sejtésem h hasonló gondunk van, mert lehet nálad h egyszerűen megeszi a memóriát valamiért, nálam meg csak belassul. mindenesetre fura.
Más, újabb verzió?
Saját
Lehet, hogy valami elkerülte
Ha usability-re is törekszel, talán valahogyan meg lehetne oldani, hogy az adott oldalhoz tartozó utolsó képen ha a felhasználó "tovább"-ot nyom, akkor a galéria oldala lapozódjon és betöltés után a következő kép jelenjen meg.
Így sztem nem omlana össze se a kliens oldal, és egész biztosan a szerver se futna ki az erőforrásaiból/egyéb korlátaiból.
A lapozás nem lehetőség,
Támadt az ötlet tehát, hogy a galériákat nyitó linkek .click eseményére kezdjen csak el izzani a rendszer. Tehát, .click eseményre ajax kéréssel átadok egy értéket egy feldolgozó php fájlnak, majd ott definiálva, mit kell csinálnia a függvénynek, lefuttatom azt. Ezt utána a küldő oldalon megkapja, már mint tömb (ha szerencsénk van), s ezt az előre rejtett divbe populálja, így már user nyugodtan tud a képgalériában lapozni. Szerintetek? Még most írom csak hozzá a kódot, remélem ez beválik és így megkímélhetem a böngészőket a fagyástól ^^
C.
Haladunk ^^ Működik az
Struktúra mappákon belül, csak amiket itt használok:
vedd ki a kukacot az opendir
másik javaslat.
mi lenne ha már az alap oldalletöltéskor tartalmazná a html kód a képek forrásának elérését (akár egy javascript változóba berakod json segítségével), és amikor nyomatod a galériát, akkor innen veszed ki, hogy milyen kép jelenjen meg és hozol létre egy img tag-et, vagy átállítod egy meglévő kép src-át az új képre. ha májer vagy preloadolhatsz is rejtett képben.
Igazad volt, a @ a hiba, amit
Tehát... a hiba a fancy-töltéssel megoldódott. S most megosztanám veletek,több okból is:
- az információ s vele a tudás mindenkié
- ha másnak is hasonló gondja lenne, ne őrölje az idegeit szintén napokon át
Lássuk tehát:
A fancyt minden esetben valahogy be kell hívnunk, tehát jobb esetben a forráskód végén található egy ehhez hasonló rész, természetesen az oldal igényeihez személyre szabva:
- a galériát egy szöveges linkre kattintva hívom be, s csak egyetlen képet hívok be, a jquery adja utána vissza az egész galériát, miután legenerálja hozzá a kódokat
- maga a behívó kép nem tagja a galériának, ezért nem tudja a fancy erre már alkalmazni magát
Megoldás?
- jquery success ágában tudatom csak a scriptel, hogy itt most a fancynek dolga van.
Tehát nincs oldaltöltéskor lassulás, kifagyás.
Nincs galériatöltéskor kifagyás.
Több különböző galéria generálódik dinamikusan, de csak sikeres jquery-futáskor.
Köszönöm a segítségeket, végre sikerült ezt megoldanunk ^^
C.
Örülök, hogy sikerült,
helyett ajánlanám az
isset()
függvény használatát.error_reporting
de az isset() használata egy rövid ?: operátorban sokkal jobb gyakorlat.
Extra opció
Base64 Encoding még generálási időben. Kipróbáltam, működik, de nem alkalmazom a végleges "termékben". Viszont a jövőre való tekintettel biztosan használni fogom még.
C.