X-Git-Url: https://git.heureux-cyclage.org/?a=blobdiff_plain;f=includes%2FViewCountUpdate.php;h=a30b0f79e70f22c0d1d016b1f5193409c3fe4739;hb=a2cf4c7184a86b7e9aa185aa5081f52b6a16a331;hp=676ce808f8f54050511c05854a4b3a86ecdc12f0;hpb=d82c14fb4fbac288b42ca5918b0a72f33ecb1e69;p=lhc%2Fweb%2Fwiklou.git diff --git a/includes/ViewCountUpdate.php b/includes/ViewCountUpdate.php index 676ce808f8..a30b0f79e7 100644 --- a/includes/ViewCountUpdate.php +++ b/includes/ViewCountUpdate.php @@ -1,21 +1,111 @@ -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 ); - function ViewCountUpdate( $pageid ) - { - $this->mPageID = $pageid; + $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 ); } - function doUpdate() - { - $sql = "UPDATE LOW_PRIORITY cur SET cur_counter=(1+cur_counter)," . - "cur_timestamp=cur_timestamp WHERE cur_id={$this->mPageID}"; - $res = wfQuery( $sql, "ViewCountUpdate::doUpdate" ); + 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' ); } } - -?>