cesky-hosting.cz úprava třídy Debug
- jannemec
- Člen | 78
Protože jsem byl „nucen“ využít hosting cesky-hosting.cz, narazil jsem na problém s ini_set resp. ini_get – upravil jsem proto metodu Debug::enable – doplněn parametr, který zabrání kontrole nastavení logování chyb, které na tomto (a asi i jiném hostingu) spadne do chyby – bílá obrazovka.
/**
* Enables displaying or logging errors and exceptions.
* @param mixed production, development mode, autodetection or IP address(es).
* @param string error log file (FALSE disables logging in production mode)
* @param array|string administrator email or email headers; enables email sending in production mode
* @param boolean disables check dislay_error on the server for nette-unfriendly hostings
* @return void
*/
public static function enable($mode = NULL, $logFile = NULL, $email = NULL, $nocheck = false)
{
error_reporting(E_ALL | E_STRICT);
// production/development mode detection
if (is_bool($mode)) {
self::$productionMode = $mode;
} elseif (is_string($mode)) { // IP adresses
$mode = preg_split('#[,\s]+#', $mode);
}
if (is_array($mode)) { // IP adresses
self::$productionMode = !isset($_SERVER['REMOTE_ADDR']) || !in_array($_SERVER['REMOTE_ADDR'], $mode, TRUE);
}
if (self::$productionMode === self::DETECT) {
if (class_exists('Environment')) {
self::$productionMode = Environment::isProduction();
} elseif (isset($_SERVER['SERVER_ADDR']) || isset($_SERVER['LOCAL_ADDR'])) { // IP address based detection
$addr = isset($_SERVER['SERVER_ADDR']) ? $_SERVER['SERVER_ADDR'] : $_SERVER['LOCAL_ADDR'];
$oct = explode('.', $addr);
self::$productionMode = $addr !== '::1' && (count($oct) !== 4 || ($oct[0] !== '10' && $oct[0] !== '127' && ($oct[0] !== '172' || $oct[1] < 16 || $oct[1] > 31)
&& ($oct[0] !== '169' || $oct[1] !== '254') && ($oct[0] !== '192' || $oct[1] !== '168')));
} else {
self::$productionMode = !self::$consoleMode;
}
}
// logging configuration
if (self::$productionMode && $logFile !== FALSE) {
self::$logFile = 'log/php_error.log';
if (class_exists('Environment')) {
if (is_string($logFile)) {
self::$logFile = Environment::expand($logFile);
} else try {
self::$logFile = Environment::expand('%logDir%/php_error.log');
} catch (InvalidStateException $e) {
}
} elseif (is_string($logFile)) {
self::$logFile = $logFile;
}
if (function_exists('ini_set')) {
ini_set('error_log', self::$logFile);
}
}
// php configuration
if (function_exists('ini_set')) {
ini_set('display_errors', !self::$productionMode); // or 'stderr'
ini_set('html_errors', !self::$logFile && !self::$consoleMode);
ini_set('log_errors', (bool) self::$logFile);
} elseif ($nocheck) {
} elseif (ini_get('log_errors') != (bool) self::$logFile || // intentionally ==
(ini_get('display_errors') != !self::$productionMode && ini_get('display_errors') !== (self::$productionMode ? 'stderr' : 'stdout'))) {
throw new LogicException('Function ini_set() must be enabled.');
}
self::$sendEmails = self::$logFile && $email;
if (self::$sendEmails) {
if (is_string($email)) {
self::$emailHeaders['To'] = $email;
} elseif (is_array($email)) {
self::$emailHeaders = $email + self::$emailHeaders;
}
}
if (!defined('E_DEPRECATED')) {
define('E_DEPRECATED', 8192);
}
if (!defined('E_USER_DEPRECATED')) {
define('E_USER_DEPRECATED', 16384);
}
set_exception_handler(array(__CLASS__, '_exceptionHandler'));
set_error_handler(array(__CLASS__, '_errorHandler'));
self::$enabled = TRUE;
}
asi to není nejčistší, ale pokud je odladěný projekt na lokálu, lze ho
přenés a spolehnout se na mailové zapisování chyb …
JN
- Jakub Šulák
- Člen | 222
Trochu mě mrzí, že se David takovéto možnosti brání. Pak člověk musí takovouto úpravu přenášet do každé nové verze Nette.
- David Grudl
- Nette Core | 8227
Poslední verze 1.0dev by měla logovat manuálně, takže i na Českém hostingu by to mělo fungovat. Snad tím nevznikne jiný problém.
- Jakub Šulák
- Člen | 222
Chtěl jsem se zeptat, zda je možné tuto úpravu vložit i do případné verze 0.9.5, pokud se bude vydávat, respektive, pokud není manuální logování závislé na dalších věcech ve verzi 1.0