Tach
wenn jemand beginnt PHP zu lernen, gehört oft am Anfang die Erstellung eines einfachen Counters dazu.
ach, ist das so?
"Oft."
Ich habe die Idee mal getestet... WARNUNG! Den folgenden Code nicht übernehmen, der hat definitiv das TOCTTOU-Problem!
Versuch 1:
<?php
$start=microtime(true);
for ($i=0; $i<100000; $i++) {
payload();
}
echo "\n\nbenötigte Zeit: ", (microtime(true)-$start) , "s\n\n";
function payload() {
file_put_contents('zaehler.txt', 1 + file_get_contents('zaehler.txt'), LOCK_EX);
}
?>
Braucht bei mir ca. 12-13 Sekunden.
Versuch 2:
<?php
<?php
$start=microtime(true);
for ($i=0; $i<100000; $i++) {
payload('/local_mounts/data/tmp/');
}
echo "\n\nbenötigte Zeit: ", (microtime(true)-$start) , "s\n\n";
function payload($d) {
$z=0;
$ar=scandir($d);
sort($ar, SORT_NUMERIC);
foreach ($ar as $f) {
if ( '..' != $f && '.' !=$f ) {
unlink("$d$f");
$z=$f+1;
}
}
touch("$d$z");
}
?>
Braucht bei mir stabil knapp 4 Sekunden. Geht also wesentlich schneller. Die Zeitdifferenz von 8 Sekunden ist ja auch durch 100.000 zu teilen. Das macht pro Zugriff also 0.00008 Sekunden oder 0.08 Millisekunden aus. Das ist dann wieder nicht mehr so viel... Auch sehe ich die Behebung des TOCTTOU-Problems als schwierig an. Allenfalls käme wohl so etwas ein Blockfile oder shared memory in Betracht. Das betrifft beide Tests.
Wenn man dann daran herumdoktort kann man tatsächlich gleich eine Datenbank oder sowas wie sqlite nehmen. Grund: Hat man einmal einen Zähler, dann kommen schon bald Erweiterungswünsche...