Free up memory from as many singletons and instantiated objects as possible before terminating
[gitphp.git] / index.php
blob:a/index.php -> blob:b/index.php
<?php <?php
/** /**
* GitPHP * GitPHP
* *
* Index * Index
* *
* @author Christopher Han <xiphux@gmail.com> * @author Christopher Han <xiphux@gmail.com>
* @copyright Copyright (c) 2010 Christopher Han * @copyright Copyright (c) 2010 Christopher Han
* @package GitPHP * @package GitPHP
*/ */
   
/**  
* Use utf-8 encoding  
*/  
if (function_exists('mb_internal_encoding')) {  
mb_internal_encoding("UTF-8");  
}  
   
/** /**
* Define start time / memory for benchmarking * Define start time / memory for benchmarking
*/ */
define('GITPHP_START_TIME', microtime(true)); define('GITPHP_START_TIME', microtime(true));
define('GITPHP_START_MEM', memory_get_usage()); define('GITPHP_START_MEM', memory_get_usage());
   
/** /**
* Define some paths * Define some paths
*/ */
define('GITPHP_BASEDIR', dirname(__FILE__) . '/'); define('GITPHP_BASEDIR', dirname(__FILE__) . '/');
define('GITPHP_CONFIGDIR', GITPHP_BASEDIR . 'config/'); define('GITPHP_CONFIGDIR', GITPHP_BASEDIR . 'config/');
define('GITPHP_INCLUDEDIR', GITPHP_BASEDIR . 'include/'); define('GITPHP_INCLUDEDIR', GITPHP_BASEDIR . 'include/');
define('GITPHP_GITOBJECTDIR', GITPHP_INCLUDEDIR . 'git/');  
define('GITPHP_CONTROLLERDIR', GITPHP_INCLUDEDIR . 'controller/');  
define('GITPHP_CACHEDIR', GITPHP_INCLUDEDIR . 'cache/');  
define('GITPHP_LOCALEDIR', GITPHP_BASEDIR . 'locale/'); define('GITPHP_LOCALEDIR', GITPHP_BASEDIR . 'locale/');
  define('GITPHP_CACHEDIR', GITPHP_BASEDIR . 'cache/');
  define('GITPHP_LIBDIR', GITPHP_BASEDIR . 'lib/');
  define('GITPHP_SMARTYDIR', GITPHP_LIBDIR . 'smarty/libs/');
  define('GITPHP_GESHIDIR', GITPHP_LIBDIR . 'geshi/');
   
define('GITPHP_CACHE', GITPHP_BASEDIR . 'cache/'); define('GITPHP_COMPRESS_TAR', 'tar');
  define('GITPHP_COMPRESS_BZ2', 'tbz2');
  define('GITPHP_COMPRESS_GZ', 'tgz');
  define('GITPHP_COMPRESS_ZIP', 'zip');
   
include_once(GITPHP_INCLUDEDIR . 'version.php'); /**
  * Low level setup
require_once(GITPHP_INCLUDEDIR . 'Util.class.php'); */
  if (function_exists('mb_internal_encoding')) {
require_once(GITPHP_INCLUDEDIR . 'Config.class.php'); mb_internal_encoding("UTF-8");
  }
require_once(GITPHP_INCLUDEDIR . 'Resource.class.php');  
   
require_once(GITPHP_INCLUDEDIR . 'Log.class.php');  
   
require_once(GITPHP_GITOBJECTDIR . 'ProjectList.class.php');  
   
require_once(GITPHP_INCLUDEDIR . 'MessageException.class.php');  
   
require_once(GITPHP_CONTROLLERDIR . 'Controller.class.php');  
   
require_once(GITPHP_CACHEDIR . 'Cache.class.php');  
require_once(GITPHP_CACHEDIR . 'MemoryCache.class.php');  
   
// Need this include for the compression constants used in the config file  
require_once(GITPHP_GITOBJECTDIR . 'Archive.class.php');  
   
// Test these executables early  
require_once(GITPHP_GITOBJECTDIR . 'GitExe.class.php');  
   
date_default_timezone_set('UTC'); date_default_timezone_set('UTC');
   
  /**
  * Version header
  */
  include(GITPHP_INCLUDEDIR . 'version.php');
   
/* /**
* Set the locale based on the user's preference * Autoload setup
*/ */
if ((!isset($_COOKIE[GITPHP_LOCALE_COOKIE])) || empty($_COOKIE[GITPHP_LOCALE_COOKIE])) { require(GITPHP_INCLUDEDIR . 'AutoLoader.class.php');
  spl_autoload_register(array('GitPHP_AutoLoader', 'AutoLoad'));
   
/*  
* User's first time here, try by HTTP_ACCEPT_LANGUAGE $router = new GitPHP_Router();
*/  
if (isset($_SERVER['HTTP_ACCEPT_LANGUAGE'])) { try {
$httpAcceptLang = explode(',', $_SERVER['HTTP_ACCEPT_LANGUAGE']);  
$preferredLocale = GitPHP_Resource::FindPreferredLocale($_SERVER['HTTP_ACCEPT_LANGUAGE']); $controller = $router->GetController();
if (!empty($preferredLocale)) { if ($controller) {
setcookie(GITPHP_LOCALE_COOKIE, $preferredLocale, time()+GITPHP_LOCALE_COOKIE_LIFETIME); $controller->Initialize();
GitPHP_Resource::Instantiate($preferredLocale); $controller->RenderHeaders();
  $controller->Render();
  }
   
  } catch (Exception $e) {
   
  $messageController = $router->GetMessageController();
  $messageController->Initialize();
   
  if (!($e instanceof GitPHP_MessageException)) {
  $config = $messageController->GetConfig();
  if ($config && $config->GetValue('debug')) {
  throw $e;
} }
} }
   
if (!GitPHP_Resource::Instantiated()) { $messageController->SetParam('exception', $e);
/* $messageController->RenderHeaders();
* Create a dummy cookie to prevent browser delay $messageController->Render();
*/  
setcookie(GITPHP_LOCALE_COOKIE, 0, time()+GITPHP_LOCALE_COOKIE_LIFETIME);  
}  
   
} else if (isset($_GET['l']) && !empty($_GET['l'])) { unset($messageController);
   
/*  
* User picked something  
*/  
setcookie(GITPHP_LOCALE_COOKIE, $_GET['l'], time()+GITPHP_LOCALE_COOKIE_LIFETIME);  
GitPHP_Resource::Instantiate($_GET['l']);  
   
} else if (isset($_COOKIE[GITPHP_LOCALE_COOKIE]) && !empty($_COOKIE[GITPHP_LOCALE_COOKIE])) {  
   
/*  
* Returning visitor with a preference  
*/  
GitPHP_Resource::Instantiate($_COOKIE[GITPHP_LOCALE_COOKIE]);  
   
} }
   
  unset($router);
   
try { if (isset($controller)) {
  $log = $controller->GetLog();
/* if ($log && $log->GetEnabled()) {
* Configuration $entries = $log->GetEntries();
*/ foreach ($entries as $logline) {
GitPHP_Config::GetInstance()->LoadConfig(GITPHP_CONFIGDIR . 'gitphp.conf.php'); echo "<br />\n" . htmlspecialchars($logline, ENT_QUOTES, 'UTF-8', true);
  }
/* unset($logline);
* Use the default language in the config if user has no preference unset($entries);
* with en_US as the fallback  
*/  
if (!GitPHP_Resource::Instantiated()) {  
GitPHP_Resource::Instantiate(GitPHP_Config::GetInstance()->GetValue('locale', 'en_US'));  
}  
   
/*  
* Debug  
*/  
if (GitPHP_Log::GetInstance()->GetEnabled()) {  
GitPHP_Log::GetInstance()->SetStartTime(GITPHP_START_TIME);  
GitPHP_Log::GetInstance()->SetStartMemory(GITPHP_START_MEM);  
}  
   
if (!GitPHP_Config::GetInstance()->GetValue('projectroot', null)) {  
throw new GitPHP_MessageException(__('A projectroot must be set in the config'), true, 500);  
}  
   
/*  
* Check for required executables  
*/  
$exe = new GitPHP_GitExe(null);  
if (!$exe->Valid()) {  
throw new GitPHP_MessageException(sprintf(__('Could not run the git executable "%1$s". You may need to set the "%2$s" config value.'), $exe->GetBinary(), 'gitbin'), true, 500);  
}  
unset($exe);  
   
/*  
* Project list  
*/  
if (file_exists(GITPHP_CONFIGDIR . 'projects.conf.php')) {  
GitPHP_ProjectList::Instantiate(GITPHP_CONFIGDIR . 'projects.conf.php', false);  
} else {  
GitPHP_ProjectList::Instantiate(GITPHP_CONFIGDIR . 'gitphp.conf.php', true);  
}  
   
$controller = GitPHP_Controller::GetController((isset($_GET['a']) ? $_GET['a'] : null));  
if ($controller) {  
$controller->RenderHeaders();  
$controller->Render();  
} }
unset($controller); unset($controller);
   
} catch (Exception $e) {  
   
if (GitPHP_Config::GetInstance()->GetValue('debug', false)) {  
throw $e;  
}  
   
if (!GitPHP_Resource::Instantiated()) {  
/*  
* In case an error was thrown before instantiating  
* the resource manager  
*/  
GitPHP_Resource::Instantiate('en_US');  
}  
   
require_once(GITPHP_CONTROLLERDIR . 'Controller_Message.class.php');  
$controller = new GitPHP_Controller_Message();  
$controller->SetParam('message', $e->getMessage());  
if ($e instanceof GitPHP_MessageException) {  
$controller->SetParam('error', $e->Error);  
$controller->SetParam('statuscode', $e->StatusCode);  
} else {  
$controller->SetParam('error', true);  
}  
$controller->RenderHeaders();  
$controller->Render();  
   
unset($controller);  
   
} }
   
GitPHP_Log::GetInstance()->Log('MemoryCache count: ' . GitPHP_MemoryCache::GetInstance()->GetCount());  
   
GitPHP_MemoryCache::DestroyInstance();  
GitPHP_ProjectList::DestroyInstance();  
GitPHP_Resource::DestroyInstance();  
GitPHP_Config::DestroyInstance();  
   
if (GitPHP_Log::GetInstance()->GetEnabled()) {  
$entries = GitPHP_Log::GetInstance()->GetEntries();  
foreach ($entries as $logline) {  
echo "<br />\n" . $logline;  
}  
unset($logline);  
unset($entries);  
}  
   
GitPHP_Log::DestroyInstance();  
   
?> ?>
   
comments