Merge "Enforce some type hinting in Linker class"
[lhc/web/wiklou.git] / includes / StatCounter.php
index 30e5042..5fc8f2f 100644 (file)
@@ -26,6 +26,7 @@
  *
  * @file
  * @ingroup StatCounter
+ * @author Aaron Schulz
  */
 
 /**
  * @ingroup StatCounter
  */
 class StatCounter {
-       /** @var Array */
+       /** @var array */
        protected $deltas = array(); // (key => count)
 
-       protected function __construct() {}
+       /** @var Config */
+       protected $config;
 
+       protected function __construct( Config $config ) {
+               $this->config = $config;
+       }
+
+       /**
+        * @return StatCounter
+        */
        public static function singleton() {
                static $instance = null;
                if ( !$instance ) {
-                       $instance = new self();
+                       $instance = new self(
+                               ConfigFactory::getDefaultInstance()->makeConfig( 'main' )
+                       );
                }
                return $instance;
        }
@@ -52,17 +63,14 @@ class StatCounter {
         * Increment a key by delta $count
         *
         * @param string $key
-        * @param integer $count
+        * @param int $count
         * @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,70 +80,75 @@ 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()}");
+               $statsMethod = $this->config->get( 'StatsMethod' );
+               $deltas = array_filter( $this->deltas ); // remove 0 valued entries
+               if ( $statsMethod === 'udp' ) {
+                       $this->sendDeltasUDP( $deltas );
+               } elseif ( $statsMethod === '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;
+       protected function sendDeltasUDP( array $deltas ) {
+               $aggregateStatsID = $this->config->get( 'AggregateStatsID' );
+               $id = strlen( $aggregateStatsID ) ? $aggregateStatsID : wfWikiID();
 
-               $count = intval( $count );
-               if ( $count == 0 ) {
-                       return;
+               $lines = array();
+               foreach ( $deltas as $key => $count ) {
+                       $lines[] = sprintf( $this->config->get( 'StatsFormatString' ), $id, $count, $key );
                }
 
-               if ( $wgStatsMethod == 'udp' ) {
-                       global $wgUDPProfilerHost, $wgUDPProfilerPort, $wgAggregateStatsID;
-                       static $socket;
-
-                       $id = $wgAggregateStatsID !== false ? $wgAggregateStatsID : wfWikiID();
-
+               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";
+                       }
+                       $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
+                                       $this->config->get( 'UDPProfilerHost' ),
+                                       $this->config->get( 'UDPProfilerPort' )
                                );
+                               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 );
-                       }
-               } else {
-                       // Disabled
                }
        }
 
-       function __destruct() {
-               $this->flush();
+       /**
+        * @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 );
+                       }
+               }
        }
 }