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";
}
}
}
?>
A D V E R T I S E M E N T
|
First camera |
 |
|
Camera type |
Standard |
|
Photo matrix |
64 Mpx |
|
Optical zoom |
 |
|
Number of lenses |
6 |
|
Flash |
LED |
|
Dual-colour LED flash |
 |
|
Video formats |
H.264, MPEG4 |
|
Additional |
AF, EIS, f/1.8 |
|
Second camera |
 |
|
Camera type |
Wide-angle |
|
Photo matrix |
8 Mpx |
|
Optical zoom |
 |
|
Field of view |
120 ° |
|
Flash |
LED |
|
Dual-colour LED flash |
 |
|
Video formats |
H.264, MPEG4 |
|
Additional |
FF, f/2.2 |
|
Third camera |
 |
|
Camera type |
Macro |
|
Photo matrix |
5 Mpx |
|
Optical zoom |
 |
|
Focal length |
30 mm |
|
Flash |
LED |
|
Dual-colour LED flash |
 |
|
Video formats |
H.264, MPEG4 |
|
Additional |
FF, f/2.4 |
|
Fourth camera |
 |
|
Camera type |
Depth of field |
|
Photo matrix |
2 Mpx |
|
Optical zoom |
 |
|
Flash |
LED |
|
Dual-colour LED flash |
 |
|
Video formats |
H.264, MPEG4 |
|
Additional |
FF, f/2.4 |
|
Fifth camera |
 |
|
Camera type |
Portrait |
|
Photo matrix |
16 Mpx |
|
Optical zoom |
 |
|
Flash |
 |
|
Dual-colour LED flash |
 |
|
Video formats |
H.264, MPEG4 |
|
Additional |
FF |
A D V E R T I S E M E N T