X-Git-Url: http://git.cyclocoop.org/?a=blobdiff_plain;f=includes%2FStatCounter.php;h=374d5caf07eb151ad1db5eb43cf59bd6427556c5;hb=634f48b9d09648ec38781d222d186513e96b9ab7;hp=ca327931d989a85ae2e7f16c4dc30a4568f50f44;hpb=38ce5d87035db3ba485692ab729bc8bc025237e5;p=lhc%2Fweb%2Fwiklou.git diff --git a/includes/StatCounter.php b/includes/StatCounter.php index ca327931d9..374d5caf07 100644 --- a/includes/StatCounter.php +++ b/includes/StatCounter.php @@ -26,6 +26,7 @@ * * @file * @ingroup StatCounter + * @author Aaron Schulz */ /** @@ -40,6 +41,9 @@ class StatCounter { protected function __construct() {} + /** + * @return StatCounter + */ public static function singleton() { static $instance = null; if ( !$instance ) { @@ -56,13 +60,10 @@ class StatCounter { * @return void */ public function incr( $key, $count = 1 ) { + $this->deltas[$key] = isset( $this->deltas[$key] ) ? $this->deltas[$key] : 0; + $this->deltas[$key] += $count; if ( PHP_SAPI === 'cli' ) { - $this->sendDelta( $key, $count ); - } else { - if ( !isset( $this->deltas[$key] ) ) { - $this->deltas[$key] = 0; - } - $this->deltas[$key] += $count; + $this->flush(); } } @@ -72,66 +73,78 @@ class StatCounter { * @return void */ public function flush() { - try { - foreach ( $this->deltas as $key => $count ) { - $this->sendDelta( $key, $count ); - } - } catch ( MWException $e ) { - trigger_error( "Caught exception: {$e->getMessage()}"); + global $wgStatsMethod; + + $deltas = array_filter( $this->deltas ); // remove 0 valued entries + if ( $wgStatsMethod === 'udp' ) { + $this->sendDeltasUDP( $deltas ); + } elseif ( $wgStatsMethod === 'cache' ) { + $this->sendDeltasMemc( $deltas ); + } else { + // disabled } $this->deltas = array(); } /** - * @param string $key - * @param string $count + * @param array $deltas * @return void */ - protected function sendDelta( $key, $count ) { - global $wgStatsMethod; - - $count = intval( $count ); - if ( $count == 0 ) { - return; - } + protected function sendDeltasUDP( array $deltas ) { + global $wgUDPProfilerHost, $wgUDPProfilerPort, $wgAggregateStatsID; - if ( $wgStatsMethod == 'udp' ) { - global $wgUDPProfilerHost, $wgUDPProfilerPort, $wgAggregateStatsID; - static $socket; + $id = strlen( $wgAggregateStatsID ) ? $wgAggregateStatsID : wfWikiID(); - $id = $wgAggregateStatsID !== false ? $wgAggregateStatsID : wfWikiID(); + $lines = array(); + foreach ( $deltas as $key => $count ) { + $lines[] = "stats/{$id} - {$count} 1 1 1 1 {$key}\n"; + } + if ( count( $lines ) ) { + static $socket = null; if ( !$socket ) { $socket = socket_create( AF_INET, SOCK_DGRAM, SOL_UDP ); - $statline = "stats/{$id} - 1 1 1 1 1 -total\n"; + array_unshift( $lines, "stats/{$id} - 1 1 1 1 1 -total\n" ); + } + $packet = ''; + $packets = array(); + foreach ( $lines as $line ) { + if ( ( strlen( $packet ) + strlen( $line ) ) > 1450 ) { + $packets[] = $packet; + $packet = ''; + } + $packet .= $line; + } + if ( $packet != '' ) { + $packets[] = $packet; + } + foreach ( $packets as $packet ) { + wfSuppressWarnings(); socket_sendto( $socket, - $statline, - strlen( $statline ), + $packet, + strlen( $packet ), 0, $wgUDPProfilerHost, $wgUDPProfilerPort ); + wfRestoreWarnings(); } - $statline = "stats/{$id} - {$count} 1 1 1 1 {$key}\n"; - wfSuppressWarnings(); - socket_sendto( - $socket, - $statline, - strlen( $statline ), - 0, - $wgUDPProfilerHost, - $wgUDPProfilerPort - ); - wfRestoreWarnings(); - } elseif ( $wgStatsMethod == 'cache' ) { - global $wgMemc; - $key = wfMemcKey( 'stats', $key ); - if ( is_null( $wgMemc->incr( $key, $count ) ) ) { - $wgMemc->add( $key, $count ); + } + } + + /** + * @param array $deltas + * @return void + */ + protected function sendDeltasMemc( array $deltas ) { + global $wgMemc; + + foreach ( $deltas as $key => $count ) { + $ckey = wfMemcKey( 'stats', $key ); + if ( $wgMemc->incr( $ckey, $count ) === null ) { + $wgMemc->add( $ckey, $count ); } - } else { - // Disabled } } }