Redis is an in-memory high-performance key-value database widely used for caching, queues, and message publish-subscribe scenarios. In PHP development, using the Redis extension allows us to conveniently implement continuous listening to Redis messages for real-time response and processing.
Before using Redis functionality, ensure the Redis extension is installed in your PHP environment. It can be installed via PECL using the following command:
<span class="fun">pecl install redis</span>
After installation, add the following line to your php.ini configuration file:
<span class="fun">extension=redis.so</span>
Restart the PHP service to enable the Redis extension.
Redis provides subscribe and publish commands for subscribing and publishing messages. In PHP, you can use the subscribe method to continuously listen to messages on specified channels and process them via a callback function.
<?php
$redis = new Redis();
$redis->connect('localhost', 6379);
$redis->subscribe(['channel'], function($redis, $channel, $message) {
// Handle received message
echo "Received message from channel {$channel}: {$message}\n";
});
This code snippet creates a Redis instance, connects to the Redis server, subscribes to the channel named channel, and prints messages received through the callback function.
A single process subscribing to messages cannot meet the requirements of high-concurrency scenarios. By using multi-process techniques, multiple consumer processes can be started simultaneously to listen to and handle messages, improving system throughput.
<?php
$redis = new Redis();
$redis->connect('localhost', 6379);
// Number of worker processes, adjust as needed
$numWorkers = 4;
for ($i = 0; $i < $numWorkers; $i++) {
$pid = pcntl_fork();
if ($pid == -1) {
die("Could not fork");
} elseif ($pid) {
// Parent process continues creating next child process
continue;
} else {
// Child process executes subscription and message handling logic
$redis->subscribe(['channel'], function($redis, $channel, $message) {
// Handle received message
echo "Received message from channel {$channel}: {$message}\n";
});
break;
}
}
// Wait for child processes to exit
while (pcntl_waitpid(0, $status) != -1) {}
This code uses pcntl_fork() to create multiple child processes, each independently subscribing to messages to achieve concurrent processing. The parent process creates child processes and waits for their completion.
Since the Redis extension uses non-blocking IO and multi-process subscriptions may cause race conditions, it is recommended to implement appropriate locking mechanisms depending on the application scenario to ensure process coordination and data safety.
This article introduced how to continuously listen to Redis message subscriptions using the Redis extension in PHP, and how to efficiently handle a large volume of messages through multi-process concurrency. This solution is simple and practical, significantly enhancing message processing performance, suitable for applications requiring real-time response and large-scale message handling.