cesky-hosting.cz úprava třídy Debug

Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
jannemec
Člen | 78
+
0
-

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
+
0
-

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 | 8108
+
0
-

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
+
0
-

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

David Grudl
Nette Core | 8108
+
0
-

Nejspíš to tam dám, ale až to bude kompletně odladěné.