widget-command/inc/class-command.php

273 lines
5.6 KiB
PHP
Raw Normal View History

2016-07-25 07:36:55 -07:00
<?php
2016-08-26 06:13:19 -07:00
namespace runcommand\Profile;
use WP_CLI;
use WP_CLI\Utils;
class Command {
2016-07-25 07:36:55 -07:00
/**
2016-10-04 06:49:18 -07:00
* Profile each stage of the WordPress load process (bootstrap, main_query, template).
2016-07-25 07:36:55 -07:00
*
* ## OPTIONS
*
* [<stage>]
2016-08-27 07:05:35 -07:00
* : Drill down into a specific stage.
*
2016-10-07 15:45:48 -07:00
* [--all]
* : Expand upon all stages.
*
* [--url=<url>]
* : Execute a request against a specified URL. Defaults to the home URL.
2016-08-25 07:00:39 -07:00
*
2016-07-25 10:17:10 -07:00
* [--fields=<fields>]
2016-10-19 05:27:31 -07:00
* : Limit the output to specific fields. Default is all fields.
2016-07-25 08:00:59 -07:00
*
* [--format=<format>]
* : Render output in a particular format.
* ---
* default: table
* options:
* - table
* - json
* - yaml
* - csv
* ---
*
2016-07-25 07:36:55 -07:00
* @when before_wp_load
*/
public function stage( $args, $assoc_args ) {
2016-07-25 08:10:43 -07:00
global $wpdb;
$focus = Utils\get_flag_value( $assoc_args, 'all', isset( $args[0] ) ? $args[0] : null );
$valid_stages = array( 'bootstrap', 'main_query', 'template' );
if ( $focus && ( true !== $focus && ! in_array( $focus, $valid_stages, true ) ) ) {
2016-10-07 15:45:48 -07:00
WP_CLI::error( 'Invalid stage. Must be one of ' . implode( ', ', $valid_stages ) . ', or use --all.' );
}
$profiler = new Profiler( 'stage', $focus );
2016-10-08 06:37:41 -07:00
$profiler->run();
if ( $focus ) {
2016-08-26 07:05:20 -07:00
$fields = array(
'hook',
'callback_count',
2016-08-26 13:00:32 -07:00
'time',
2016-08-26 13:19:09 -07:00
'query_time',
'query_count',
2016-08-26 14:58:37 -07:00
'cache_ratio',
2016-08-26 13:19:09 -07:00
'cache_hits',
'cache_misses',
'request_time',
'request_count',
);
} else {
$fields = array(
2016-08-27 07:05:35 -07:00
'stage',
2016-08-26 13:00:32 -07:00
'time',
2016-08-26 13:19:09 -07:00
'query_time',
'query_count',
2016-08-26 14:58:37 -07:00
'cache_ratio',
2016-08-26 13:19:09 -07:00
'cache_hits',
'cache_misses',
'hook_time',
'hook_count',
'request_time',
'request_count',
);
2016-07-25 10:17:10 -07:00
}
2016-08-26 07:05:20 -07:00
$formatter = new Formatter( $assoc_args, $fields );
2016-10-08 06:37:41 -07:00
$formatter->display_items( $profiler->get_loggers() );
}
/**
* Profile key metrics for WordPress hooks (actions and filters).
*
* In order to profile callbacks on a specific hook, the action or filter
* will need to execute during the course of the request.
*
* ## OPTIONS
*
* [<hook>]
* : Drill into key metrics of callbacks on a specific WordPress hook.
*
* [--all]
* : Profile callbacks for all WordPress hooks.
*
* [--url=<url>]
* : Execute a request against a specified URL. Defaults to the home URL.
*
* [--fields=<fields>]
* : Display one or more fields.
*
* [--format=<format>]
* : Render output in a particular format.
* ---
* default: table
* options:
* - table
* - json
* - yaml
* - csv
* ---
*
* @when before_wp_load
*/
public function hook( $args, $assoc_args ) {
$focus = Utils\get_flag_value( $assoc_args, 'all', isset( $args[0] ) ? $args[0] : null );
2016-10-08 06:37:41 -07:00
$profiler = new Profiler( 'hook', $focus );
$profiler->run();
2016-10-04 14:10:27 -07:00
// 'shutdown' won't actually fire until script completion
// but we can mock it
2016-10-08 06:37:41 -07:00
if ( 'shutdown' === $focus ) {
2016-10-04 14:10:27 -07:00
do_action( 'shutdown' );
remove_all_actions( 'shutdown' );
}
if ( $focus ) {
$base = array( 'callback', 'location' );
} else {
$base = array( 'hook', 'callback_count' );
}
$metrics = array(
'time',
'query_time',
'query_count',
'cache_ratio',
'cache_hits',
'cache_misses',
'request_time',
'request_count',
);
$fields = array_merge( $base, $metrics );
$formatter = new Formatter( $assoc_args, $fields );
2016-10-08 06:37:41 -07:00
$formatter->display_items( $profiler->get_loggers() );
}
/**
* Profile arbitrary code execution.
*
* Code execution happens after WordPress has loaded entirely, which means
* you can use any utilities defined in WordPress, active plugins, or the
* current theme.
*
* ## OPTIONS
*
* <php-code>
* : The code to execute, as a string.
*
* [--fields=<fields>]
* : Display one or more fields.
*
* [--format=<format>]
* : Render output in a particular format.
* ---
* default: table
* options:
* - table
* - json
* - yaml
* - csv
* ---
*
* @when before_wp_load
* @subcommand eval
*/
public function eval_( $args, $assoc_args ) {
2016-10-08 06:37:41 -07:00
$profiler = new Profiler( false, false );
$profiler->run();
$logger = new Logger();
$logger->start();
eval( $args[0] );
$logger->stop();
$fields = array(
'time',
'query_time',
'query_count',
'cache_ratio',
'cache_hits',
'cache_misses',
'request_time',
'request_count',
);
$formatter = new Formatter( $assoc_args, $fields );
$formatter->display_items( array( $logger ) );
}
/**
* Profile execution of an arbitrary file.
*
* File execution happens after WordPress has loaded entirely, which means
* you can use any utilities defined in WordPress, active plugins, or the
* current theme.
*
* ## OPTIONS
*
* <file>
* : The path to the PHP file to execute and profile.
*
* [--fields=<fields>]
* : Display one or more fields.
*
* [--format=<format>]
* : Render output in a particular format.
* ---
* default: table
* options:
* - table
* - json
* - yaml
* - csv
* ---
*
* @when before_wp_load
* @subcommand eval-file
*/
public function eval_file( $args, $assoc_args ) {
$file = $args[0];
if ( ! file_exists( $file ) ) {
WP_CLI::error( "'$file' does not exist." );
}
2016-10-08 06:37:41 -07:00
$profiler = new Profiler( false, false );
$profiler->run();
$logger = new Logger();
$logger->start();
self::include_file( $file );
$logger->stop();
$fields = array(
'time',
'query_time',
'query_count',
'cache_ratio',
'cache_hits',
'cache_misses',
'request_time',
'request_count',
);
$formatter = new Formatter( $assoc_args, $fields );
$formatter->display_items( array( $logger ) );
}
/**
* Include a file without exposing it to current scope
*
* @param string $file
*/
private static function include_file( $file ) {
include( $file );
}
2016-07-25 07:36:55 -07:00
}