Autor Zpráva
PipaObecna
Profil *
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
PipaObecna:
nejlepší by bylo použít funkci
file_exists
+ regulární výrazy
Tori
Profil
Taps:
Je to lepší nebo ekvivalentní k funkci glob? (jen mne to zajímá)
PipaObecna
Profil *
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
PipaObecna:
To by byla taky určitá možnost
Bertram
Profil
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 *
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
Třeba něco takového?
$a = 'moje-stranka';
$a .= '*.php';
$file = glob ($a);
print_r ($file);
PipaObecna
Profil *
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 *
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
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
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 *
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
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 *
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

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm: