<?php
class TaskMetadata {
private $user_id;
private $request_id;
private $timestamp;
public function __construct($user_id, $request_id) {
$this->user_id = $user_id;
$this->request_id = $request_id;
$this->timestamp = time();
}
public function getUserID() {
return $this->user_id;
}
public function getRequestID() {
return $this->request_id;
}
public function getTimestamp() {
return $this->timestamp;
}
}
class RateLimiter {
private $limits = []; // Array to store rate limits for each user/request_id
public function __construct() {}
public function initialize() {
// Initialize rate limits for each user/request_id
}
public function isAllowed($user_id, $request_id) {
$key = $this->getKey($user_id, $request_id);
if (!isset($this->limits[$key])) {
$this->limits[$key] = []; // Initialize limit array if not exists
}
if (count($this->limits[$key]) >= 10) { // Example limit: 10 requests per minute
return false; // Rate limit exceeded
}
$this->limits[$key][] = time(); // Add timestamp of the request
return true; // Request allowed
}
private function getKey($user_id, $request_id) {
return $user_id . '_' . $request_id;
}
public function resetLimits($user_id, $request_id) {
$key = $this->getKey($user_id, $request_id);
if(isset($this->limits[$key])){
unset($this->limits[$key]);
}
}
}
function processTask($user_id, $request_id, $task_data, $rate_limiter) {
// Attach metadata
$metadata = new TaskMetadata($user_id, $request_id);
// Check rate limit
if (!$rate_limiter->isAllowed($user_id, $request_id)) {
return ['success' => false, 'message' => 'Rate limit exceeded'];
}
// Process the task
try {
// Your task processing logic here
echo "Processing task for user " . $user_id . " with request ID " . $request_id . "\n";
// Simulate some work
sleep(1);
// Example: Do something with $task_data
// echo "Task data: " . json_encode($task_data) . "\n";
return ['success' => true, 'metadata' => $metadata]; // Return success with metadata
} catch (Exception $e) {
return ['success' => false, 'message' => $e->getMessage()];
}
}
// Example Usage (for testing)
$rate_limiter = new RateLimiter();
$rate_limiter->initialize();
$user_id = 123;
$request_id = 456;
$task_data = ['key' => 'value'];
for ($i = 0; $i < 12; $i++) {
$result = processTask($user_id, $request_id, $task_data, $rate_limiter);
if ($result['success']) {
echo "Task completed successfully.\n";
} else {
echo "Task failed: " . $result['message'] . "\n";
}
sleep(0.1);
}
//Reset limits after testing
$rate_limiter->resetLimits($user_id, $request_id);
?>
Add your comment