From: Alexandre Emsenhuber Date: Sat, 1 Jan 2011 16:58:00 +0000 (+0000) Subject: Made the page_count update defered, as for the site_stats update. I just removed... X-Git-Tag: 1.31.0-rc.0~32923 X-Git-Url: http://git.cyclocoop.org/url?a=commitdiff_plain;h=8d3285fee12752733ef0e0cdd4132c11271c8e8b;p=lhc%2Fweb%2Fwiklou.git Made the page_count update defered, as for the site_stats update. I just removed Article::incViewCount() since nothing else was calling this function. --- diff --git a/includes/Article.php b/includes/Article.php index 8332cf2cce..a7351234b5 100644 --- a/includes/Article.php +++ b/includes/Article.php @@ -3573,9 +3573,8 @@ class Article { # Don't update page view counters on views from bot users (bug 14044) if ( !$wgDisableCounters && !$wgUser->isAllowed( 'bot' ) && $this->getID() ) { - Article::incViewCount( $this->getID() ); - $u = new SiteStatsUpdate( 1, 0, 0 ); - array_push( $wgDeferredUpdateList, $u ); + $wgDeferredUpdateList[] = new ViewCountUpdate( $this->getID() ); + $wgDeferredUpdateList[] = new SiteStatsUpdate( 1, 0, 0 ); } # Update newtalk / watchlist notification status @@ -3998,73 +3997,6 @@ class Article { wfProfileOut( __METHOD__ ); } - /** - * Used to increment the view counter - * - * @param $id Integer: article id - */ - public static function incViewCount( $id ) { - $id = intval( $id ); - - global $wgHitcounterUpdateFreq; - - $dbw = wfGetDB( DB_MASTER ); - $pageTable = $dbw->tableName( 'page' ); - $hitcounterTable = $dbw->tableName( 'hitcounter' ); - $acchitsTable = $dbw->tableName( 'acchits' ); - $dbType = $dbw->getType(); - - if ( $wgHitcounterUpdateFreq <= 1 || $dbType == 'sqlite' ) { - $dbw->query( "UPDATE $pageTable SET page_counter = page_counter + 1 WHERE page_id = $id" ); - - return; - } - - # Not important enough to warrant an error page in case of failure - $oldignore = $dbw->ignoreErrors( true ); - - $dbw->query( "INSERT INTO $hitcounterTable (hc_id) VALUES ({$id})" ); - - $checkfreq = intval( $wgHitcounterUpdateFreq / 25 + 1 ); - if ( ( rand() % $checkfreq != 0 ) or ( $dbw->lastErrno() != 0 ) ) { - # Most of the time (or on SQL errors), skip row count check - $dbw->ignoreErrors( $oldignore ); - - return; - } - - $res = $dbw->query( "SELECT COUNT(*) as n FROM $hitcounterTable" ); - $row = $dbw->fetchObject( $res ); - $rown = intval( $row->n ); - - if ( $rown >= $wgHitcounterUpdateFreq ) { - wfProfileIn( 'Article::incViewCount-collect' ); - $old_user_abort = ignore_user_abort( true ); - - $dbw->lockTables( array(), array( 'hitcounter' ), __METHOD__, false ); - $tabletype = $dbType == 'mysql' ? "ENGINE=HEAP " : ''; - $dbw->query( "CREATE TEMPORARY TABLE $acchitsTable $tabletype AS " . - "SELECT hc_id,COUNT(*) AS hc_n FROM $hitcounterTable " . - 'GROUP BY hc_id', __METHOD__ ); - $dbw->delete( 'hitcounter', '*', __METHOD__ ); - $dbw->unlockTables( __METHOD__ ); - - if ( $dbType == 'mysql' ) { - $dbw->query( "UPDATE $pageTable,$acchitsTable SET page_counter=page_counter + hc_n " . - 'WHERE page_id = hc_id', __METHOD__ ); - } else { - $dbw->query( "UPDATE $pageTable SET page_counter=page_counter + hc_n " . - "FROM $acchitsTable WHERE page_id = hc_id", __METHOD__ ); - } - $dbw->query( "DROP TABLE $acchitsTable", __METHOD__ ); - - ignore_user_abort( $old_user_abort ); - wfProfileOut( 'Article::incViewCount-collect' ); - } - - $dbw->ignoreErrors( $oldignore ); - } - /**#@+ * The onArticle*() functions are supposed to be a kind of hooks * which should be called whenever any of the specified actions diff --git a/includes/AutoLoader.php b/includes/AutoLoader.php index 122b5ed4b2..fefa987c8a 100644 --- a/includes/AutoLoader.php +++ b/includes/AutoLoader.php @@ -245,6 +245,7 @@ $wgAutoloadLocalClasses = array( 'UserArrayFromResult' => 'includes/UserArray.php', 'UserMailer' => 'includes/UserMailer.php', 'UserRightsProxy' => 'includes/UserRightsProxy.php', + 'ViewCountUpdate' => 'includes/ViewCountUpdate.php', 'WantedQueryPage' => 'includes/QueryPage.php', 'WatchedItem' => 'includes/WatchedItem.php', 'WatchlistEditor' => 'includes/WatchlistEditor.php', diff --git a/includes/ViewCountUpdate.php b/includes/ViewCountUpdate.php new file mode 100644 index 0000000000..8dc8fa00c9 --- /dev/null +++ b/includes/ViewCountUpdate.php @@ -0,0 +1,113 @@ +id = intval( $id ); + } + + /** + * Run the update + */ + public function doUpdate() { + global $wgHitcounterUpdateFreq; + + $dbw = wfGetDB( DB_MASTER ); + + if ( $wgHitcounterUpdateFreq <= 1 || $dbw->getType() == 'sqlite' ) { + $pageTable = $dbw->tableName( 'page' ); + $dbw->query( "UPDATE $pageTable SET page_counter = page_counter + 1 WHERE page_id = {$this->id}" ); + return; + } + + # Not important enough to warrant an error page in case of failure + $oldignore = $dbw->ignoreErrors( true ); + + $dbw->insert( 'hitcounter', array( 'hc_id' => $this->id ), __METHOD__ ); + + $checkfreq = intval( $wgHitcounterUpdateFreq / 25 + 1 ); + if ( rand() % $checkfreq == 0 && $dbw->lastErrno() == 0 ) { + $this->collect(); + } + + $dbw->ignoreErrors( $oldignore ); + } + + protected function collect() { + global $wgHitcounterUpdateFreq; + + $dbw = wfGetDB( DB_MASTER ); + + $hitcounterTable = $dbw->tableName( 'hitcounter' ); + $res = $dbw->query( "SELECT COUNT(*) as n FROM $hitcounterTable" ); + $row = $dbw->fetchObject( $res ); + $rown = intval( $row->n ); + + if ( $rown < $wgHitcounterUpdateFreq ) { + return; + } + + wfProfileIn( __METHOD__ . '-collect' ); + $old_user_abort = ignore_user_abort( true ); + + $dbw->lockTables( array(), array( 'hitcounter' ), __METHOD__, false ); + + $dbType = $dbw->getType(); + $tabletype = $dbType == 'mysql' ? "ENGINE=HEAP " : ''; + $acchitsTable = $dbw->tableName( 'acchits' ); + $pageTable = $dbw->tableName( 'page' ); + + $dbw->query( "CREATE TEMPORARY TABLE $acchitsTable $tabletype AS " . + "SELECT hc_id,COUNT(*) AS hc_n FROM $hitcounterTable " . + 'GROUP BY hc_id', __METHOD__ ); + $dbw->delete( 'hitcounter', '*', __METHOD__ ); + $dbw->unlockTables( __METHOD__ ); + + if ( $dbType == 'mysql' ) { + $dbw->query( "UPDATE $pageTable,$acchitsTable SET page_counter=page_counter + hc_n " . + 'WHERE page_id = hc_id', __METHOD__ ); + } else { + $dbw->query( "UPDATE $pageTable SET page_counter=page_counter + hc_n " . + "FROM $acchitsTable WHERE page_id = hc_id", __METHOD__ ); + } + $dbw->query( "DROP TABLE $acchitsTable", __METHOD__ ); + + ignore_user_abort( $old_user_abort ); + wfProfileOut( __METHOD__ . '-collect' ); + throw new MWException( 'test' ); + } + +} \ No newline at end of file