Autor | Zpráva | ||
---|---|---|---|
PipaObecna Profil * |
#1 · Zasláno: 26. 3. 2011, 20:38:17
Dobrý večer,
potřebuji ověřit, zda existuje soubor, který začíná na XXXX (místo XXXX může být cokoliv). Existuje v php nějaká funkce, která najde soubor, který začná na přesně daný řetězec? Děkuji |
||
Taps Profil |
#2 · Zasláno: 26. 3. 2011, 20:55:10
PipaObecna:
nejlepší by bylo použít funkci file_exists |
||
Tori Profil |
#3 · Zasláno: 26. 3. 2011, 21:00:06
Taps:
Je to lepší nebo ekvivalentní k funkci glob? (jen mne to zajímá) |
||
PipaObecna Profil * |
#4 · Zasláno: 26. 3. 2011, 21:15:41
fci file_exists využít chci, jde mi o to, jak ověřit, že daný soubor začíná na XXXX... soubor má takovýto název:
XXXX^nejaky_dalsi_string.php, ověřuju vždy jen znaky do znaku ^. Napadlo mě, rozdělit název souboru do pole podle znaku ^ a ověřovat to poté takto: if($pole[0]=='XXX'){ udelej neco; } myslíte, že to je vhodné řešení, nebo je lepší použít jiný způsob (regul. výrazy)? |
||
Taps Profil |
#5 · Zasláno: 26. 3. 2011, 21:42:03
PipaObecna:
To by byla taky určitá možnost |
||
Bertram Profil |
#6 · Zasláno: 26. 3. 2011, 21:49:11
Doporučil bych ti tuto funkci,pokud jsem to teda dobře pochopil.
int strncmp ( string $str1, string $str2, int $len ) Ale je-li těch možností XXX více, chce to zcela jinný přístup. |
||
PipaObecna Profil * |
#7 · Zasláno: 26. 3. 2011, 23:13:09
abych to tedy upřesnil,
mám ve složce např soubory: moje-stranka^87348has78d6we87.php novakategorie^awqe87sfxvcasdasd4a56sd4as.php krasnyvyrobek-zedreva^hg5fdfsewa65as4d68asdf.php kdyz hledam dany soubor, tak v php sablone znam napr stirng "moje-stranka"... zbytek retezce za znakem ^ jiz neznam. to, aby 2 soubory mely stejny nazev se stat nikdy nemuze. Takze pocet retezcu do znaku ^ muze byt libovolny. To by ovsem nemelo vadit, jelikoz kdyz znam hledany retezec, tak si jsem schopen spocitat pocet znaku (moje-stranka ma znaku 12, takze hledam soubor, kde prvnich 12 znaku bude rovnych retezci moje-stranka) |
||
Bertram Profil |
#8 · Zasláno: 27. 3. 2011, 00:01:13
Třeba něco takového?
$a = 'moje-stranka'; $a .= '*.php'; $file = glob ($a); print_r ($file); |
||
PipaObecna Profil * |
#9 · Zasláno: 27. 3. 2011, 00:01:42
Tak uz se mi neco podarilo napsat a funguje to.
<?php function checkMenuCache($cache_dir){ $file = md5($_SERVER['REQUEST_URI']); if ($handle = opendir($cache_dir)) { while (false !== ($file = readdir($handle))) { if ($file != "." && $file != "..") { if(!strncasecmp(md5($_SERVER['REQUEST_URI']), $file, strlen(md5($_SERVER['REQUEST_URI'])))){ closedir($handle); return true; } } } closedir($handle); } return false; } ?> Abych tedy trosku objasnil: fce vraci true, kdyz soubor existuje. Kdyz soubor ve slozce $cache_dir neexistuje, vrati false. Projde se tedy veskery obsah slozky $cache_dir a zda se md5 otisk aktualni URL rovna zacatku nazvu souboru, tak soubor existuje. Jeslti si myslite, ze to jde napsat lepe tak budu rad za rady :) |
||
PipaObecna Profil * |
#10 · Zasláno: 27. 3. 2011, 00:05:34
Diky za tip, vyzkousel jsem a take funguje. Ted ale co je rychlejsi. Tve reseni hleda soubor v php, ktery zacina na dany string a kdyz ho najde tak hledani se ukonci a soubor si muzu ulozit do pormene.
To co jsem napsal ja, otevre slozku, pres while prochazi soubory a overuje zda nejaky z nich zacina na dany string (md5 otisk URL) a zda ano while se ukonci.. Okem lajka se mi zda ze rychlejsi bude tve reseni, je to tak? V budoucnu tech souboru, ve kterych se bude hledat muze byt az 10 000. |
||
Bertram Profil |
#11 · Zasláno: 27. 3. 2011, 00:13:35
Funkce glob() je k tomu IMHO přímo předurčena, takže si s optimalizací výkonu někdo určitě pohrál.
|
||
TomášK Profil |
#12 · Zasláno: 27. 3. 2011, 00:18:51
PipaObecna:
Myšlenka je dobrá, ale provedení je špatné. Při každém požadavku se bude muset projít, třeba i deset tisíc souborů, provést 10 000 porovnání, což server dost možná zatíží víc, než pokud by pracoval bez cache. Filesystémy pokud vím nedokážou pracovat s regulárními výrazy, tedy Dir.glob bude totéž, jen provedené přímo php. Správný přístup je použít metodu file_exists na úrovni php a ještě lépe mít soubory s takovými názvy, aby je apache dokázal zpracovat pomocí mod_rewrite. Pak při načtení cachované stránky nevstoupí do hry php a bude to opravdu rychlé. |
||
PipaObecna Profil * |
#13 · Zasláno: 27. 3. 2011, 01:07:26
Tak jsem to otestoval. Souboru je tam 8650 a dotaz trva 0,35 sekund (hledany soubor byl podle abecedy na poslednim miste). Takze myslim ze je to ok
|
||
TomášK Profil |
#14 · Zasláno: 27. 3. 2011, 01:48:46
PipaObecna:
Doporučuju změřit i vygenerování stránky. Web neznám, ale je dost možné, že se vygenerují rychleji než za 0,35sec - pak celé cachování postrádá smysl. Použitím file_exists nebo mod_rewrite můžete cachování zrychlit 10x - 100x. |
||
PipaObecna Profil * |
#15 · Zasláno: 27. 3. 2011, 14:31:14
Kdyz tuto funkcionalitu vypnu a stranka se generuje ruznymi dotazy na databazi, tak cas potrebny k zobrazeni je vice nez 5sekund (delam to na locale. Pocitac mam pomaly, takze ono i tech 0,35 sekund by na rychlejsim stroji bylo daleko nizsi cislo). Myslim, ze na to, na jakem pracuji HW je cas 0,35 uplne super. Zkusim jeste zminene navrhy a uvidim jaky bude rozdil
|
||
Časová prodleva: 13 let
|
0