Completed
Push — add/https-heartbeat ( 21cfb7 )
by
unknown
16:53
created

Jetpack_Heartbeat   A

Complexity

Total Complexity 25

Size/Duplication

Total Lines 158
Duplicated Lines 0 %

Coupling/Cohesion

Components 2
Dependencies 2
Metric Value
wmc 25
lcom 2
cbo 2
dl 0
loc 158
rs 10

6 Methods

Rating   Name   Duplication   Size   Complexity  
A init() 0 7 2
A __construct() 0 18 4
B cron_exec() 0 40 4
D generate_stats_array() 0 42 12
A jetpack_xmlrpc_methods() 0 4 1
A deactivate() 0 9 2
1
<?php
2
3
class Jetpack_Heartbeat {
4
5
	/**
6
	 * Holds the singleton instance of this class
7
	 *
8
	 * @since 2.3.3
9
	 * @var Jetpack_Heartbeat
10
	 */
11
	private static $instance = false;
12
13
	private $cron_name = 'jetpack_v2_heartbeat';
14
15
	/**
16
	 * Singleton
17
	 *
18
	 * @since 2.3.3
19
	 * @static
20
	 * @return Jetpack_Heartbeat
21
	 */
22
	public static function init() {
23
		if ( ! self::$instance ) {
24
			self::$instance = new Jetpack_Heartbeat;
25
		}
26
27
		return self::$instance;
28
	}
29
30
	/**
31
	 * Constructor for singleton
32
	 *
33
	 * @since 2.3.3
34
	 * @return Jetpack_Heartbeat
0 ignored issues
show
Comprehensibility Best Practice introduced by
Adding a @return annotation to constructors is generally not recommended as a constructor does not have a meaningful return value.

Adding a @return annotation to a constructor is not recommended, since a constructor does not have a meaningful return value.

Please refer to the PHP core documentation on constructors.

Loading history...
35
	 */
36
	private function __construct() {
37
		if ( ! Jetpack::is_active() )
38
			return;
39
40
		// Schedule the task
41
		add_action( $this->cron_name, array( $this, 'cron_exec' ) );
42
43
		if ( ! wp_next_scheduled( $this->cron_name ) ) {
44
			// Deal with the old pre-3.0 weekly one.
45
			if ( $timestamp = wp_next_scheduled( 'jetpack_heartbeat' ) ) {
46
				wp_unschedule_event( $timestamp, 'jetpack_heartbeat' );
47
			}
48
49
			wp_schedule_event( time(), 'daily', $this->cron_name );
50
		}
51
52
		add_filter( 'jetpack_xmlrpc_methods', array( __CLASS__, 'jetpack_xmlrpc_methods' ) );
53
	}
54
55
	/**
56
	 * Method that gets executed on the wp-cron call
57
	 *
58
	 * @since 2.3.3
59
	 * @global string $wp_version
60
	 */
61
	public function cron_exec() {
62
63
		$jetpack = Jetpack::init();
64
65
		/*
66
		 * This should run daily.  Figuring in for variances in
67
		 * WP_CRON, don't let it run more than every 23 hours at most.
68
		 *
69
		 * i.e. if it ran less than 23 hours ago, fail out.
70
		 */
71
		$last = (int) Jetpack_Options::get_option( 'last_heartbeat' );
72
		if ( $last && ( $last + DAY_IN_SECONDS - HOUR_IN_SECONDS > time() ) ) {
73
			return;
74
		}
75
76
		/*
77
		 * Check for an identity crisis
78
		 *
79
		 * If one exists:
80
		 * - Bump stat for ID crisis
81
		 * - Email site admin about potential ID crisis
82
		 */
83
84
		// Coming Soon!
85
86
		foreach ( self::generate_stats_array( 'v2-' ) as $key => $value ) {
87
			$jetpack->stat( $key, $value );
88
		}
89
90
		Jetpack_Options::update_option( 'last_heartbeat', time() );
91
92
		$jetpack->do_stats( 'server_side' );
93
94
		/**
95
		 * Fires when we synchronize all registered options on heartbeat.
96
		 *
97
		 * @since 3.3.0
98
		 */
99
		do_action( 'jetpack_heartbeat' );
100
	}
101
102
	public static function generate_stats_array( $prefix = '' ) {
103
		$return = array();
104
105
		$return["{$prefix}version"]        = JETPACK__VERSION;
106
		$return["{$prefix}wp-version"]     = get_bloginfo( 'version' );
107
		$return["{$prefix}php-version"]    = PHP_VERSION;
108
		$return["{$prefix}branch"]         = floatval( JETPACK__VERSION );
109
		$return["{$prefix}wp-branch"]      = floatval( get_bloginfo( 'version' ) );
110
		$return["{$prefix}php-branch"]     = floatval( PHP_VERSION );
111
		$return["{$prefix}public"]         = Jetpack_Options::get_option( 'public' );
112
		$return["{$prefix}ssl"]            = Jetpack::permit_ssl();
113
		$return["{$prefix}language"]       = get_bloginfo( 'language' );
114
		$return["{$prefix}charset"]        = get_bloginfo( 'charset' );
115
		$return["{$prefix}is-multisite"]   = is_multisite() ? 'multisite' : 'singlesite';
116
		$return["{$prefix}is-https"]       = is_ssl() ? 'https' : 'http';
117
		$return["{$prefix}identitycrisis"] = Jetpack::check_identity_crisis( 1 ) ? 'yes' : 'no';
0 ignored issues
show
Documentation introduced by
1 is of type integer, but the function expects a boolean.

It seems like the type of the argument is not accepted by the function/method which you are calling.

In some cases, in particular if PHP’s automatic type-juggling kicks in this might be fine. In other cases, however this might be a bug.

We suggest to add an explicit type cast like in the following example:

function acceptsInteger($int) { }

$x = '123'; // string "123"

// Instead of
acceptsInteger($x);

// we recommend to use
acceptsInteger((integer) $x);
Loading history...
118
		$return["{$prefix}plugins"]        = implode( ',', Jetpack::get_active_plugins() );
119
120
		$return["{$prefix}single-user-site"]= Jetpack::is_single_user_site();
0 ignored issues
show
Coding Style introduced by
Equals sign not aligned correctly; expected 1 space but found 0 spaces

This check looks for improperly formatted assignments.

Every assignment must have exactly one space before and one space after the equals operator.

To illustrate:

$a = "a";
$ab = "ab";
$abc = "abc";

will have no issues, while

$a   = "a";
$ab  = "ab";
$abc = "abc";

will report issues in lines 1 and 2.

Loading history...
121
122
		$return["{$prefix}manage-enabled"] = Jetpack::is_module_active( 'manage' );
123
124
		// is-multi-network can have three values, `single-site`, `single-network`, and `multi-network`
125
		$return["{$prefix}is-multi-network"] = 'single-site';
126
		if ( is_multisite() ) {
127
			$return["{$prefix}is-multi-network"] = Jetpack::is_multi_network() ? 'multi-network' : 'single-network';
128
		}
129
130
		if ( ! empty( $_SERVER['SERVER_ADDR'] ) || ! empty( $_SERVER['LOCAL_ADDR'] ) ) {
131
			$ip     = ! empty( $_SERVER['SERVER_ADDR'] ) ? $_SERVER['SERVER_ADDR'] : $_SERVER['LOCAL_ADDR'];
132
			$ip_arr = array_map( 'intval', explode( '.', $ip ) );
133
			if ( 4 == count( $ip_arr ) ) {
134
				$return["{$prefix}ip-2-octets"] = implode( '.', array_slice( $ip_arr, 0, 2 ) );
135
			}
136
		}
137
138
		foreach ( Jetpack::get_available_modules() as $slug ) {
139
			$return["{$prefix}module-{$slug}"] = Jetpack::is_module_active( $slug ) ? 'on' : 'off';
140
		}
141
142
		return $return;
143
	}
144
145
	public static function jetpack_xmlrpc_methods( $methods ) {
146
		$methods['jetpack.getHeartbeatData'] = array( __CLASS__, 'generate_stats_array' );
147
		return $methods;
148
	}
149
150
	public function deactivate() {
151
		// Deal with the old pre-3.0 weekly one.
152
		if ( $timestamp = wp_next_scheduled( 'jetpack_heartbeat' ) ) {
153
			wp_unschedule_event( $timestamp, 'jetpack_heartbeat' );
154
		}
155
156
		$timestamp = wp_next_scheduled( $this->cron_name );
157
		wp_unschedule_event( $timestamp, $this->cron_name );
158
	}
159
160
}
1 ignored issue
show
Coding Style introduced by
According to PSR2, the closing brace of classes should be placed on the next line directly after the body.

Below you find some examples:

// Incorrect placement according to PSR2
class MyClass
{
    public function foo()
    {

    }
    // This blank line is not allowed.

}

// Correct
class MyClass
{
    public function foo()
    {

    } // No blank lines after this line.
}
Loading history...
161