Completed
Push — branch-3.8 ( ee324b...b1dba8 )
by
unknown
32:49 queued 16:32
created

Jetpack_Heartbeat::__construct()   A

Complexity

Conditions 4
Paths 4

Size

Total Lines 18
Code Lines 9

Duplication

Lines 0
Ratio 0 %
Metric Value
dl 0
loc 18
rs 9.2
nc 4
cc 4
eloc 9
nop 0
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}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...
117
		$return["{$prefix}plugins"]        = implode( ',', Jetpack::get_active_plugins() );
118
119
		$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...
120
121
		$return["{$prefix}manage-enabled"] = Jetpack::is_module_active( 'manage' );
122
123
		// is-multi-network can have three values, `single-site`, `single-network`, and `multi-network`
124
		$return["{$prefix}is-multi-network"] = 'single-site';
125
		if ( is_multisite() ) {
126
			$return["{$prefix}is-multi-network"] = Jetpack::is_multi_network() ? 'multi-network' : 'single-network';
127
		}
128
129
		if ( ! empty( $_SERVER['SERVER_ADDR'] ) || ! empty( $_SERVER['LOCAL_ADDR'] ) ) {
130
			$ip     = ! empty( $_SERVER['SERVER_ADDR'] ) ? $_SERVER['SERVER_ADDR'] : $_SERVER['LOCAL_ADDR'];
131
			$ip_arr = array_map( 'intval', explode( '.', $ip ) );
132
			if ( 4 == count( $ip_arr ) ) {
133
				$return["{$prefix}ip-2-octets"] = implode( '.', array_slice( $ip_arr, 0, 2 ) );
134
			}
135
		}
136
137
		foreach ( Jetpack::get_available_modules() as $slug ) {
138
			$return["{$prefix}module-{$slug}"] = Jetpack::is_module_active( $slug ) ? 'on' : 'off';
139
		}
140
141
		return $return;
142
	}
143
144
	public static function jetpack_xmlrpc_methods( $methods ) {
145
		$methods['jetpack.getHeartbeatData'] = array( __CLASS__, 'generate_stats_array' );
146
		return $methods;
147
	}
148
149
	public function deactivate() {
150
		// Deal with the old pre-3.0 weekly one.
151
		if ( $timestamp = wp_next_scheduled( 'jetpack_heartbeat' ) ) {
152
			wp_unschedule_event( $timestamp, 'jetpack_heartbeat' );
153
		}
154
155
		$timestamp = wp_next_scheduled( $this->cron_name );
156
		wp_unschedule_event( $timestamp, $this->cron_name );
157
	}
158
159
}
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...
160