/** * Sets up the PHP environment. Adds error/exception handling, output * buffering, and adds an auto-loading method for loading classes. * * This method is run immediately when this file is loaded, and is * benchmarked as environment_setup. * * For security, this function also destroys the $_REQUEST global variable. * Using the proper global (GET, POST, COOKIE, etc) is inherently more secure. * The recommended way to fetch a global variable is using the Input library. * @see http://www.php.net/globals * * @return void */ public static function setup() { static $run; /** * CMD Line Debugging Tool. Allows us to run stuff via cmd line * to show errors that normally would be surpressed in the browser. * * Example Usage: * /usr/bin/php index.php "home/index" --show-errors --native-errors */ if (PHP_SAPI == 'cli' && in_array("--show-errors", $_SERVER['argv'])) { Eight::$force_show_errors = YES; error_reporting(E_ALL ^ E_NOTICE); ini_set('display_errors', true); Eight::config_set('core.display_errors', YES); // Enable native errors? if (in_array("--native-errors", $_SERVER['argv'])) { Eight::$errors = FALSE; // Disables Eight error handling and lets PHP's error handling come through } // Remove the keys from the arguments foreach ($_SERVER['argv'] as $k => $v) { if ($v == "--show-errors" or $v == "--native-errors") { unset($_SERVER['argv'][$k]); } } } // This function can only be run once if ($run === YES) { return; } // Define Eight error constant define('E_EIGHT', 42); // Define 404 error constant define('E_PAGE_NOT_FOUND', 43); // Define database error constant define('E_DATABASE_ERROR', 44); // Set the default charset for mb_* functions mb_internal_encoding(Eight::CHARSET); if (self::$cache_lifetime = self::config('core.internal_cache')) { // Load cached configuration and language files self::$internal_cache['configuration'] = self::cache('configuration', self::$cache_lifetime); self::$internal_cache['language'] = self::cache('language', self::$cache_lifetime); // Load cached file paths self::$internal_cache['find_file_paths'] = self::cache('find_file_paths', self::$cache_lifetime); // Enable cache saving Event::add('system.shutdown', array(__CLASS__, 'internal_cache_save')); } // Set autoloader spl_autoload_register(array('Eight', 'auto_load')); // Send default text/html UTF-8 header header('Content-Type: text/html; charset=UTF-8'); // Should we be using Eight errors if (Eight::$errors === TRUE) { // Enable exception handling Eight_Exception::enable(); // Enable error handling Eight_Exception_PHP::enable(); // Wrap errors in tags so we can better find them ini_set('error_prepend_string', '<phperror>'); ini_set('error_append_string', '</phperror>'); } // Enable logging if the threshold is above 0 if (Eight::config('log.threshold') > 0) { // Set the log directory self::log_directory(Eight::config('log.directory')); // Enable log writing at shutdown register_shutdown_function(array(__CLASS__, 'log_save')); } // Disable notices and "strict" errors, to prevent some oddities in // PHP 5.2 and when using Eight under CLI $ER = error_reporting(~E_NOTICE & ~E_STRICT); // Set the user agent self::$user_agent = trim($_SERVER['HTTP_USER_AGENT']); // Try to set the default timezone if (!($timezone = Eight::config('locale.timezone'))) { // Get the default timezone $timezone = date_default_timezone_get(); } // Restore error reporting error_reporting($ER); // Set the default timezone date_default_timezone_set($timezone); // Start output buffering ob_start(array(__CLASS__, 'output_buffer')); // Save buffering level self::$buffer_level = ob_get_level(); // Load locales $locales = Eight::config('locale.language'); // Make first locale UTF-8 $locales[0] .= '.UTF-8'; // Set locale information self::$locale = setlocale(LC_ALL, $locales); // Enable Eight routing Event::add('system.routing', array('Router', 'find_uri')); Event::add('system.routing', array('Router', 'setup')); // Enable Eight controller initialization Event::add('system.execute', array('Eight', 'instance')); // Enable Eight 404 pages Event::add('system.404', array('Eight_Exception_404', 'trigger')); // Enable Eight output handling Event::add('system.shutdown', array('Eight', 'shutdown')); if ($config = Eight::config('core.enable_hooks')) { // Start the loading_hooks routine Benchmark::start(SYSTEM_BENCHMARK . '_loading_hooks'); $hooks = array(); if (!is_array($config)) { // All of the hooks are enabled, so we use list_files $hooks = Eight::list_files('hooks', YES); } else { // Individual hooks need to be found foreach ($config as $name) { if ($hook = Eight::find_file('hooks', $name, NO)) { // Hook was found, add it to loaded hooks $hooks[] = $hook; } else { // This should never happen Eight::log('error', 'Hook not found: ' . $name); } } } // Length of extension, for offset $ext = -strlen(EXT); foreach ($hooks as $hook) { // Validate the filename extension if (substr($hook, $ext) === EXT) { // Hook was found, include it include $hook; } else { // This should never happen Eight::log('error', 'Hook not found: ' . $hook); } } // Stop the loading_hooks routine Benchmark::stop(SYSTEM_BENCHMARK . '_loading_hooks'); } // Setup is complete, prevent it from being run again $run = YES; }