113 lines
		
	
	
		
			1.9 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
			
		
		
	
	
			113 lines
		
	
	
		
			1.9 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
<?php declare(strict_types = 1);
 | 
						|
/**
 | 
						|
 * Container for data collectors.
 | 
						|
 *
 | 
						|
 * @package query-monitor
 | 
						|
 */
 | 
						|
 | 
						|
if ( ! class_exists( 'QM_Collectors' ) ) {
 | 
						|
/**
 | 
						|
 * @implements \IteratorAggregate<string, QM_Collector>
 | 
						|
 */
 | 
						|
class QM_Collectors implements IteratorAggregate {
 | 
						|
 | 
						|
	/**
 | 
						|
	 * @var array<string, QM_Collector>
 | 
						|
	 */
 | 
						|
	private $items = array();
 | 
						|
 | 
						|
	/**
 | 
						|
	 * @var boolean
 | 
						|
	 */
 | 
						|
	private $processed = false;
 | 
						|
 | 
						|
	/**
 | 
						|
	 * @return ArrayIterator<string, QM_Collector>
 | 
						|
	 */
 | 
						|
	#[\ReturnTypeWillChange]
 | 
						|
	public function getIterator() {
 | 
						|
		return new ArrayIterator( $this->items );
 | 
						|
	}
 | 
						|
 | 
						|
	/**
 | 
						|
	 * @param QM_Collector $collector
 | 
						|
	 * @return void
 | 
						|
	 */
 | 
						|
	public static function add( QM_Collector $collector ) {
 | 
						|
		$collectors = self::init();
 | 
						|
 | 
						|
		$collector->set_up();
 | 
						|
 | 
						|
		$collectors->items[ $collector->id ] = $collector;
 | 
						|
	}
 | 
						|
 | 
						|
	/**
 | 
						|
	 * Fetches a collector instance.
 | 
						|
	 *
 | 
						|
	 * @param string $id The collector ID.
 | 
						|
	 * @return QM_Collector|null The collector object.
 | 
						|
	 */
 | 
						|
	public static function get( $id ) {
 | 
						|
		$collectors = self::init();
 | 
						|
 | 
						|
		return $collectors->items[ $id ] ?? null;
 | 
						|
	}
 | 
						|
 | 
						|
	/**
 | 
						|
	 * @return self
 | 
						|
	 */
 | 
						|
	public static function init() {
 | 
						|
		static $instance;
 | 
						|
 | 
						|
		if ( ! $instance ) {
 | 
						|
			$instance = new QM_Collectors();
 | 
						|
		}
 | 
						|
 | 
						|
		return $instance;
 | 
						|
 | 
						|
	}
 | 
						|
 | 
						|
	/**
 | 
						|
	 * @return void
 | 
						|
	 */
 | 
						|
	public function process() {
 | 
						|
		if ( $this->processed ) {
 | 
						|
			return;
 | 
						|
		}
 | 
						|
 | 
						|
		foreach ( $this as $collector ) {
 | 
						|
			$collector->tear_down();
 | 
						|
 | 
						|
			$timer = new QM_Timer();
 | 
						|
			$timer->start();
 | 
						|
 | 
						|
			$collector->process();
 | 
						|
			$collector->process_concerns();
 | 
						|
 | 
						|
			$collector->set_timer( $timer->stop() );
 | 
						|
		}
 | 
						|
 | 
						|
		foreach ( $this as $collector ) {
 | 
						|
			$collector->post_process();
 | 
						|
		}
 | 
						|
 | 
						|
		$this->processed = true;
 | 
						|
	}
 | 
						|
 | 
						|
	/**
 | 
						|
	 * @return void
 | 
						|
	 */
 | 
						|
	public static function cease() {
 | 
						|
		$collectors = self::init();
 | 
						|
 | 
						|
		$collectors->processed = true;
 | 
						|
 | 
						|
		/** @var QM_Collector $collector */
 | 
						|
		foreach ( $collectors as $collector ) {
 | 
						|
			$collector->tear_down();
 | 
						|
			$collector->discard_data();
 | 
						|
		}
 | 
						|
	}
 | 
						|
}
 | 
						|
}
 |