async-aws/sqs
AsyncAWS SQS client for PHP: a lightweight, non-blocking way to send, receive, and manage Amazon SQS messages without the full AWS SDK. Ideal for async apps and microservices, with typed requests/responses and modern PHP support.
Installation:
composer require async-aws/sqs
Ensure aws/aws-sdk-php is installed (dependency).
Basic Configuration:
Add AWS credentials to .env:
AWS_ACCESS_KEY_ID=your_key
AWS_SECRET_ACCESS_KEY=your_secret
AWS_DEFAULT_REGION=us-east-1
First Use Case: Send a message to a queue:
use AsyncAws\Sqs\SqsClient;
$client = new SqsClient();
$result = $client->sendMessage([
'QueueUrl' => 'https://sqs.us-east-1.amazonaws.com/1234567890/my-queue',
'MessageBody' => 'Hello, SQS!',
]);
Where to Look First:
AsyncAws\Sqs\SqsClient class for core methods.config/sqs.php (if provided) for default configurations.Sending Messages:
$client->sendMessage([
'QueueUrl' => '...',
'MessageBody' => '...',
'MessageAttributes' => [ // Optional
'Author' => ['StringValue' => 'John Doe', 'DataType' => 'String'],
],
]);
Receiving Messages:
$messages = $client->receiveMessage([
'QueueUrl' => '...',
'MaxNumberOfMessages' => 10,
'WaitTimeSeconds' => 20, // Long polling
]);
Batch Operations:
$client->sendMessageBatch([
'QueueUrl' => '...',
'Entries' => [
['Id' => '1', 'MessageBody' => 'Batch Message 1'],
['Id' => '2', 'MessageBody' => 'Batch Message 2'],
],
]);
Queue Management:
// Create queue
$client->createQueue(['QueueName' => 'my-new-queue']);
// Delete queue
$client->deleteQueue(['QueueUrl' => '...']);
Laravel Service Provider:
Bind the client in AppServiceProvider for dependency injection:
$this->app->singleton(SqsClient::class, function () {
return new SqsClient();
});
Queue Workers: Use with Laravel's queue system for async processing:
$client->receiveMessage(['QueueUrl' => '...'])->then(function ($messages) {
foreach ($messages['Messages'] as $message) {
// Process message
$client->deleteMessage([
'QueueUrl' => '...',
'ReceiptHandle' => $message['ReceiptHandle'],
]);
}
});
Error Handling: Wrap calls in try-catch for AWS-specific exceptions:
try {
$client->sendMessage(...);
} catch (\AsyncAws\Core\Exception\AwsException $e) {
Log::error('SQS Error: ' . $e->getAwsErrorMessage());
}
Visibility Timeout:
VisibilityTimeout expires.$client->deleteMessage(['QueueUrl' => '...', 'ReceiptHandle' => $handle]);
Long Polling:
WaitTimeSeconds must be between 1 and 20 seconds. Default is 0 (short polling).Message Size Limits:
Queue URLs:
AWS_DEFAULT_REGION matches the queue's region.Batch Failures:
$result = $client->sendMessageBatch(...);
if (isset($result['Failed'])) {
Log::error('Batch failures:', $result['Failed']);
}
Enable Debugging: Configure the AWS SDK for verbose logging:
$client = new SqsClient([
'debug' => true,
'logger' => new \Monolog\Logger('sqs'),
]);
Check IAM Permissions: Ensure the IAM role/user has:
sqs:SendMessagesqs:ReceiveMessagesqs:DeleteMessagesqs:GetQueueUrl (if creating queues dynamically).Custom Middleware: Extend the client with middleware for logging, retries, or transformations:
$client = new SqsClient();
$client->getMiddlewareStack()->push(function ($handler) {
return function ($request) {
// Pre-process request
$response = $handler($request);
// Post-process response
return $response;
};
});
Queue Factories: Create a factory class to abstract queue URLs and configurations:
class SqsQueueFactory {
public static function getQueueUrl(string $name): string {
return "https://sqs.{region}.amazonaws.com/{account-id}/{$name}";
}
}
Event Dispatching:
Trigger Laravel events on SQS actions (e.g., MessageSent, MessageProcessed):
event(new MessageSent($message));
How can I help you explore Laravel packages today?