mirror of
https://github.com/idanoo/php-resque
synced 2025-07-01 05:32:20 +00:00
Fix a bug where the worker would spin out of control taking the server with it, if the redis connection was interrupted even briefly. Use SIGPIPE to trap this scenario cleanly.
This commit is contained in:
parent
700af834b4
commit
c90e21d88e
2 changed files with 14 additions and 0 deletions
|
@ -49,6 +49,10 @@ class Redisent {
|
|||
function __construct($host, $port = 6379) {
|
||||
$this->host = $host;
|
||||
$this->port = $port;
|
||||
$this->establishConnection();
|
||||
}
|
||||
|
||||
function establishConnection() {
|
||||
$this->__sock = fsockopen($this->host, $this->port, $errno, $errstr);
|
||||
if (!$this->__sock) {
|
||||
throw new Exception("{$errno} - {$errstr}");
|
||||
|
|
|
@ -358,6 +358,7 @@ class Resque_Worker
|
|||
pcntl_signal(SIGUSR1, array($this, 'killChild'));
|
||||
pcntl_signal(SIGUSR2, array($this, 'pauseProcessing'));
|
||||
pcntl_signal(SIGCONT, array($this, 'unPauseProcessing'));
|
||||
pcntl_signal(SIGPIPE, array($this, 'reestablishRedisConnection'));
|
||||
$this->log('Registered signals', self::LOG_VERBOSE);
|
||||
}
|
||||
|
||||
|
@ -380,6 +381,15 @@ class Resque_Worker
|
|||
$this->paused = false;
|
||||
}
|
||||
|
||||
/**
|
||||
* Signal handler for SIGPIPE, in the event the redis connection has gone away.
|
||||
* Attempts to reconnect to redis, or raises an Exception.
|
||||
*/
|
||||
public function reestablishRedisConnection() {
|
||||
$this->log('SIGPIPE received; attempting to reconnect');
|
||||
Resque::redis()->establishConnection();
|
||||
}
|
||||
|
||||
/**
|
||||
* Schedule a worker for shutdown. Will finish processing the current job
|
||||
* and when the timeout interval is reached, the worker will shut down.
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue