From c5d9be83f03ab3b5befb988911fd3c96b4f2c16d Mon Sep 17 00:00:00 2001 From: Platonides Date: Sat, 18 Jun 2011 14:50:26 +0000 Subject: [PATCH] As discussed in r85918 CR. Move everything from wfIndexMain() at index.php to MediaWiki class. This makes index.php compatible again with PHP4 (as in showing a nice error message instead of a parser error), which had been broken in r88959. --- includes/Wiki.php | 102 +++++++++++++++++++++++++++++++++++++++++++++- index.php | 95 +----------------------------------------- 2 files changed, 103 insertions(+), 94 deletions(-) diff --git a/includes/Wiki.php b/includes/Wiki.php index 295c5e22a9..3db5835aeb 100644 --- a/includes/Wiki.php +++ b/includes/Wiki.php @@ -22,7 +22,11 @@ class MediaWiki { return $this->context->getOutput(); } - public function __construct( RequestContext $context ){ + public function __construct( RequestContext $context = null ) { + if ( !$context ) { + $context = RequestContext::getMain(); + } + $this->context = $context; $this->context->setTitle( $this->parseTitle() ); } @@ -473,4 +477,100 @@ class MediaWiki { } wfProfileOut( __METHOD__ ); } + + /** + * Run the current MediaWiki instance + * index.php just calls this + */ + function run() { + try { + $this->checkMaxLag( true ); + $this->main(); + $this->finalCleanup(); + $this->restInPeace(); + } catch ( Exception $e ) { + MWExceptionHandler::handle( $e ); + } + } + + /** + * Checks if the request should abort due to a lagged server, + * for given maxlag parameter. + * + * @param boolean $abort True if this class should abort the + * script execution. False to return the result as a boolean. + * @return boolean True if we passed the check, false if we surpass the maxlag + */ + function checkMaxLag( $abort ) { + global $wgShowHostnames; + + wfProfileIn( __METHOD__ ); + $maxLag = $this->context->getRequest()->getVal( 'maxlag' ); + if ( !is_null( $maxLag ) ) { + $lb = wfGetLB(); // foo()->bar() is not supported in PHP4 + list( $host, $lag ) = $lb->getMaxLag(); + if ( $lag > $maxLag ) { + if ( $abort ) { + header( 'HTTP/1.1 503 Service Unavailable' ); + header( 'Retry-After: ' . max( intval( $maxLag ), 5 ) ); + header( 'X-Database-Lag: ' . intval( $lag ) ); + header( 'Content-Type: text/plain' ); + if( $wgShowHostnames ) { + echo "Waiting for $host: $lag seconds lagged\n"; + } else { + echo "Waiting for a database server: $lag seconds lagged\n"; + } + } + + wfProfileOut( __METHOD__ ); + + if ( !$abort ) + return false; + exit; + } + } + wfProfileOut( __METHOD__ ); + return true; + } + + function main() { + global $wgUseFileCache, $wgTitle, $wgUseAjax; + + # Set title from request parameters + $wgTitle = $this->getTitle(); + $action = $this->context->getRequest()->getVal( 'action', 'view' ); + + # Send Ajax requests to the Ajax dispatcher. + if ( $wgUseAjax && $action == 'ajax' ) { + $dispatcher = new AjaxDispatcher(); + $dispatcher->performAction(); + return; + } + + if ( $wgUseFileCache && $wgTitle !== null ) { + wfProfileIn( 'main-try-filecache' ); + // Raw pages should handle cache control on their own, + // even when using file cache. This reduces hits from clients. + if ( $action != 'raw' && HTMLFileCache::useFileCache() ) { + /* Try low-level file cache hit */ + $cache = new HTMLFileCache( $wgTitle, $action ); + if ( $cache->isFileCacheGood( /* Assume up to date */ ) ) { + /* Check incoming headers to see if client has this cached */ + if ( !$this->context->getOutput()->checkLastModified( $cache->fileCacheTime() ) ) { + $cache->loadFromFileCache(); + } + # Do any stats increment/watchlist stuff + $article = Article::newFromTitle( $wgTitle, $this->context ); + $article->viewUpdates(); + # Tell OutputPage that output is taken care of + $this->context->getOutput()->disable(); + wfProfileOut( 'main-try-filecache' ); + return; + } + } + wfProfileOut( 'main-try-filecache' ); + } + + $this->performRequest(); + } } diff --git a/index.php b/index.php index 66693c55e4..fb415bcf5f 100644 --- a/index.php +++ b/index.php @@ -70,99 +70,8 @@ if ( isset( $_SERVER['MW_COMPILED'] ) ) { require ( dirname( __FILE__ ) . '/includes/WebStart.php' ); } -try { - wfIndexMain(); -} catch ( Exception $e ) { - MWExceptionHandler::handle( $e ); -} - -function wfIndexMain() { - global $wgRequest, $wgShowHostnames, $mediaWiki, $wgTitle, $wgUseAjax, $wgUseFileCache; - - wfProfileIn( 'index.php' ); - wfProfileIn( 'index.php-setup' ); - - $maxLag = $wgRequest->getVal( 'maxlag' ); - if ( !is_null( $maxLag ) ) { - $lb = wfGetLB(); // foo()->bar() is not supported in PHP4 - list( $host, $lag ) = $lb->getMaxLag(); - if ( $lag > $maxLag ) { - header( 'HTTP/1.1 503 Service Unavailable' ); - header( 'Retry-After: ' . max( intval( $maxLag ), 5 ) ); - header( 'X-Database-Lag: ' . intval( $lag ) ); - header( 'Content-Type: text/plain' ); - if( $wgShowHostnames ) { - echo "Waiting for $host: $lag seconds lagged\n"; - } else { - echo "Waiting for a database server: $lag seconds lagged\n"; - } - wfProfileOut( 'index.php-setup' ); - wfProfileOut( 'index.php' ); - exit; - } - } - - # Initialize MediaWiki base class - $context = RequestContext::getMain(); - $mediaWiki = new MediaWiki( $context ); - - # Set title from request parameters - $wgTitle = $mediaWiki->getTitle(); - $action = $wgRequest->getVal( 'action', 'view' ); - - wfProfileOut( 'index.php-setup' ); - - # Send Ajax requests to the Ajax dispatcher. - if ( $wgUseAjax && $action == 'ajax' ) { - $dispatcher = new AjaxDispatcher(); - $dispatcher->performAction(); - wfProfileOut( 'index.php' ); - $mediaWiki->restInPeace(); - exit; - } - - if ( $wgUseFileCache && $wgTitle !== null ) { - wfProfileIn( 'index.php-filecache' ); - // Raw pages should handle cache control on their own, - // even when using file cache. This reduces hits from clients. - if ( $action != 'raw' && HTMLFileCache::useFileCache() ) { - /* Try low-level file cache hit */ - $cache = new HTMLFileCache( $wgTitle, $action ); - if ( $cache->isFileCacheGood( /* Assume up to date */ ) ) { - /* Check incoming headers to see if client has this cached */ - if ( !$context->getOutput()->checkLastModified( $cache->fileCacheTime() ) ) { - $cache->loadFromFileCache(); - } - # Do any stats increment/watchlist stuff - $article = Article::newFromTitle( $wgTitle, $context ); - $article->viewUpdates(); - # Tell OutputPage that output is taken care of - $context->getOutput()->disable(); - wfProfileOut( 'index.php-filecache' ); - $mediaWiki->finalCleanup(); - wfProfileOut( 'index.php' ); - $mediaWiki->restInPeace(); - exit; - } - } - wfProfileOut( 'index.php-filecache' ); - } - - /** - * $wgArticle is deprecated, do not use it. This will possibly be removed - * entirely in 1.20 or 1.21 - * @deprecated since 1.19 - */ - global $wgArticle; - - $wgArticle = $mediaWiki->performRequest(); - - $mediaWiki->finalCleanup(); - - wfProfileOut( 'index.php' ); - - $mediaWiki->restInPeace(); -} +$mediaWiki = new MediaWiki(); +$mediaWiki->run(); /** * Display something vaguely comprehensible in the event of a totally unrecoverable error. -- 2.20.1