Skip to content
This repository has been archived by the owner on Jan 30, 2020. It is now read-only.

Commit

Permalink
Merge branch 'feature/5875' into develop
Browse files Browse the repository at this point in the history
  • Loading branch information
weierophinney committed Mar 7, 2014
161 parents e9f04d9 + 4112f92 + 6faf2bb + df3a849 + ee5efcb + 2ee5d16 + bcb4d03 + a5c61e2 + 57ffceb + a6fa26b + 9d36595 + bf0040c + 71b1a95 + 5619ba3 + c093ab0 + de13946 + 04b025f + 0933607 + 34ed3ed + 83f6472 + db74e8c + 7b75da1 + bb4c48f + 9fa3c05 + 139c0b1 + a587eef + 7a782f4 + 39cb2e2 + 31f8c80 + a9b7779 + de058f6 + 67b97f6 + 40d86d0 + b5234cc + 17b4e13 + 8af24aa + 1a9df55 + 2c85c99 + 5557fac + fe78a35 + f6430c3 + 6041a1e + 86b9031 + 674bd75 + 67a1bfb + 4d4dd8b + c655082 + dbb18b2 + 97a9134 + 80367df + 98d5255 + 7946c9f + ea67c13 + 44df0b2 + 38e090d + 7af74e7 + 8b311b1 + e2c2b94 + 51601cb + dcc1eaf + 6f4b805 + a30a64f + ee7347d + 8b04bfe + b487f00 + ecdfdf6 + d8cde75 + b7a33bb + 65ecb58 + 571d938 + 625a786 + 6fe4efc + f94838d + 76607e3 + 492076c + 17b56b8 + c5509fe + e0fa433 + 7d74e99 + 309136e + f1dd38a + 7be533f + 6a618c2 + 3a454e3 + f66ca80 + f1bebf2 + 850249d + 674d7ba + 597ff82 + ae87c49 + fb156fb + 9c474de + 1a75c72 + 47d1cd2 + a937ea3 + 4219922 + 49e380f + 5903df6 + 7a9d632 + 2ef7274 + b606220 + a09c5c7 + 21afa5c + 8faa67f + 1731915 + efa1bb3 + 5576455 + 86d3ae8 + de3fd70 + 398a3c4 + 5c56554 + 7ad896f + fa91c9b + 1372a45 + a0c8737 + e368d53 + 462b1f7 + 79675fe + a8104b9 + 91ed9d0 + b1d1358 + 6a0c90c + 5e4258f + 239c0d0 + b457c76 + a2533a4 + beb6598 + 79d0f46 + 1519723 + 5084e3b + ce75f80 + e5fd689 + 6744e82 + 6cb64b8 + 03c6da8 + 7dcfd8f + a18fe5d + 5e5ada1 + 8e92f40 + 77fde49 + 0d988ee + 49bc0b3 + 975bb98 + cadc7b4 + a8af3df + ef19f19 + da1eb0c + fe5af05 + bba7d3a + 91ae243 + 81c3d1e + a65de03 + ebb4db5 + d074ac7 + d4876c1 + c35719b + 8250024 + 805fd63 + 5c3d30d + 147b000 + f9c1c0e commit 4a22b91
Show file tree
Hide file tree
Showing 2 changed files with 69 additions and 0 deletions.
46 changes: 46 additions & 0 deletions src/Logger.php
Original file line number Diff line number Diff line change
Expand Up @@ -60,6 +60,13 @@ class Logger implements LoggerInterface
*/
protected static $registeredErrorHandler = false;

/**
* Registered shutdown error handler
*
* @var bool
*/
protected static $registeredFatalErrorShutdownFunction = false;

/**
* Registered exception handler
*
Expand Down Expand Up @@ -173,6 +180,10 @@ public function __construct($options = null)
if (isset($options['errorhandler']) && $options['errorhandler'] === true) {
static::registerErrorHandler($this);
}

if (isset($options['fatal_error_shutdownfunction']) && $options['fatal_error_shutdownfunction'] === true) {
static::registerFatalErrorShutdownFunction($this);
}
}

/**
Expand Down Expand Up @@ -568,6 +579,41 @@ public static function unregisterErrorHandler()
static::$registeredErrorHandler = false;
}


/**
* Register a shutdown handler to log fatal errors
*
* @link http://www.php.net/manual/function.register-shutdown-function.php
* @param Logger $logger
* @return bool
*/
public static function registerFatalErrorShutdownFunction(Logger $logger)
{
// Only register once per instance
if (static::$registeredFatalErrorShutdownFunction) {
return false;
}

$errorPriorityMap = static::$errorPriorityMap;

register_shutdown_function(function () use ($logger, $errorPriorityMap) {
$error = error_get_last();
if (null !== $error && $error['type'] === E_ERROR) {
$logger->log($errorPriorityMap[E_ERROR],
$error['message'],
array(
'file' => $error['file'],
'line' => $error['line']
)
);
}
});

static::$registeredFatalErrorShutdownFunction = true;
return true;
}


/**
* Register logging system as an exception handler to log PHP exceptions
*
Expand Down
23 changes: 23 additions & 0 deletions test/LoggerTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -430,4 +430,27 @@ public function testErrorHandlerWithStreamWriter()
$this->assertContains('test', $contents);
$this->assertContains('second', $contents);
}

/**
* @runInSeparateProcess
*/
public function testRegisterFatalShutdownFunction()
{
$writer = new MockWriter;
$this->logger->addWriter($writer);

$result = Logger::registerFatalErrorShutdownFunction($this->logger);
$this->assertTrue($result);

// check for single error handler instance
$this->assertFalse(Logger::registerFatalErrorShutdownFunction($this->logger));

$self = $this;
register_shutdown_function(function () use ($writer, $self) {
$self->assertEquals($writer->events[0]['message'], 'Call to undefined method ZendTest\Log\LoggerTest::callToNonExistingMethod()');
});

// Temporary hide errors, because we don't want the fatal error to fail the test
@$this->callToNonExistingMethod();
}
}

0 comments on commit 4a22b91

Please sign in to comment.