[php] File exists op de juiste manier

Pagina: 1
Acties:
  • 123 views sinds 30-01-2008
  • Reageer

Onderwerpen


  • megamuch
  • Registratie: Februari 2001
  • Laatst online: 08-12-2024

megamuch

Tring Tring!

Topicstarter
Voor een foto upload site heb ik ook eens een script gemaakt wat de foto's ontvangt en ze vervolgens opslaat op hdd.

Daar zit de volgende constructie in:

PHP:
1
2
3
4
5
6
// $a = nummertje van bestand
while (file_exists($pad . $a . ".".$extensie))  
    {  
    $a = $a + 1;  
    }  
$thumbFileName = $a;


Dit gaat goed zolang er niet zo heel veel foto's zijn geupload. Maarja, ondertussen zijn we 75.000 foto's verder en wordt het onderhand wel erg traag.

Nou zou ik natuurlijk de filename kunnen md5'en, zodat je veel meer random filenames krijgt. Maar ik heb liever nummertjes ipv een string van 32 chars.

Een andere optie is het laatst gebruikte nummer opslaan in een database en die elke keer als start waarde aan $a mee geven. Dan heb ik echter weer een extra SQL call. (Die kost niet zoveel, maar als het niet hoeft, dan liever niet).

Dus mijn vraag is, op welke manier zouden jullie het checken van bestanden of ze reeds bestaan oplossen?

Verstand van Voip? Ik heb een leuke baan voor je!


  • GX
  • Registratie: Augustus 2000
  • Laatst online: 14-05 09:40

GX

Nee.

Als je het toch met de database gaat doen kan je beter gewoon de auto-incremented id gebruiken als filename en dan lekker wat rommelinfo opslaan van het plaatje in je database.

Mocht je het niet zo willen doen, dan zou je een dirlist kunnen opvragen, achteruit gesorteerd, de bovenste entry pakken, daar één bij optellen, en dat gebruiken als filename.

Eerste is leuker omdat je er meer mee kan, 2 ligt dichter bij je doel (als ik het goed begrijp).

  • dusty
  • Registratie: Mei 2000
  • Laatst online: 15-09 18:24

dusty

Celebrate Life!

Je zult het laatste nummers op een of andere manier moeten opslaan.,

Of dat nou in MySQL is of in een textbestand maakt verder niet heel veel uit.

Er zal altijd een extra call gemaakt moeten worden..

Als de rest van je site geen SQL gebruikt, zou ik gewoon gaan voor een textfile waar je het nummertje ingooit :)

Back In Black!
"Je moet haar alleen aan de ketting leggen" - MueR


  • GX
  • Registratie: Augustus 2000
  • Laatst online: 14-05 09:40

GX

Nee.

dusty schreef op donderdag 15 september 2005 @ 20:02:
Je zult het laatste nummers op een of andere manier moeten opslaan.,

Of dat nou in MySQL is of in een textbestand maakt verder niet heel veel uit.

Er zal altijd een extra call gemaakt moeten worden..

Als de rest van je site geen SQL gebruikt, zou ik gewoon gaan voor een textfile waar je het nummertje ingooit :)
Het nummertje word al opgeslagen, in je filesystem. Waarom zou je daar dan niet gewoon gebruik van maken ?

  • GlowMouse
  • Registratie: November 2002
  • Niet online
GX schreef op donderdag 15 september 2005 @ 20:08:
[...]
Het nummertje word al opgeslagen, in je filesystem. Waarom zou je daar dan niet gewoon gebruik van maken ?
Niet het nummertje, maar alle nummertjes worden opgeslagen. Als je daarin wilt zoeken, kost dat tijd. Dan kun je beter een enkel nummer hebben, of iets wat je kunt indexeren/cachen.

  • eamelink
  • Registratie: Juni 2001
  • Niet online

eamelink

Droptikkels

Een brute methode zou zijn om te beginnen bij 100000 en dan steeds de helft omhoog of omlaag al gelang de file bestaat.

Dat is een stuk sneller dan wat je nu hebt, maar valt toch wel in de categorie holbewoner :P.

Een andere manier zou zijn om gewoon `ls` te gebruiken, en dan sorteren. Maar ook dat is niet erg elegant.

Waarom maak je niet gewoon een filetje latest.txt waarin je het nummertje opslaat?

Verwijderd

PHP:
1
2
$bla = scandir('/dit/is/mijn/dir', 1);
$max = intval($bla[0]);

Gaat wellicht wat sneller, maar kost je wel weer een ranzig grote array

//edit: is dus alleen een bestaande functie in php5 zie ik

[ Voor 21% gewijzigd door Verwijderd op 15-09-2005 22:10 ]


  • GlowMouse
  • Registratie: November 2002
  • Niet online
Verwijderd schreef op donderdag 15 september 2005 @ 22:09:
//edit: is dus alleen een bestaande functie in php5 zie ik
Geeft niet, in de comments bij de helppagina staat een functie voor PHP4 die hetzelfde doet.

  • T-MOB
  • Registratie: Maart 2001
  • Laatst online: 16:36
Als je nu al 75.000 bestanden in 1 directory hebt denk ik eerlijk gezegd dat je beter wat kunt doen aan de algehele opslagmethode. Een filesystem ondersteund immers ook subdirs. Wanneer je de boel datum/prefix_# op zou slaan hoef je slechts een enkele is_dir() en dan ofwel een mkdir() ofwel een miniem aantal file_exists() uit te voeren.
_____
edit:

Om wat directer op je vraag te antwoorden, door gebruik te maken van het decimale stelsel kun je het zoeken van het grootst beschikbare getal aanzienlijk optimaliseren. Onderstaand een stukje werkende code dat daar gebruik van maakt.
Je checkt eerst wat de grootste macht van 10 is die bestaat. In het geval van bijvoorbeeld 75.124 zou dat 104 en dus 10.000 zijn. Nu gaan we voor veelvouden van deze macht van dit getal kijken of zij bestaan, aftellend van negen.. dus 90.000 - 80.000 - en 70.000 zal bestaan. We bewaren de 70.000 en doen hetzelfde nogmaals met 70.000 + n * 103: 79.000 - 78.000 ... 75.000 bestaat, dus we we bewaren 75.000 en gaan door met 75.000 + n * 102 etc.
In plaats van 75.124 bestanden checken hoeven we nu nog maar 3 + 5 + 9 + 8 + 6 = 31 bestanden te checken om het grootste bestand te vinden...

Omdat code nu eenmaal duidelijker is...
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
$test = 75124; //number of the biggest file
$k; //test number that shows the amount of file_exist_subst calls

//substitutes a file exists call for the test
function file_exist_subst($n) {
    global $test, $k;
    $k++;
    return ($n <= $test);
}

$output = '';

//find highest power of ten that does exist in $test;
$base = 0;
while (file_exist_subst(pow(10, $base+1))) { $base++; }

//find highest file number...
for ($i=$base; $i>=0; $i--) {
    for ($j=9; $j>0; $j--) {
        $check = $j * pow(10, $i);
        if (file_exist_subst($output .$check)) {
            $output .= $j; break;
        }
    }
}

echo $output .' with ' .$k .' file exists calls...';

[ Voor 76% gewijzigd door T-MOB op 15-09-2005 23:56 ]

Regeren is vooruitschuiven

Pagina: 1