X-Git-Url: http://git.heureux-cyclage.org/?a=blobdiff_plain;f=includes%2FWiki.php;h=3a18061458f9f7c514f8bf78d1e76c9bce4f625d;hb=e275ea28a9b62ed7aa48586599fdab988b3da8e6;hp=295c5e22a9b615406df4884970ce3546d75b04e5;hpb=7613c75b0aca7680b78307716f2ae83956a3d734;p=lhc%2Fweb%2Fwiklou.git diff --git a/includes/Wiki.php b/includes/Wiki.php index 295c5e22a9..3a18061458 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() ); } @@ -194,6 +198,14 @@ class MediaWiki { // may be a redirect to another article or URL. $article = $this->initializeArticle(); if ( is_object( $article ) ) { + /** + * $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 = $article; + $this->performAction( $article ); wfProfileOut( __METHOD__ ); return $article; @@ -432,7 +444,6 @@ class MediaWiki { case 'rollback': case 'protect': case 'unprotect': - case 'info': case 'render': $article->$act(); break; @@ -473,4 +484,106 @@ class MediaWiki { } wfProfileOut( __METHOD__ ); } + + /** + * Run the current MediaWiki instance + * index.php just calls this + */ + function run() { + try { + $this->checkMaxLag( true ); + $this->main(); + $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; + + wfProfileIn( __METHOD__ ); + + # Set title from request parameters + $wgTitle = $this->getTitle(); + $action = $this->getAction(); + + # Send Ajax requests to the Ajax dispatcher. + if ( $wgUseAjax && $action == 'ajax' ) { + $dispatcher = new AjaxDispatcher(); + $dispatcher->performAction(); + wfProfileOut( __METHOD__ ); + 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' ); + wfProfileOut( __METHOD__ ); + return; + } + } + wfProfileOut( 'main-try-filecache' ); + } + + $this->performRequest(); + $this->finalCleanup(); + + wfProfileOut( __METHOD__ ); + } }