Ich verwende https://github.com/bandwidth-throttle/token-bucket für Abfragen, die auf den externen Server beschränkt sind. Mein Code:Verzögerung in Bandbreite-Drossel/Token-Bucket (PHP)
function main() {
unlink(__DIR__ . "/api.bucket2");
$storage = new FileStorage(__DIR__ . "/api.bucket2");
$rate = new Rate(3, Rate::SECOND);
$bucket = new TokenBucket(3, $rate, $storage);
$bucket->bootstrap(3);
$consumer = new BlockingConsumer($bucket);
for ($i = 0; $i < 12; $i++) {
$consumer->consume(1);
work();
}
}
function work() {
echo date("d.m.Y H:i:s") . substr((string)microtime(), 1, 4) . "\n";
}
main();
Ergebnis:
-bash-4.2$ php -f worker-test.php
03.05.2016 14:26:16.785
03.05.2016 14:26:16.785
03.05.2016 14:26:16.786
03.05.2016 14:26:17.118
03.05.2016 14:26:17.451
03.05.2016 14:26:17.784
...
ich erwartet, dass die Funktion wird 3-mal pro Sekunde aufgerufen werden, aber es ist nicht. Die ersten 6 Anrufe erfolgten in 1 Sekunde. wenn ich "Eimer-$> Bootstrap (3);" ändern auf "$ Eimer-> Bootstrap (0);", wird es besser sein:
03.05.2016 14:33:34.913
03.05.2016 14:33:35.245
03.05.2016 14:33:35.578
03.05.2016 14:33:35.911
...
aber es ist noch mehr als 3 pro Sekunde. Was mache ich falsch?
habe ich noch ein paar Tests und stellte fest, dass, wenn die Datei oder Schlüssel (Speicher) existiert bisher nicht, so fein ist alles. Aber wenn sie erschaffen wurden, ist etwas seltsam. Der rote Balken ist schnell Token, Blau - Token pro Sekunde, es ist falsch. [Bild] (http://i.imgur.com/olV7yIZ.png). Vielleicht verstehe ich etwas falsch? – dmr