class AmazonApiRateLimiter
{
/**
* Minimalna przerwa między zapytaniami (sekundy).
*/
const INTERVAL_SECONDS = 2;
/**
* Nazwa pliku blokady w katalogu log/.
*/
const LOCK_FILENAME = 'amazon_api_rate.lock';
/**
* @var string Pełna ścieżka do pliku blokady
*/
private $lockFilePath;
/**
* @var bool Tryb debug
*/
private $debug;
public function __construct($debug = false)
{
$this->debug = $debug;
$this->lockFilePath = MT_ROOT . '/../log/' . self::LOCK_FILENAME;
}
/**
* Czeka, jeśli ostatnie zapytanie było wykonane wcześniej niż INTERVAL_SECONDS temu.
*
* Musi być wywołane bezpośrednio przed każdym zapytaniem do Amazon API.
* Blokuje inne procesy (flock LOCK_EX) na czas weryfikacji i ewentualnego czekania,
* dzięki czemu kolejka zapytań jest respektowana globalnie.
*
* @return void
*/
public function wait()
{
$fh = fopen($this->lockFilePath, 'c+');
if ($fh === false) {
$this->debug('[DEBUG AmazonApiRateLimiter] Nie można otworzyć pliku blokady: ' . $this->lockFilePath);
return;
}
// Zablokuj - inne procesy czekają tutaj
flock($fh, LOCK_EX);
// Odczytaj czas ostatniego wywołania API
rewind($fh);
$content = fread($fh, 32);
$lastCall = (float)$content;
$now = microtime(true);
$elapsed = $now - $lastCall;
$waitTime = self::INTERVAL_SECONDS - $elapsed;
if ($waitTime > 0) {
$waitMicroseconds = (int)($waitTime * 1000000);
$this->debug('[DEBUG AmazonApiRateLimiter] Rate limit: czekam ' . round($waitTime, 3) . 's przed zapytaniem do API.');
usleep($waitMicroseconds);
}
// Zapisz aktualny timestamp jako czas ostatniego wywołania
ftruncate($fh, 0);
rewind($fh);
fwrite($fh, microtime(true));
fflush($fh);
// Zwolnij blokadę - następny proces może wejść
flock($fh, LOCK_UN);
fclose($fh);
}
/**
* Wypisuje komunikat diagnostyczny na stdout, jeśli tryb debug jest włączony.
*
* @param string $msg
* @return void
*/
private function debug($msg)
{
if ($this->debug) {
echo $msg . "\n";
}
}
}
?>
Rokit iO 3D
Gegevens van de telefoon Rokit iO 3D op jouw webpagina
Verkoop je op ebay.com? Heb je jouw eigen webpagina? Als je de basisgegevens over Rokit iO 3D ergens wilt publiceren, dan is het heel simpel. Het is voldoende om deze code te kopiëren en op jouw webpagina te plakken:Als je deze code plakt, dan wordt de onderstaande afbeelding getoond:
A D V E R T E N T I E
