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();
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}
|