jde to vůbec ?
Na WinNT neexistuje nic takového jako disková kvóta a proto bych chtěl na intranetu alespoň vypisovat zbývající místo na disku serveru a zároveň vypisovat hříšníky, kteří překročili limit xxxMB ve své složce na serveru.
Krom složité sekvence - opendir -> readdir -> is_dir -> readir -> atd. a v každém dir-u sčítat filesize jednotlivých is_file mne nenapadá nic kloudného.
Hmm, rekurze :-) Taghle sem potreboval v nazvech 30000 souboru nahradit fsechny ? _, nezbylo mi nic jinyho :-)
Příkladeček by nebyl ? Slovo rekurze mi nic moc neříká...
rekurze - funkce vola sebe sama...
jednoduchey priklad (jag vypsat cisla od 1 do 10 a zpatky):
function npr($x){
$x++;
echo $x." ";
if($x<10)npr($x);
echo $x." ";
}
npr(0);
bojim se ze ani na nic neprides..
No...na neco jsem prisel, akorat je to desne pomale, kdyz ty adresare obsahuji moc souboru, jsou v nich ukryty dalsi adresare s dalsimi soubory atd. Jedine ze bych to spoustel pres planovac uloh ve Windows treba v sest rano a pak v poledne a vysledek si nechal ulozit do nejakeho txt souboru, ktery uz bych rychle precetl.
vysledek snazeni je na : http://reikiweb.cz/wz
ale jak rikam...je to desne pomale, kdyz je FS slozitejsi.
A tak jsem hodil diskuzi s jednim clovekem a ten mne nasmeroval na pouziti exec(), system() nebo fpassthru() - podle toho, co ktera vraci. Tim bych treba spoustel bat.ko, ktere by delalo neco ve stylu
du.exe -h -s | sort.exe -? |
s POSIX fileutils pro Win a vysledek smerovalo pres pipe do nejakeho souboru, ktery uz bych si pak precetl nebo vysledek primo ulozil do pole ci promenne (nektera z tech exec, system nebo fpassthru to umoznuje).
Mam to na lokále, takže ačkoli jsem všechny ty výše uvedené funkce nastavil jako disable, můžu si je zase povolit. Těžko by se někdo ve firmě s 25 lidma, kteri o PHP nemaji paru (podobne jako ja :)) pokoušel spouštět systémové příkazy...Nehlede na to, ze do wwwroot mam pristup pouze ja. A formulare mam proti tomuto (snad) zabezpecene.
Mno to by taky slo, ale to co sem psal ja by melo bejt celkem rychly, stejnej system sem pouzil na prejmenovani 30000 souboru a trvalo to asi 2 fteriny.... Ja bych to delal tag, ze bych si vytvoril log typu:
slozka v rootu*velikost
* proto, ze tu soubory na windows nemuzou obsahovat v nazvu, stejne tag by se nasly i jiny znaky.... A potom bych si napsal druhou utilitu, ktera by jednoduse projela tenhle log a zjistila, gdo ma vic nez 50MB..... Jo a co ja fim, tag NTFS kvoty podporuje, doma sem je bratrovi nastavil (nemel me za to rad :-))) ), tagze bych udelal novou partition NTFS a na ni cpal data uzivatelu....
Todle spocita velikost adresare a vypise to cas, jag mu to dlouho trvalo a celkovou velikost.... Udaje sou shodny s tim, co vraci Total Commander a slozka s 6682 souborama a 207 slozkama mu trvala mezi 1,6 a 1,9 sekundama.....
<? set_time_limit(0);?>
<pre>
<?
function getmicrotime(){
list($usec, $sec) = explode(" ",microtime());
return ((float)$usec + (float)$sec);
}
$time_start = getmicrotime();
function tdir($path,$csize){
$dire=Dir($path);
$cntr=0;
while($pol=$dire->Read()){
$flnm=$path."/".$pol;
if(is_dir($flnm) && $pol!="." && $pol!=".."){
$csize=tdir($flnm,$csize);
}elseif($pol!="." && $pol!=".."){
$csize=$csize+filesize($flnm);
}
}
$dire->close();
return $csize;
}
$size=tdir("L:/php",0);
$time = getmicrotime() - $time_start;
echo $time."\n";
echo $size;
?>
</pre>
hmmm...tag mi to celou moji 100MB slozku spocita za 1,9 sekund.
Pro vsechny uzivatele to jeste bezi :)). Obavam se casoveho limitu
No...presne tak :-(
Fatal error: Maximum execution time of 150 seconds exceeded in c:\InetPub\wwwroot\disk.php on line 96
No a ten muj skript si adresar projede za 1.53 sekund. Vsechny uzivatele ale taky nezvladne...
leda ze bych si to udelal nejak postupne pro kazdy adresar. Ale jak ? Refreshem s postupnym predavanim nazvu adresare ? Blbost.....
Asi to nema jineho reseni nez ten du
Prosimte kolik tam je souboru????? Musim te upozornit, ze to asi nicim nespocitas rychlejc.... TO volani externiho programu je sice pjekny, ale taky pomaly... Tag pro slozku, gde je tenhle skript hod neomezenej time limit..... A nebo si porid rychlejsi disky.....
Ono mu to trva ruzne, podle zatizeni disku...
Ehm, mam napad, proc to resit pomoci PHP, napis si na to program v C++, kterej ti to outputi do fajlu a mas to, i gdyz se bojim, ze to bude taky pomaly, ale tam nemas TimeLimit :-)
mohlo by na tu rychlost mít i vliv to, ze PHP spoustim jako CGI ?
Zkusim jej spoustet jako modul, stejne jsem se to chystal predelat.
Jinak u 66 megového adresáře s opravdu složitou adresářovou strukturou. Trva zpracovani tveho skriptu 49,5s a meho, vcetne vypsani peti nejvetsich pod adresaru daneho adresare celkem 46,3s.
Mi slo o to zmensit dobu potrebnou pro vykonani skriptu a ne o navysovani time limitu. Uz 150s se mi zda prehnane. Ale jak se zda, asi to nema reseni...
Volani externiho souboru je prece jen rychlejsi nez 150s a více. mohl byc si vystup presmerovat do souboru : du -hs > vypis.lst a ten si pak cist...
Kdbych to delal dvakrat denne ... tak se to da snest
Mno tag to ma na to rozhodne vliv, ze php bezi jako cgi, podle fseho jako modul je rychlejsi :-) Pokusim se este do svyho skriptu mrknout, gde by sel zrychlit...