Version Description
Fix a few bugs reported by users. Upgrading is optional if this plugin is working well for you.
Download this release
Release Info
Developer | StarfieldTech |
Plugin | P3 (Plugin Performance Profiler) |
Version | 1.1.2 |
Comparing to | |
See all releases |
Code changes from version 1.1.1 to 1.1.2
- .htaccess +0 -1
- class.p3-profile-reader.php +1 -1
- class.p3-profile-table.php +1 -5
- class.p3-profiler.php +13 -6
- css/p3.css +25 -1
- p3-profiler.php +99 -22
- readme.txt +13 -1
- templates/callouts.php +44 -12
- templates/help.php +46 -8
- templates/template.php +24 -42
- templates/view-scan.php +54 -54
.htaccess
DELETED
@@ -1 +0,0 @@
|
|
1 |
-
Options -Indexes
|
|
class.p3-profile-reader.php
CHANGED
@@ -335,7 +335,7 @@ if ( !defined('P3_PATH') )
|
|
335 |
* @return string
|
336 |
*/
|
337 |
private function _get_theme_name( $theme ) {
|
338 |
-
if ( function_exists( 'get_theme_data' ) ) {
|
339 |
$theme_info = get_theme_data( WP_CONTENT_DIR . '/themes/' . $theme . '/style.css' );
|
340 |
if ( !empty( $theme_info ) && !empty( $theme_info['Name'] ) ) {
|
341 |
return $theme_info['Name'];
|
335 |
* @return string
|
336 |
*/
|
337 |
private function _get_theme_name( $theme ) {
|
338 |
+
if ( function_exists( 'get_theme_data' ) && file_exists( WP_CONTENT_DIR . '/themes/' . $theme . '/style.css' ) ) {
|
339 |
$theme_info = get_theme_data( WP_CONTENT_DIR . '/themes/' . $theme . '/style.css' );
|
340 |
if ( !empty( $theme_info ) && !empty( $theme_info['Name'] ) ) {
|
341 |
return $theme_info['Name'];
|
class.p3-profile-table.php
CHANGED
@@ -217,11 +217,7 @@ EOD;
|
|
217 |
}
|
218 |
}
|
219 |
$count = count( $_REQUEST['scan'] );
|
220 |
-
|
221 |
-
$p3_profiler_plugin->add_notice( "Deleted $count scan." );
|
222 |
-
} else {
|
223 |
-
$p3_profiler_plugin->add_notice( "Deleted $count scans." );
|
224 |
-
}
|
225 |
}
|
226 |
}
|
227 |
|
217 |
}
|
218 |
}
|
219 |
$count = count( $_REQUEST['scan'] );
|
220 |
+
printf('<div id="updated"><p>Deleted %d %s.</p></div>', $count, ($count == 1) ? 'scan' : 'scans' );
|
|
|
|
|
|
|
|
|
221 |
}
|
222 |
}
|
223 |
|
class.p3-profiler.php
CHANGED
@@ -129,7 +129,7 @@ class P3_Profiler {
|
|
129 |
return $this;
|
130 |
}
|
131 |
$found = false;
|
132 |
-
foreach ( (array) $p3_json as $
|
133 |
if ( 0 === strpos( $_SERVER['REQUEST_URI'], $v->site_url ) && preg_match( '/' . $v->ip . '/', $this->get_ip() ) ) {
|
134 |
$found = true;
|
135 |
break;
|
@@ -140,8 +140,8 @@ class P3_Profiler {
|
|
140 |
}
|
141 |
|
142 |
// Kludge memory limit / time limit
|
143 |
-
ini_set( 'memory_limit', '128M' );
|
144 |
-
set_time_limit( 90 );
|
145 |
|
146 |
// Set the profile file
|
147 |
$this->_profile_filename = $v->name . '.json';
|
@@ -310,6 +310,13 @@ class P3_Profiler {
|
|
310 |
} else {
|
311 |
$file = $_SERVER['SCRIPT_FILENAME'];
|
312 |
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
313 |
unset( $bt );
|
314 |
|
315 |
// Is it a plugin?
|
@@ -534,7 +541,7 @@ class P3_Profiler {
|
|
534 |
( FALSE !== strpos( $_SERVER['SCRIPT_FILENAME'], '/themes/' ) || FALSE !== stripos( $_SERVER['SCRIPT_FILENAME'], '\\themes\\' ) ) &&
|
535 |
(
|
536 |
FALSE !== strpos( $_SERVER['SCRIPT_FILENAME'], '/' . basename( WP_CONTENT_DIR ) . '/' ) ||
|
537 |
-
FALSE !== stripos( $
|
538 |
)
|
539 |
) {
|
540 |
$this->_profile['runtime'] = array(
|
@@ -601,7 +608,7 @@ class P3_Profiler {
|
|
601 |
if ( !empty( $_SERVER['REQUEST_URI'] ) ) {
|
602 |
$file = '';
|
603 |
$query_string = '';
|
604 |
-
$path = $_SERVER['REQUEST_URI'];
|
605 |
} else {
|
606 |
$file = '';
|
607 |
if ( !empty( $_SERVER['SCRIPT_NAME'] ) ) {
|
@@ -615,7 +622,7 @@ class P3_Profiler {
|
|
615 |
}
|
616 |
$query_string = '';
|
617 |
if ( !empty( $_SERVER['QUERY_STRING'] ) ) {
|
618 |
-
$query_string = '?' . $_SERVER['QUERY_STRING'];
|
619 |
}
|
620 |
}
|
621 |
return $protocol.$domain.$file.$path.$query_string;
|
129 |
return $this;
|
130 |
}
|
131 |
$found = false;
|
132 |
+
foreach ( (array) $p3_json as $v ) {
|
133 |
if ( 0 === strpos( $_SERVER['REQUEST_URI'], $v->site_url ) && preg_match( '/' . $v->ip . '/', $this->get_ip() ) ) {
|
134 |
$found = true;
|
135 |
break;
|
140 |
}
|
141 |
|
142 |
// Kludge memory limit / time limit
|
143 |
+
@ini_set( 'memory_limit', '128M' );
|
144 |
+
@set_time_limit( 90 );
|
145 |
|
146 |
// Set the profile file
|
147 |
$this->_profile_filename = $v->name . '.json';
|
310 |
} else {
|
311 |
$file = $_SERVER['SCRIPT_FILENAME'];
|
312 |
}
|
313 |
+
|
314 |
+
// Check for "eval()'d code"
|
315 |
+
if ( strpos( $file, "eval()'d" ) ) {
|
316 |
+
list($file, $junk) = explode(': eval(', $str, 2);
|
317 |
+
$file = preg_replace('/\(\d*\)$/', '', $file);
|
318 |
+
}
|
319 |
+
|
320 |
unset( $bt );
|
321 |
|
322 |
// Is it a plugin?
|
541 |
( FALSE !== strpos( $_SERVER['SCRIPT_FILENAME'], '/themes/' ) || FALSE !== stripos( $_SERVER['SCRIPT_FILENAME'], '\\themes\\' ) ) &&
|
542 |
(
|
543 |
FALSE !== strpos( $_SERVER['SCRIPT_FILENAME'], '/' . basename( WP_CONTENT_DIR ) . '/' ) ||
|
544 |
+
FALSE !== stripos( $_SERVER['SCRIPT_FILENAME'], '\\' . basename( WP_CONTENT_DIR ) . '\\' )
|
545 |
)
|
546 |
) {
|
547 |
$this->_profile['runtime'] = array(
|
608 |
if ( !empty( $_SERVER['REQUEST_URI'] ) ) {
|
609 |
$file = '';
|
610 |
$query_string = '';
|
611 |
+
$path = preg_replace( '/[?&]P3_NOCACHE=[a-zA-Z0-9]+/', '', $_SERVER['REQUEST_URI'] );
|
612 |
} else {
|
613 |
$file = '';
|
614 |
if ( !empty( $_SERVER['SCRIPT_NAME'] ) ) {
|
622 |
}
|
623 |
$query_string = '';
|
624 |
if ( !empty( $_SERVER['QUERY_STRING'] ) ) {
|
625 |
+
$query_string = '?' . preg_replace( '/[?&]P3_NOCACHE=[a-zA-Z0-9]+/', '', $_SERVER['QUERY_STRING'] );
|
626 |
}
|
627 |
}
|
628 |
return $protocol.$domain.$file.$path.$query_string;
|
css/p3.css
CHANGED
@@ -277,7 +277,12 @@ p3-glossary-container {
|
|
277 |
/** Copyright notice **/
|
278 |
#p3-copyright {
|
279 |
text-align: center;
|
280 |
-
|
|
|
|
|
|
|
|
|
|
|
281 |
}
|
282 |
#p3-copyright img {
|
283 |
margin-bottom: 7px;
|
@@ -353,3 +358,22 @@ div.p3-question h2.p3-help-question {
|
|
353 |
margin-top: -15px;
|
354 |
border-bottom: 1px solid #cccccc;
|
355 |
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
277 |
/** Copyright notice **/
|
278 |
#p3-copyright {
|
279 |
text-align: center;
|
280 |
+
position: absolute;
|
281 |
+
float: left;
|
282 |
+
margin-top: 45px;
|
283 |
+
margin-left: -158px;
|
284 |
+
width: 315px;
|
285 |
+
left: 50%;
|
286 |
}
|
287 |
#p3-copyright img {
|
288 |
margin-bottom: 7px;
|
358 |
margin-top: -15px;
|
359 |
border-bottom: 1px solid #cccccc;
|
360 |
}
|
361 |
+
|
362 |
+
|
363 |
+
/** Did you liek this plugin? **/
|
364 |
+
div#p3-reminder {
|
365 |
+
position: relative;
|
366 |
+
z-index: 10;
|
367 |
+
float: left;
|
368 |
+
bottom: 0;
|
369 |
+
left: 0;
|
370 |
+
height: 75px;
|
371 |
+
width: 200px;
|
372 |
+
margin-top: 30px;
|
373 |
+
}
|
374 |
+
div#p3-reminder-wrapper {
|
375 |
+
border: 1px solid #eaeaea;
|
376 |
+
padding: 8px 4px 0px 4px;
|
377 |
+
text-align: center;
|
378 |
+
background-color: #f0f8fe;
|
379 |
+
}
|
p3-profiler.php
CHANGED
@@ -4,7 +4,7 @@ Plugin Name: P3 (Plugin Performance Profiler)
|
|
4 |
Plugin URI: http://support.godaddy.com/godaddy/wordpress-p3-plugin/
|
5 |
Description: See which plugins are slowing down your site. Create a profile of your WordPress site's plugins' performance by measuring their impact on your site's load time.
|
6 |
Author: GoDaddy.com
|
7 |
-
Version: 1.1.
|
8 |
Author URI: http://www.godaddy.com/
|
9 |
*/
|
10 |
|
@@ -73,7 +73,6 @@ register_activation_hook( P3_PATH . DIRECTORY_SEPARATOR . 'p3-profiler.php', arr
|
|
73 |
register_deactivation_hook( P3_PATH . DIRECTORY_SEPARATOR . 'p3-profiler.php', array( $p3_profiler_plugin, 'deactivate' ) );
|
74 |
register_uninstall_hook( P3_PATH . DIRECTORY_SEPARATOR . 'p3-profiler.php', array( 'P3_Profiler_Plugin', 'uninstall' ) );
|
75 |
if ( function_exists( 'is_multisite' ) && is_multisite() ) {
|
76 |
-
add_action( 'wpmu_add_blog', array( $p3_profiler_plugin, 'add_blog' ) );
|
77 |
add_action( 'wpmu_delete_blog', array( $p3_profiler_plugin, 'delete_blog' ) );
|
78 |
}
|
79 |
|
@@ -91,7 +90,25 @@ class P3_Profiler_Plugin {
|
|
91 |
* @var P3_Profile_Table
|
92 |
*/
|
93 |
public $scan_table = null;
|
|
|
|
|
|
|
|
|
|
|
|
|
94 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
95 |
/**
|
96 |
* Remove the admin bar from the customer site when profiling is enabled
|
97 |
* to prevent skewing the numbers, as much as possible. Also prevent ssl
|
@@ -207,9 +224,47 @@ class P3_Profiler_Plugin {
|
|
207 |
|
208 |
// Only for our page
|
209 |
if ( isset( $_REQUEST['page'] ) && basename( __FILE__ ) == $_REQUEST['page'] ) {
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
210 |
// Load the list table, let it handle any bulk actions
|
211 |
-
$this->
|
212 |
-
|
|
|
|
|
213 |
|
214 |
// Usability message
|
215 |
if ( !defined( 'WPP_PROFILING_STARTED' ) ) {
|
@@ -221,15 +276,10 @@ class P3_Profiler_Plugin {
|
|
221 |
/**
|
222 |
* Dispatcher function. All requests enter through here
|
223 |
* and are routed based upon the p3_action request variable
|
224 |
-
* @uses $_REQUEST['p3_action']
|
225 |
* @return void
|
226 |
*/
|
227 |
public function dispatcher() {
|
228 |
-
$
|
229 |
-
if ( ! empty ( $_REQUEST ['p3_action'] ) ) {
|
230 |
-
$p3_action = $_REQUEST ['p3_action'];
|
231 |
-
}
|
232 |
-
switch ( $p3_action ) {
|
233 |
case 'list-scans' :
|
234 |
$this->list_scans();
|
235 |
break;
|
@@ -249,6 +299,29 @@ class P3_Profiler_Plugin {
|
|
249 |
$this->scan_settings_page();
|
250 |
}
|
251 |
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
252 |
|
253 |
/**
|
254 |
* Write .profiling_enabled file, uses request_filesystem_credentials, if
|
@@ -268,10 +341,12 @@ class P3_Profiler_Plugin {
|
|
268 |
|
269 |
// Ask for credentials, if necessary
|
270 |
if ( false === ( $creds = request_filesystem_credentials( $url, $method, false, false, $form_fields ) ) ) {
|
|
|
271 |
return true;
|
272 |
} elseif ( ! WP_Filesystem($creds) ) {
|
273 |
// The credentials are bad, ask again
|
274 |
request_filesystem_credentials( $url, $method, true, false, $form_fields );
|
|
|
275 |
return true;
|
276 |
} else {
|
277 |
// Once we get here, we should have credentials, do the file system operations
|
@@ -438,6 +513,7 @@ class P3_Profiler_Plugin {
|
|
438 |
|
439 |
// Save the new options
|
440 |
update_option( 'p3-profiler_disable_opcode_cache', 'true' == $_POST['p3_disable_opcode_cache'] );
|
|
|
441 |
update_option( 'p3-profiler_use_current_ip', 'true' == $_POST['p3_use_current_ip'] );
|
442 |
update_option( 'p3-profiler_ip_address', $_POST['p3_ip_address'] );
|
443 |
|
@@ -605,7 +681,7 @@ class P3_Profiler_Plugin {
|
|
605 |
public function show_notices() {
|
606 |
|
607 |
// Skip notices if we're fixing the flag file
|
608 |
-
if (
|
609 |
return true;
|
610 |
}
|
611 |
|
@@ -622,7 +698,7 @@ class P3_Profiler_Plugin {
|
|
622 |
}
|
623 |
|
624 |
// Check that we can write .profiling_enabled
|
625 |
-
if ( isset( $_REQUEST['page'] ) && basename( __FILE__ ) == $_REQUEST['page'] &&
|
626 |
if ( !file_exists( P3_FLAG_FILE ) || !is_writable( P3_FLAG_FILE ) ) {
|
627 |
@touch( P3_FLAG_FILE );
|
628 |
if ( !file_exists( P3_FLAG_FILE ) || !is_writable( P3_FLAG_FILE ) ) {
|
@@ -663,7 +739,7 @@ class P3_Profiler_Plugin {
|
|
663 |
|
664 |
// mu-plugins doesn't exist
|
665 |
if ( !file_exists( WPMU_PLUGIN_DIR ) && is_writable( WPMU_PLUGIN_DIR . '/../' ) ) {
|
666 |
-
|
667 |
}
|
668 |
if ( file_exists( WPMU_PLUGIN_DIR ) && is_writable( WPMU_PLUGIN_DIR ) ) {
|
669 |
file_put_contents(
|
@@ -754,6 +830,7 @@ class P3_Profiler_Plugin {
|
|
754 |
delete_option( 'p3-profiler_use_current_ip' );
|
755 |
delete_option( 'p3-profiler_ip_address' );
|
756 |
delete_option( 'p3-profiler_version' );
|
|
|
757 |
}
|
758 |
restore_current_blog();
|
759 |
} else {
|
@@ -764,6 +841,7 @@ class P3_Profiler_Plugin {
|
|
764 |
delete_option( 'p3-profiler_use_current_ip' );
|
765 |
delete_option( 'p3-profiler_ip_address' );
|
766 |
delete_option( 'p3-profiler_version' );
|
|
|
767 |
}
|
768 |
}
|
769 |
|
@@ -801,15 +879,7 @@ class P3_Profiler_Plugin {
|
|
801 |
$size /= pow( 1024, $pow );
|
802 |
return round( $size, 0 ) . ' ' . $units[$pow];
|
803 |
}
|
804 |
-
|
805 |
-
/**
|
806 |
-
* Actions to take when a multisite blog is added
|
807 |
-
* @return void
|
808 |
-
*/
|
809 |
-
public function add_blog() {
|
810 |
-
// Reserved for future use
|
811 |
-
}
|
812 |
-
|
813 |
/**
|
814 |
* Actions to take when a multisite blog is removed
|
815 |
* @return void
|
@@ -822,6 +892,7 @@ class P3_Profiler_Plugin {
|
|
822 |
delete_option( 'p3-profiler_use_current_ip' );
|
823 |
delete_option( 'p3-profiler_ip_address' );
|
824 |
delete_option( 'p3-profiler_version' );
|
|
|
825 |
}
|
826 |
|
827 |
/**
|
@@ -841,6 +912,12 @@ class P3_Profiler_Plugin {
|
|
841 |
update_option( 'p3-profiler_ip_address', '' );
|
842 |
update_option( 'p3-profiler_version', '1.1.0' );
|
843 |
}
|
|
|
|
|
|
|
|
|
|
|
|
|
844 |
|
845 |
// Ensure the profiles folder is there
|
846 |
$uploads_dir = wp_upload_dir();
|
4 |
Plugin URI: http://support.godaddy.com/godaddy/wordpress-p3-plugin/
|
5 |
Description: See which plugins are slowing down your site. Create a profile of your WordPress site's plugins' performance by measuring their impact on your site's load time.
|
6 |
Author: GoDaddy.com
|
7 |
+
Version: 1.1.2
|
8 |
Author URI: http://www.godaddy.com/
|
9 |
*/
|
10 |
|
73 |
register_deactivation_hook( P3_PATH . DIRECTORY_SEPARATOR . 'p3-profiler.php', array( $p3_profiler_plugin, 'deactivate' ) );
|
74 |
register_uninstall_hook( P3_PATH . DIRECTORY_SEPARATOR . 'p3-profiler.php', array( 'P3_Profiler_Plugin', 'uninstall' ) );
|
75 |
if ( function_exists( 'is_multisite' ) && is_multisite() ) {
|
|
|
76 |
add_action( 'wpmu_delete_blog', array( $p3_profiler_plugin, 'delete_blog' ) );
|
77 |
}
|
78 |
|
90 |
* @var P3_Profile_Table
|
91 |
*/
|
92 |
public $scan_table = null;
|
93 |
+
|
94 |
+
/**
|
95 |
+
* Name of the current scan being viewed
|
96 |
+
* @var string
|
97 |
+
*/
|
98 |
+
public $scan = '';
|
99 |
|
100 |
+
/**
|
101 |
+
* Current action
|
102 |
+
* @var string
|
103 |
+
*/
|
104 |
+
public $action = '';
|
105 |
+
|
106 |
+
/**
|
107 |
+
* Profile reader object
|
108 |
+
* @var P3_Profile_Reader
|
109 |
+
*/
|
110 |
+
public $profile = '';
|
111 |
+
|
112 |
/**
|
113 |
* Remove the admin bar from the customer site when profiling is enabled
|
114 |
* to prevent skewing the numbers, as much as possible. Also prevent ssl
|
224 |
|
225 |
// Only for our page
|
226 |
if ( isset( $_REQUEST['page'] ) && basename( __FILE__ ) == $_REQUEST['page'] ) {
|
227 |
+
|
228 |
+
// Set up the request based on p3_action
|
229 |
+
if ( !empty( $_REQUEST['p3_action'] ) ) {
|
230 |
+
$this->action = $_REQUEST['p3_action'];
|
231 |
+
}
|
232 |
+
if ( empty( $this->action ) || 'current-scan' == $this->action ) {
|
233 |
+
$this->scan = $this->get_latest_profile();
|
234 |
+
$this->action = 'current-scan';
|
235 |
+
} elseif ( 'view-scan' == $this->action ) {
|
236 |
+
$this->scan = '';
|
237 |
+
if ( !empty( $_REQUEST['name'] ) ) {
|
238 |
+
$this->scan = sanitize_file_name( basename( $_REQUEST['name'] ) );
|
239 |
+
}
|
240 |
+
if ( empty( $this->scan ) || !file_exists( P3_PROFILES_PATH . "/{$this->scan}" ) ) {
|
241 |
+
wp_die( '<div id="message" class="error"><p>Scan does not exist</p></div>' );
|
242 |
+
}
|
243 |
+
$this->scan = P3_PROFILES_PATH . "/{$this->scan}";
|
244 |
+
}
|
245 |
+
|
246 |
+
// If there's a scan, create a viewer object
|
247 |
+
if ( !empty( $this->scan ) ) {
|
248 |
+
try {
|
249 |
+
$this->profile = new P3_Profile_Reader( $this->scan );
|
250 |
+
} catch ( P3_Profile_No_Data_Exception $e ) {
|
251 |
+
echo '<div class="error"><p>' . $e->getMessage() . '</p></div>';
|
252 |
+
$this->scan = null;
|
253 |
+
$this->profile = null;
|
254 |
+
$this->action = 'list-scans';
|
255 |
+
} catch ( Exception $e ) {
|
256 |
+
wp_die( '<div id="message" class="error"><p>Error reading scan</p></div>' );
|
257 |
+
}
|
258 |
+
} else {
|
259 |
+
$this->profile = null;
|
260 |
+
}
|
261 |
+
|
262 |
+
|
263 |
// Load the list table, let it handle any bulk actions
|
264 |
+
if ( empty( $this->profile ) && in_array( $this->action, array( 'list-scans', 'current-scan' ) ) ) {
|
265 |
+
$this->scan_table = new P3_Profile_Table();
|
266 |
+
$this->scan_table->prepare_items();
|
267 |
+
}
|
268 |
|
269 |
// Usability message
|
270 |
if ( !defined( 'WPP_PROFILING_STARTED' ) ) {
|
276 |
/**
|
277 |
* Dispatcher function. All requests enter through here
|
278 |
* and are routed based upon the p3_action request variable
|
|
|
279 |
* @return void
|
280 |
*/
|
281 |
public function dispatcher() {
|
282 |
+
switch ( $this->action ) {
|
|
|
|
|
|
|
|
|
283 |
case 'list-scans' :
|
284 |
$this->list_scans();
|
285 |
break;
|
299 |
$this->scan_settings_page();
|
300 |
}
|
301 |
}
|
302 |
+
|
303 |
+
/**
|
304 |
+
* Explain why P3 is asking for FTP credentials
|
305 |
+
* @return string
|
306 |
+
*/
|
307 |
+
public function fix_flag_file_help() {
|
308 |
+
?>
|
309 |
+
<div class="wrap">
|
310 |
+
<strong>Why am I being asked for this information?</strong>
|
311 |
+
<blockquote>
|
312 |
+
P3 cannot write to this file:<br />
|
313 |
+
<code><?php echo P3_FLAG_FILE; ?></code>
|
314 |
+
<br />
|
315 |
+
P3 needs to write to this file to toggle profiling for your site.
|
316 |
+
If you want to fix this manually, please ensure the file is readable
|
317 |
+
and writable by the web server.
|
318 |
+
</blockquote>
|
319 |
+
<div class="updated">
|
320 |
+
<p>P3 does <strong>not</strong> store or re-transmit this information.</p>
|
321 |
+
</div>
|
322 |
+
</div>
|
323 |
+
<?php
|
324 |
+
}
|
325 |
|
326 |
/**
|
327 |
* Write .profiling_enabled file, uses request_filesystem_credentials, if
|
341 |
|
342 |
// Ask for credentials, if necessary
|
343 |
if ( false === ( $creds = request_filesystem_credentials( $url, $method, false, false, $form_fields ) ) ) {
|
344 |
+
$this->fix_flag_file_help();
|
345 |
return true;
|
346 |
} elseif ( ! WP_Filesystem($creds) ) {
|
347 |
// The credentials are bad, ask again
|
348 |
request_filesystem_credentials( $url, $method, true, false, $form_fields );
|
349 |
+
$this->fix_flag_file_help();
|
350 |
return true;
|
351 |
} else {
|
352 |
// Once we get here, we should have credentials, do the file system operations
|
513 |
|
514 |
// Save the new options
|
515 |
update_option( 'p3-profiler_disable_opcode_cache', 'true' == $_POST['p3_disable_opcode_cache'] );
|
516 |
+
update_option( 'p3-profiler_cache_buster', 'true' == $_POST['p3_cache_buster'] );
|
517 |
update_option( 'p3-profiler_use_current_ip', 'true' == $_POST['p3_use_current_ip'] );
|
518 |
update_option( 'p3-profiler_ip_address', $_POST['p3_ip_address'] );
|
519 |
|
681 |
public function show_notices() {
|
682 |
|
683 |
// Skip notices if we're fixing the flag file
|
684 |
+
if ( 'fix-flag-file' == $this->action ) {
|
685 |
return true;
|
686 |
}
|
687 |
|
698 |
}
|
699 |
|
700 |
// Check that we can write .profiling_enabled
|
701 |
+
if ( isset( $_REQUEST['page'] ) && basename( __FILE__ ) == $_REQUEST['page'] && 'fix-flag-file' != $this->action ) {
|
702 |
if ( !file_exists( P3_FLAG_FILE ) || !is_writable( P3_FLAG_FILE ) ) {
|
703 |
@touch( P3_FLAG_FILE );
|
704 |
if ( !file_exists( P3_FLAG_FILE ) || !is_writable( P3_FLAG_FILE ) ) {
|
739 |
|
740 |
// mu-plugins doesn't exist
|
741 |
if ( !file_exists( WPMU_PLUGIN_DIR ) && is_writable( WPMU_PLUGIN_DIR . '/../' ) ) {
|
742 |
+
wp_mkdir_p( WPMU_PLUGIN_DIR );
|
743 |
}
|
744 |
if ( file_exists( WPMU_PLUGIN_DIR ) && is_writable( WPMU_PLUGIN_DIR ) ) {
|
745 |
file_put_contents(
|
830 |
delete_option( 'p3-profiler_use_current_ip' );
|
831 |
delete_option( 'p3-profiler_ip_address' );
|
832 |
delete_option( 'p3-profiler_version' );
|
833 |
+
delete_option( 'p3-profiler_cache_buster' );
|
834 |
}
|
835 |
restore_current_blog();
|
836 |
} else {
|
841 |
delete_option( 'p3-profiler_use_current_ip' );
|
842 |
delete_option( 'p3-profiler_ip_address' );
|
843 |
delete_option( 'p3-profiler_version' );
|
844 |
+
delete_option( 'p3-profiler_cache_buster' );
|
845 |
}
|
846 |
}
|
847 |
|
879 |
$size /= pow( 1024, $pow );
|
880 |
return round( $size, 0 ) . ' ' . $units[$pow];
|
881 |
}
|
882 |
+
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
883 |
/**
|
884 |
* Actions to take when a multisite blog is removed
|
885 |
* @return void
|
892 |
delete_option( 'p3-profiler_use_current_ip' );
|
893 |
delete_option( 'p3-profiler_ip_address' );
|
894 |
delete_option( 'p3-profiler_version' );
|
895 |
+
delete_option( 'p3-profiler_cache_buster' );
|
896 |
}
|
897 |
|
898 |
/**
|
912 |
update_option( 'p3-profiler_ip_address', '' );
|
913 |
update_option( 'p3-profiler_version', '1.1.0' );
|
914 |
}
|
915 |
+
|
916 |
+
// Upgrading from < 1.1.2
|
917 |
+
elseif ( version_compare( $version, '1.1.2') < 0 ) {
|
918 |
+
update_option( 'p3-profiler_cache_buster', true );
|
919 |
+
update_option( 'p3-profiler_version', '1.1.2' );
|
920 |
+
}
|
921 |
|
922 |
// Ensure the profiles folder is there
|
923 |
$uploads_dir = wp_upload_dir();
|
readme.txt
CHANGED
@@ -3,7 +3,7 @@ Contributors: Godaddy, StarfieldTech
|
|
3 |
Tags: debug, debugging, developer, development, performance, plugin, profiler, speed
|
4 |
Requires at least: 3.3
|
5 |
Tested up to: 3.3.1
|
6 |
-
Stable tag: 1.1.
|
7 |
|
8 |
See which plugins are slowing down your site. This plugin creates a performance report for your site.
|
9 |
|
@@ -43,6 +43,9 @@ Manual installation:
|
|
43 |
|
44 |
== Upgrade Notice ==
|
45 |
|
|
|
|
|
|
|
46 |
= 1.1.1 =
|
47 |
This release addresses a bug which which broke the UI on sites that used other plugins that contained an apostrophe in their name. Upgrading is recommended if you were affected by this bug.
|
48 |
|
@@ -64,6 +67,15 @@ Previous version of the plugin (before 1.1.0) did not have theme name detection
|
|
64 |
|
65 |
== Changelog ==
|
66 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
67 |
= 1.1.1 =
|
68 |
* Bugfix - Plugin names with apostrophes broke the UI
|
69 |
* Bugfix - Fix a deprecated warning with callt-ime pass by reference
|
3 |
Tags: debug, debugging, developer, development, performance, plugin, profiler, speed
|
4 |
Requires at least: 3.3
|
5 |
Tested up to: 3.3.1
|
6 |
+
Stable tag: 1.1.2
|
7 |
|
8 |
See which plugins are slowing down your site. This plugin creates a performance report for your site.
|
9 |
|
43 |
|
44 |
== Upgrade Notice ==
|
45 |
|
46 |
+
= 1.1.2 =
|
47 |
+
Fix a few bugs reported by users. Upgrading is optional if this plugin is working well for you.
|
48 |
+
|
49 |
= 1.1.1 =
|
50 |
This release addresses a bug which which broke the UI on sites that used other plugins that contained an apostrophe in their name. Upgrading is recommended if you were affected by this bug.
|
51 |
|
67 |
|
68 |
== Changelog ==
|
69 |
|
70 |
+
= 1.1.2 =
|
71 |
+
* Don't show screen options if there is no table
|
72 |
+
* Show a "rate us / tweet us" box
|
73 |
+
* Add an option to circumvent browser cache
|
74 |
+
* Bugfix - Properly work with encrypted plugins (eval based obfuscation)
|
75 |
+
* Bugfix - Work with suhosin/safe mode where ini_set / set_time_limit are disabled
|
76 |
+
* Bugfix - Remove "Options -Indexes" because it's causing 500 error in some apache setups
|
77 |
+
* Bugfix - Fix a warning with theme name detection if the theme is no longer installed
|
78 |
+
|
79 |
= 1.1.1 =
|
80 |
* Bugfix - Plugin names with apostrophes broke the UI
|
81 |
* Bugfix - Fix a deprecated warning with callt-ime pass by reference
|
templates/callouts.php
CHANGED
@@ -20,13 +20,35 @@ if ( !defined('P3_PATH') )
|
|
20 |
// Pause flag
|
21 |
paused: false,
|
22 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
23 |
// Start
|
24 |
start: function() {
|
25 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
26 |
// Form data
|
27 |
data = {
|
28 |
'p3_ip' : jQuery( '#p3-advanced-ip' ).val(),
|
29 |
'p3_disable_opcode_cache' : jQuery( '#p3-disable-opcode-cache' ).prop( 'checked' ),
|
|
|
30 |
'p3_scan_name' : jQuery( "#p3-scan-name" ).val(),
|
31 |
'action' : 'p3_start_scan',
|
32 |
'p3_nonce' : jQuery( "#p3_nonce" ).val()
|
@@ -83,6 +105,7 @@ if ( !defined('P3_PATH') )
|
|
83 |
data = {
|
84 |
'p3_ip' : jQuery( '#p3-advanced-ip' ).val(),
|
85 |
'p3_disable_opcode_cache' : jQuery( '#p3-disable-opcode-cache' ).prop( 'checked' ),
|
|
|
86 |
'p3_scan_name' : jQuery( "#p3-scan-name" ).val(),
|
87 |
'action' : 'p3_start_scan',
|
88 |
'p3_nonce' : jQuery( "#p3_nonce" ).val()
|
@@ -186,7 +209,7 @@ if ( !defined('P3_PATH') )
|
|
186 |
'resizable' : false,
|
187 |
'modal' : true,
|
188 |
'width' : 450,
|
189 |
-
'height' :
|
190 |
'title' : "Advanced Settings",
|
191 |
'buttons' :
|
192 |
[
|
@@ -201,6 +224,7 @@ if ( !defined('P3_PATH') )
|
|
201 |
'p3_disable_opcode_cache' : $( '#p3-disable-opcode-cache' ).prop( 'checked' ),
|
202 |
'p3_use_current_ip' : $( '#p3-use-current-ip' ).prop( 'checked' ),
|
203 |
'p3_ip_address' : $( '#p3-advanced-ip' ).val(),
|
|
|
204 |
'p3_nonce' : '<?php echo wp_create_nonce( 'p3_save_settings' ); ?>'
|
205 |
}
|
206 |
$.post( ajaxurl, data, function( response ) {
|
@@ -350,6 +374,7 @@ if ( !defined('P3_PATH') )
|
|
350 |
data = {
|
351 |
'p3_ip' : jQuery( '#p3-advanced-ip' ).val(),
|
352 |
'p3_disable_opcode_cache' : jQuery( '#p3-disable-opcode-cache' ).prop( 'checked' ),
|
|
|
353 |
'p3_scan_name' : jQuery( "#p3-scan-name" ).val(),
|
354 |
'action' : 'p3_start_scan',
|
355 |
'p3_nonce' : jQuery( "#p3_nonce" ).val()
|
@@ -421,7 +446,7 @@ if ( !defined('P3_PATH') )
|
|
421 |
jQuery( "#p3-progress-dialog" ).dialog( "close" );
|
422 |
|
423 |
// View the scan
|
424 |
-
location.href = "<?php echo add_query_arg( array( 'p3_action' => 'view-scan', 'current_scan' => '1' ) ); ?>&name=" + $( this ).attr( "data-scan-name" );
|
425 |
});
|
426 |
$( "#p3-view-incomplete-results-submit" ).click( function() {
|
427 |
$( "#p3-view-results-submit" ).trigger( "click" );
|
@@ -514,14 +539,14 @@ if ( !defined('P3_PATH') )
|
|
514 |
<!-- Second callout cell -->
|
515 |
<td class="p3-callout">
|
516 |
<div class="p3-callout-outer-wrapper qtip-tip" title="Total number of seconds dedicated to plugin code per visit on your site."
|
517 |
-
<?php if ( !empty( $scan ) ) { ?>title="From <?php echo basename( $scan ); ?><?php } ?>">
|
518 |
<div class="p3-callout-inner-wrapper">
|
519 |
<div class="p3-callout-caption">Plugin Load Time</div>
|
520 |
<div class="p3-callout-data">
|
521 |
-
<?php if ( null === $profile ) { ?>
|
522 |
<span class="p3-faded-grey">n/a</span>
|
523 |
<?php } else { ?>
|
524 |
-
<?php printf( '%.3f', $profile->averages['plugins'] ); ?>
|
525 |
<?php } ?>
|
526 |
</div>
|
527 |
<div class="p3-callout-caption">( sec. per visit )</div>
|
@@ -532,14 +557,14 @@ if ( !defined('P3_PATH') )
|
|
532 |
<!-- Third callout cell -->
|
533 |
<td class="p3-callout">
|
534 |
<div class="p3-callout-outer-wrapper qtip-tip" title="Percent of load time on your site dedicated to plugin code."
|
535 |
-
<?php if ( !empty( $scan ) ) { ?>title="From <?php echo basename( $scan ); ?><?php } ?>">
|
536 |
<div class="p3-callout-inner-wrapper">
|
537 |
<div class="p3-callout-caption">Plugin Impact</div>
|
538 |
<div class="p3-callout-data">
|
539 |
-
<?php if ( null === $profile ) { ?>
|
540 |
<span class="p3-faded-grey">n/a</span>
|
541 |
<?php } else { ?>
|
542 |
-
<?php printf( '%.1f%%', $profile->averages['plugin_impact'] ); ?>
|
543 |
<?php } ?>
|
544 |
</div>
|
545 |
<div class="p3-callout-caption">( of page load time )</div>
|
@@ -550,14 +575,14 @@ if ( !defined('P3_PATH') )
|
|
550 |
<!-- Fourth callout cell -->
|
551 |
<td class="p3-callout">
|
552 |
<div class="p3-callout-outer-wrapper qtip-tip" title="Total number of database queries per visit."
|
553 |
-
<?php if ( !empty( $scan ) ) { ?>title="From <?php echo basename( $scan ); ?><?php } ?>">
|
554 |
<div class="p3-callout-inner-wrapper">
|
555 |
<div class="p3-callout-caption">MySQL Queries</div>
|
556 |
<div class="p3-callout-data">
|
557 |
-
<?php if ( null === $profile ) { ?>
|
558 |
<span class="p3-faded-grey">n/a</span>
|
559 |
<?php } else { ?>
|
560 |
-
<?php echo round( $profile->averages['queries'] ); ?>
|
561 |
<?php } ?>
|
562 |
</div>
|
563 |
<div class="p3-callout-caption">per visit</div>
|
@@ -585,7 +610,14 @@ if ( !defined('P3_PATH') )
|
|
585 |
<label for="p3-disable-opcode-cache">Attempt to disable opcode caches <em>( recommended )</em></label>
|
586 |
<br />
|
587 |
<em class="p3-em">This can increase accuracy in plugin detection, but decrease accuracy in timing</em>
|
588 |
-
</div>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
589 |
</div>
|
590 |
|
591 |
<!-- Dialog for iframe scanner -->
|
20 |
// Pause flag
|
21 |
paused: false,
|
22 |
|
23 |
+
// Create a random string
|
24 |
+
random: function(length) {
|
25 |
+
var ret = "";
|
26 |
+
var alphabet = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";
|
27 |
+
for ( var i = 0 ; i < length ; i++ ) {
|
28 |
+
ret += alphabet.charAt( Math.floor( Math.random() * alphabet.length ) );
|
29 |
+
}
|
30 |
+
return ret;
|
31 |
+
},
|
32 |
+
|
33 |
// Start
|
34 |
start: function() {
|
35 |
|
36 |
+
// If cache busting is disabled, remove P3_NOCACHE from the pages
|
37 |
+
if ( jQuery( '#p3-cache-buster' ).prop( 'checked' ) ) {
|
38 |
+
for ( i = 0 ; i < P3_Scan.pages.length ; i++ ) {
|
39 |
+
if ( P3_Scan.pages[i].indexOf('?') > -1 ) {
|
40 |
+
P3_Scan.pages[i] += '&P3_NOCACHE=' + P3_Scan.random(8);
|
41 |
+
} else {
|
42 |
+
P3_Scan.pages[i] += '?P3_NOCACHE=' + P3_Scan.random(8);
|
43 |
+
}
|
44 |
+
}
|
45 |
+
}
|
46 |
+
|
47 |
// Form data
|
48 |
data = {
|
49 |
'p3_ip' : jQuery( '#p3-advanced-ip' ).val(),
|
50 |
'p3_disable_opcode_cache' : jQuery( '#p3-disable-opcode-cache' ).prop( 'checked' ),
|
51 |
+
'p3_cache_buster' : jQuery( '#p3-cache-buster' ).prop( 'checked' ),
|
52 |
'p3_scan_name' : jQuery( "#p3-scan-name" ).val(),
|
53 |
'action' : 'p3_start_scan',
|
54 |
'p3_nonce' : jQuery( "#p3_nonce" ).val()
|
105 |
data = {
|
106 |
'p3_ip' : jQuery( '#p3-advanced-ip' ).val(),
|
107 |
'p3_disable_opcode_cache' : jQuery( '#p3-disable-opcode-cache' ).prop( 'checked' ),
|
108 |
+
'p3_cache_buster' : jQuery( '#p3-cache-buster' ).prop( 'checked' ),
|
109 |
'p3_scan_name' : jQuery( "#p3-scan-name" ).val(),
|
110 |
'action' : 'p3_start_scan',
|
111 |
'p3_nonce' : jQuery( "#p3_nonce" ).val()
|
209 |
'resizable' : false,
|
210 |
'modal' : true,
|
211 |
'width' : 450,
|
212 |
+
'height' : 340,
|
213 |
'title' : "Advanced Settings",
|
214 |
'buttons' :
|
215 |
[
|
224 |
'p3_disable_opcode_cache' : $( '#p3-disable-opcode-cache' ).prop( 'checked' ),
|
225 |
'p3_use_current_ip' : $( '#p3-use-current-ip' ).prop( 'checked' ),
|
226 |
'p3_ip_address' : $( '#p3-advanced-ip' ).val(),
|
227 |
+
'p3_cache_buster' : $( '#p3-cache-buster' ).prop( 'checked' ),
|
228 |
'p3_nonce' : '<?php echo wp_create_nonce( 'p3_save_settings' ); ?>'
|
229 |
}
|
230 |
$.post( ajaxurl, data, function( response ) {
|
374 |
data = {
|
375 |
'p3_ip' : jQuery( '#p3-advanced-ip' ).val(),
|
376 |
'p3_disable_opcode_cache' : jQuery( '#p3-disable-opcode-cache' ).prop( 'checked' ),
|
377 |
+
'p3_cache_buster' : jQuery( '#p3-cache-buster' ).prop( 'checked' ),
|
378 |
'p3_scan_name' : jQuery( "#p3-scan-name" ).val(),
|
379 |
'action' : 'p3_start_scan',
|
380 |
'p3_nonce' : jQuery( "#p3_nonce" ).val()
|
446 |
jQuery( "#p3-progress-dialog" ).dialog( "close" );
|
447 |
|
448 |
// View the scan
|
449 |
+
location.href = "<?php echo add_query_arg( array( 'p3_action' => 'view-scan', 'current_scan' => '1', 'name' => null ) ); ?>&name=" + $( this ).attr( "data-scan-name" );
|
450 |
});
|
451 |
$( "#p3-view-incomplete-results-submit" ).click( function() {
|
452 |
$( "#p3-view-results-submit" ).trigger( "click" );
|
539 |
<!-- Second callout cell -->
|
540 |
<td class="p3-callout">
|
541 |
<div class="p3-callout-outer-wrapper qtip-tip" title="Total number of seconds dedicated to plugin code per visit on your site."
|
542 |
+
<?php if ( !empty( $this->scan ) ) { ?>title="From <?php echo basename( $this->scan ); ?><?php } ?>">
|
543 |
<div class="p3-callout-inner-wrapper">
|
544 |
<div class="p3-callout-caption">Plugin Load Time</div>
|
545 |
<div class="p3-callout-data">
|
546 |
+
<?php if ( null === $this->profile ) { ?>
|
547 |
<span class="p3-faded-grey">n/a</span>
|
548 |
<?php } else { ?>
|
549 |
+
<?php printf( '%.3f', $this->profile->averages['plugins'] ); ?>
|
550 |
<?php } ?>
|
551 |
</div>
|
552 |
<div class="p3-callout-caption">( sec. per visit )</div>
|
557 |
<!-- Third callout cell -->
|
558 |
<td class="p3-callout">
|
559 |
<div class="p3-callout-outer-wrapper qtip-tip" title="Percent of load time on your site dedicated to plugin code."
|
560 |
+
<?php if ( !empty( $this->scan ) ) { ?>title="From <?php echo basename( $this->scan ); ?><?php } ?>">
|
561 |
<div class="p3-callout-inner-wrapper">
|
562 |
<div class="p3-callout-caption">Plugin Impact</div>
|
563 |
<div class="p3-callout-data">
|
564 |
+
<?php if ( null === $this->profile ) { ?>
|
565 |
<span class="p3-faded-grey">n/a</span>
|
566 |
<?php } else { ?>
|
567 |
+
<?php printf( '%.1f%%', $this->profile->averages['plugin_impact'] ); ?>
|
568 |
<?php } ?>
|
569 |
</div>
|
570 |
<div class="p3-callout-caption">( of page load time )</div>
|
575 |
<!-- Fourth callout cell -->
|
576 |
<td class="p3-callout">
|
577 |
<div class="p3-callout-outer-wrapper qtip-tip" title="Total number of database queries per visit."
|
578 |
+
<?php if ( !empty( $this->scan ) ) { ?>title="From <?php echo basename( $this->scan ); ?><?php } ?>">
|
579 |
<div class="p3-callout-inner-wrapper">
|
580 |
<div class="p3-callout-caption">MySQL Queries</div>
|
581 |
<div class="p3-callout-data">
|
582 |
+
<?php if ( null === $this->profile ) { ?>
|
583 |
<span class="p3-faded-grey">n/a</span>
|
584 |
<?php } else { ?>
|
585 |
+
<?php echo round( $this->profile->averages['queries'] ); ?>
|
586 |
<?php } ?>
|
587 |
</div>
|
588 |
<div class="p3-callout-caption">per visit</div>
|
610 |
<label for="p3-disable-opcode-cache">Attempt to disable opcode caches <em>( recommended )</em></label>
|
611 |
<br />
|
612 |
<em class="p3-em">This can increase accuracy in plugin detection, but decrease accuracy in timing</em>
|
613 |
+
</div>
|
614 |
+
<br />
|
615 |
+
<div>
|
616 |
+
<input type="checkbox" id="p3-cache-buster" <?php if ( true == get_option( 'p3-profiler_cache_buster' ) ) : ?>checked="checked"<?php endif; ?> />
|
617 |
+
<label for="p3-cache-buster">Attempt to circumvent browser cache</label>
|
618 |
+
<br />
|
619 |
+
<em class="p3-em">This may help fix a "No visits in this profile" error message. See the <a href="<?php echo add_query_arg( array( 'p3_action' => 'help', 'current_scan' => null ) ); ?>#q-circumvent-cache">help</a> page for details.</em>
|
620 |
+
</div>
|
621 |
</div>
|
622 |
|
623 |
<!-- Dialog for iframe scanner -->
|
templates/help.php
CHANGED
@@ -40,9 +40,14 @@ if ( !defined('P3_PATH') )
|
|
40 |
var links = [];
|
41 |
var i = 1;
|
42 |
$( "h2.p3-help-question:not(:first )" ).each( function() {
|
43 |
-
$( this ).
|
44 |
-
|
45 |
-
|
|
|
|
|
|
|
|
|
|
|
46 |
});
|
47 |
$( "div.p3-question blockquote:not(:first )" ).each( function() {
|
48 |
$( this ).after( '<a href="#top">Back to top</a>' );
|
@@ -95,6 +100,43 @@ if ( !defined('P3_PATH') )
|
|
95 |
</blockquote>
|
96 |
</div>
|
97 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
98 |
<div class="p3-question">
|
99 |
<h2 class="p3-help-question">How does this work?</h2>
|
100 |
<blockquote>
|
@@ -480,11 +522,7 @@ if ( !defined('P3_PATH') )
|
|
480 |
<blockquote>
|
481 |
<strong>P3 (Plugin Performance Profiler)</strong>
|
482 |
<br />
|
483 |
-
|
484 |
-
Copyright © 2011-<?php echo date('Y'); ?> <a href="http://www.godaddy.com/" target="_blank">GoDaddy.com</a>. All rights reserved.
|
485 |
-
<?php else : ?>
|
486 |
-
Copyright © 2011 <a href="http://www.godaddy.com/" target="_blank">GoDaddy.com</a>. All rights reserved.
|
487 |
-
<?php endif; ?>
|
488 |
<br /><br />
|
489 |
This program is offered under the terms of the GNU General Public License Version 2 as published by the Free Software Foundation.
|
490 |
<br /><br />
|
40 |
var links = [];
|
41 |
var i = 1;
|
42 |
$( "h2.p3-help-question:not(:first )" ).each( function() {
|
43 |
+
if ( $( this ).attr( "data-question-id" ) !== undefined ) {
|
44 |
+
$( this ).before( '<a name="' + $( this ).attr( "data-question-id" ) + '"> </a>' );
|
45 |
+
links.push( '<li><a href="#' + $( this ).attr( "data-question-id" ) + '">' + $( this ).html() + '</a></li>' );
|
46 |
+
} else {
|
47 |
+
$( this ).before( '<a name="q' + i + '"> </a>' );
|
48 |
+
links.push( '<li><a href="#q' + i + '">' + $( this ).html() + '</a></li>' );
|
49 |
+
i++;
|
50 |
+
}
|
51 |
});
|
52 |
$( "div.p3-question blockquote:not(:first )" ).each( function() {
|
53 |
$( this ).after( '<a href="#top">Back to top</a>' );
|
100 |
</blockquote>
|
101 |
</div>
|
102 |
|
103 |
+
<div class="p3-question">
|
104 |
+
<h2 class="p3-help-question" data-question-id="q-circumvent-cache">How do I fix "No visits in this profile..." ?</h2>
|
105 |
+
<blockquote>
|
106 |
+
This error message means that after being disabled, the profiler did not record any traffic on your site. There are several common
|
107 |
+
causes for this:
|
108 |
+
<ul>
|
109 |
+
<li>
|
110 |
+
<strong>Cause:</strong> Your site is using a caching plugin. The pages that are being scanned aren't actually loading on
|
111 |
+
the server because they're cached in your browser or on the server before WordPress can generate them. The P3 plugin doesn't
|
112 |
+
load and doesn't record any traffic.
|
113 |
+
<br />
|
114 |
+
<strong>Solution:</strong> Enable the "Attempt to circumvent browser cache" option in the advanced settings.
|
115 |
+
</li>
|
116 |
+
<li>
|
117 |
+
<strong>Cause:</strong> The IP address you've entered in the advanced settings dialog doesn't match the IP address you're
|
118 |
+
scanning from.
|
119 |
+
<br />
|
120 |
+
<strong>Solution:</strong> Check the IP address you've entered and try again.
|
121 |
+
</li>
|
122 |
+
<li>
|
123 |
+
<strong>Cause:</strong> You've selected a manual scan, but haven't generated any traffic.
|
124 |
+
<br />
|
125 |
+
<strong>Solution:</strong> Try the automated scan.
|
126 |
+
</li>
|
127 |
+
</ul>
|
128 |
+
</blockquote>
|
129 |
+
</div>
|
130 |
+
|
131 |
+
<div class="p3-question">
|
132 |
+
<h2 class="p3-help-question">Why did P3 only record 2 or 3 visits during the scan?</h2>
|
133 |
+
<blockquote>
|
134 |
+
If your site is using a caching plugin, some pages might be cached in your browser or on the server and are loading before before WordPress
|
135 |
+
can generate them. When this happens, the P3 plugin doesn't load and doesn't record any traffic. Please enable the "Attempt to circumvent
|
136 |
+
browser cache" option in the advanced settings.
|
137 |
+
</blockquote>
|
138 |
+
</div>
|
139 |
+
|
140 |
<div class="p3-question">
|
141 |
<h2 class="p3-help-question">How does this work?</h2>
|
142 |
<blockquote>
|
522 |
<blockquote>
|
523 |
<strong>P3 (Plugin Performance Profiler)</strong>
|
524 |
<br />
|
525 |
+
Copyright © 2011-<?php echo date('Y'); ?> <a href="http://www.godaddy.com/" target="_blank">GoDaddy.com</a>. All rights reserved.
|
|
|
|
|
|
|
|
|
526 |
<br /><br />
|
527 |
This program is offered under the terms of the GNU General Public License Version 2 as published by the Free Software Foundation.
|
528 |
<br /><br />
|
templates/template.php
CHANGED
@@ -1,47 +1,16 @@
|
|
1 |
<?php
|
2 |
-
|
3 |
-
die( 'Forbidden ');
|
4 |
-
$p3_action = '';
|
5 |
-
if ( !empty( $_REQUEST['p3_action'] ) ) {
|
6 |
-
$p3_action = $_REQUEST['p3_action'];
|
7 |
-
}
|
8 |
-
if ( empty( $p3_action ) || 'current-scan' == $p3_action ) {
|
9 |
-
$scan = $this->get_latest_profile();
|
10 |
-
$p3_action = 'current-scan';
|
11 |
-
} elseif ( 'view-scan' == $p3_action && !empty( $_REQUEST['name'] ) ) {
|
12 |
-
$scan = sanitize_file_name( basename( $_REQUEST['name'] ) );
|
13 |
-
if ( !file_exists( P3_PROFILES_PATH . "/$scan" ) ) {
|
14 |
-
wp_die( '<div id="message" class="error"><p>Scan does not exist</p></div>' );
|
15 |
-
}
|
16 |
-
$scan = P3_PROFILES_PATH . "/$scan";
|
17 |
-
}
|
18 |
$button_current_checked = '';
|
19 |
$button_history_checked = '';
|
20 |
$button_help_checked = '';
|
21 |
-
if ( 'current-scan' == $
|
22 |
$button_current_checked = 'checked="checked"';
|
23 |
-
} elseif ( 'help' == $
|
24 |
$button_help_checked = 'checked="checked"';
|
25 |
} else {
|
26 |
$button_history_checked = 'checked="checked"';
|
27 |
}
|
28 |
|
29 |
-
// If there's a scan, create a viewer object
|
30 |
-
if ( !empty( $scan ) ) {
|
31 |
-
try {
|
32 |
-
$profile = new P3_Profile_Reader( $scan );
|
33 |
-
} catch ( P3_Profile_No_Data_Exception $e ) {
|
34 |
-
echo '<div class="error"><p>' . $e->getMessage() . '</p></div>';
|
35 |
-
$scan = null;
|
36 |
-
$profile = null;
|
37 |
-
$p3_action = 'list-scans';
|
38 |
-
} catch ( Exception $e ) {
|
39 |
-
wp_die( '<div id="message" class="error"><p>Error reading scan</p></div>' );
|
40 |
-
}
|
41 |
-
} else {
|
42 |
-
$profile = null;
|
43 |
-
}
|
44 |
-
|
45 |
?>
|
46 |
<script type="text/javascript">
|
47 |
jQuery( document ).ready( function( $) {
|
@@ -77,6 +46,13 @@ if ( !empty( $scan ) ) {
|
|
77 |
}
|
78 |
});
|
79 |
});
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
80 |
});
|
81 |
</script>
|
82 |
<div class="wrap">
|
@@ -104,11 +80,11 @@ if ( !empty( $scan ) ) {
|
|
104 |
<?php require_once P3_PATH . '/templates/callouts.php'; ?>
|
105 |
|
106 |
<!-- View scan or show a list of scans -->
|
107 |
-
<?php if ( ( 'current-scan' == $
|
108 |
<?php include_once P3_PATH . '/templates/view-scan.php'; ?>
|
109 |
-
<?php } elseif ( 'help' == $
|
110 |
<?php include_once P3_PATH . '/templates/help.php'; ?>
|
111 |
-
<?php } elseif ( 'fix-flag-file' == $
|
112 |
<?php include_once P3_PATH . '/templates/fix-flag-file.php'; ?>
|
113 |
<?php } else { ?>
|
114 |
<?php include_once P3_PATH . '/templates/list-scans.php'; ?>
|
@@ -116,12 +92,18 @@ if ( !empty( $scan ) ) {
|
|
116 |
|
117 |
</div>
|
118 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
119 |
<div id="p3-copyright">
|
120 |
<img src="<?php echo plugins_url() . '/p3-profiler/logo.gif'; ?>" alt="GoDaddy.com logo" title="GoDaddy.com logo" />
|
121 |
<br />
|
122 |
-
|
123 |
-
Copyright © 2011-<?php echo date('Y'); ?> <a href="http://www.godaddy.com/" target="_blank">GoDaddy.com</a>. All rights reserved.
|
124 |
-
<?php else : ?>
|
125 |
-
Copyright © 2011 <a href="http://www.godaddy.com/" target="_blank">GoDaddy.com</a>. All rights reserved.
|
126 |
-
<?php endif; ?>
|
127 |
</div>
|
1 |
<?php
|
2 |
+
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
3 |
$button_current_checked = '';
|
4 |
$button_history_checked = '';
|
5 |
$button_help_checked = '';
|
6 |
+
if ( 'current-scan' == $this->action || !empty( $_REQUEST['current_scan'] ) ) {
|
7 |
$button_current_checked = 'checked="checked"';
|
8 |
+
} elseif ( 'help' == $this->action || 'fix-flag-file' == $this->action ) {
|
9 |
$button_help_checked = 'checked="checked"';
|
10 |
} else {
|
11 |
$button_history_checked = 'checked="checked"';
|
12 |
}
|
13 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
14 |
?>
|
15 |
<script type="text/javascript">
|
16 |
jQuery( document ).ready( function( $) {
|
46 |
}
|
47 |
});
|
48 |
});
|
49 |
+
|
50 |
+
// Callouts
|
51 |
+
$( "div#p3-reminder-wrapper" )
|
52 |
+
.corner( "round 8px" )
|
53 |
+
.parent()
|
54 |
+
.css( "padding", "4px" )
|
55 |
+
.corner( "round 10px" );
|
56 |
});
|
57 |
</script>
|
58 |
<div class="wrap">
|
80 |
<?php require_once P3_PATH . '/templates/callouts.php'; ?>
|
81 |
|
82 |
<!-- View scan or show a list of scans -->
|
83 |
+
<?php if ( ( 'current-scan' == $this->action && !empty( $this->scan ) ) || 'view-scan' == $this->action ) { ?>
|
84 |
<?php include_once P3_PATH . '/templates/view-scan.php'; ?>
|
85 |
+
<?php } elseif ( 'help' == $this->action ) { ?>
|
86 |
<?php include_once P3_PATH . '/templates/help.php'; ?>
|
87 |
+
<?php } elseif ( 'fix-flag-file' == $this->action ) { ?>
|
88 |
<?php include_once P3_PATH . '/templates/fix-flag-file.php'; ?>
|
89 |
<?php } else { ?>
|
90 |
<?php include_once P3_PATH . '/templates/list-scans.php'; ?>
|
92 |
|
93 |
</div>
|
94 |
|
95 |
+
<div id="p3-reminder">
|
96 |
+
<div id="p3-reminder-wrapper">
|
97 |
+
Do you like this plugin?
|
98 |
+
<ul>
|
99 |
+
<li><a href="http://twitter.com/home?status=<?php echo rawurlencode(htmlentities('I just optimized my WordPress site with #p3plugin http://wordpress.org/extend/plugins/p3-profiler/ ')); ?>" target="_blank">Tweet</a> about it</li>
|
100 |
+
<li><a href="http://wordpress.org/extend/plugins/p3-profiler/" target="_blank">Rate</a> it on the repository</li>
|
101 |
+
</ul>
|
102 |
+
</div>
|
103 |
+
</div>
|
104 |
+
|
105 |
<div id="p3-copyright">
|
106 |
<img src="<?php echo plugins_url() . '/p3-profiler/logo.gif'; ?>" alt="GoDaddy.com logo" title="GoDaddy.com logo" />
|
107 |
<br />
|
108 |
+
Copyright © 2011-<?php echo date('Y'); ?> <a href="http://www.godaddy.com/" target="_blank">GoDaddy.com</a>. All rights reserved.
|
|
|
|
|
|
|
|
|
109 |
</div>
|
templates/view-scan.php
CHANGED
@@ -3,9 +3,9 @@ if ( !defined('P3_PATH') )
|
|
3 |
die( 'Forbidden ');
|
4 |
$url_stats = array();
|
5 |
$domain = '';
|
6 |
-
if ( !empty( $profile ) ) {
|
7 |
-
$url_stats = $profile->get_stats_by_url();
|
8 |
-
$domain = @parse_url( $profile->report_url, PHP_URL_HOST );
|
9 |
}
|
10 |
$pie_chart_id = substr( md5( uniqid() ), -8 );
|
11 |
$runtime_chart_id = substr( md5( uniqid() ), -8 );
|
@@ -21,8 +21,8 @@ $component_runtime_chart_id = substr( md5( uniqid() ), -8 );
|
|
21 |
|
22 |
// Raw json data ( used in the charts for tooltip data
|
23 |
var _data = [];
|
24 |
-
<?php if ( !empty( $scan ) && file_exists( $scan ) ) { ?>
|
25 |
-
<?php foreach ( file( $scan, FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES ) as $line ) { ?>
|
26 |
_data.push(<?php echo $line; ?>);
|
27 |
<?php } ?>
|
28 |
<?php } ?>
|
@@ -165,10 +165,10 @@ $component_runtime_chart_id = substr( md5( uniqid() ), -8 );
|
|
165 |
/** Plugin pie chart **/
|
166 |
/**************************************************************/
|
167 |
var data_<?php echo $pie_chart_id; ?> = [
|
168 |
-
<?php if ( !empty( $profile ) ){ ?>
|
169 |
-
<?php foreach ( $profile->plugin_times as $k => $v ) { ?>
|
170 |
{
|
171 |
-
label: "<?php echo
|
172 |
data: <?php echo $v; ?>
|
173 |
},
|
174 |
<?php } ?>
|
@@ -327,7 +327,7 @@ $component_runtime_chart_id = substr( md5( uniqid() ), -8 );
|
|
327 |
{
|
328 |
label: "# of Queries",
|
329 |
data: [
|
330 |
-
<?php if ( !empty( $profile ) ){ ?>
|
331 |
<?php foreach ( array_values( $url_stats ) as $k => $v ) { ?>
|
332 |
[
|
333 |
<?php echo $k + 1; ?>,
|
@@ -406,7 +406,7 @@ $component_runtime_chart_id = substr( md5( uniqid() ), -8 );
|
|
406 |
|
407 |
|
408 |
/**************************************************************/
|
409 |
-
/**
|
410 |
/**************************************************************/
|
411 |
var chart_<?php echo $component_breakdown_chart_id; ?> = null;
|
412 |
var data_<?php echo $component_breakdown_chart_id; ?> = [
|
@@ -420,23 +420,23 @@ $component_runtime_chart_id = substr( md5( uniqid() ), -8 );
|
|
420 |
<?php for ( $i = -999 ; $i < 999 + 2; $i++ ) { ?>
|
421 |
[
|
422 |
<?php echo $i; ?>,
|
423 |
-
<?php echo $profile->averages['site']; ?>
|
424 |
],
|
425 |
<?php } ?>
|
426 |
]
|
427 |
},
|
428 |
{
|
429 |
label: 'WP Core Time',
|
430 |
-
data: [[0, <?php echo $profile->averages['core']; ?>]]
|
431 |
},
|
432 |
{
|
433 |
label: 'Theme',
|
434 |
-
data: [[1, <?php echo $profile->averages['theme']; ?>]]
|
435 |
},
|
436 |
<?php $i = 2; $other = 0; ?>
|
437 |
-
<?php foreach ( $profile->plugin_times as $k => $v ) { ?>
|
438 |
{
|
439 |
-
label: '<?php echo
|
440 |
data: [[
|
441 |
<?php echo $i++; ?>,
|
442 |
<?php echo $v; ?>
|
@@ -473,10 +473,10 @@ $component_runtime_chart_id = substr( md5( uniqid() ), -8 );
|
|
473 |
[1, 'WP Core Time'],
|
474 |
[2, 'Theme'],
|
475 |
<?php $i = 3; ?>
|
476 |
-
<?php foreach ( $profile->plugin_times as $k => $v ) { ?>
|
477 |
[
|
478 |
<?php echo $i++ ?>,
|
479 |
-
'<?php echo
|
480 |
],
|
481 |
<?php } ?>
|
482 |
],
|
@@ -526,7 +526,7 @@ $component_runtime_chart_id = substr( md5( uniqid() ), -8 );
|
|
526 |
{
|
527 |
label: "WP Core Time",
|
528 |
data: [
|
529 |
-
<?php if ( !empty( $profile ) ){ ?>
|
530 |
<?php foreach ( array_values( $url_stats ) as $k => $v ) { ?>
|
531 |
[
|
532 |
<?php echo $k + 1; ?>,
|
@@ -539,7 +539,7 @@ $component_runtime_chart_id = substr( md5( uniqid() ), -8 );
|
|
539 |
{
|
540 |
label: "Theme",
|
541 |
data: [
|
542 |
-
<?php if ( !empty( $profile ) ){ ?>
|
543 |
<?php foreach ( array_values( $url_stats ) as $k => $v ) { ?>
|
544 |
[
|
545 |
<?php echo $k + 1; ?>,
|
@@ -549,10 +549,10 @@ $component_runtime_chart_id = substr( md5( uniqid() ), -8 );
|
|
549 |
<?php } ?>
|
550 |
]
|
551 |
},
|
552 |
-
<?php if ( !empty( $profile ) && !empty( $profile->detected_plugins ) ) { ?>
|
553 |
-
<?php foreach ( $profile->detected_plugins as $plugin ) { ?>
|
554 |
{
|
555 |
-
label: "<?php echo
|
556 |
data: [
|
557 |
<?php foreach ( array_values( $url_stats ) as $k => $v ) { ?>
|
558 |
<?php if ( array_key_exists( $plugin, $v['breakdown'] ) ) { ?>
|
@@ -571,11 +571,11 @@ $component_runtime_chart_id = substr( md5( uniqid() ), -8 );
|
|
571 |
var detailed_timeline_options = {};
|
572 |
|
573 |
jQuery( document ).ready( function ( $ ) {
|
574 |
-
<?php if ( !empty( $profile ) && !empty( $profile->detected_plugins ) ) { ?>
|
575 |
jQuery( "#p3-detailed-series-toggle" ).append( '<div><label><input type="checkbox" checked="checked" class="p3-detailed-series-toggle" data-key="WP Core Time" />WP Core Time</label></div>' );
|
576 |
jQuery( "#p3-detailed-series-toggle" ).append( '<div><label><input type="checkbox" checked="checked" class="p3-detailed-series-toggle" data-key="Theme" />Theme</label></div>' );
|
577 |
-
<?php foreach ( $profile->detected_plugins as $plugin ) { ?>
|
578 |
-
jQuery( "#p3-detailed-series-toggle" ).append( '<div><label><input type="checkbox" checked="checked" class="p3-detailed-series-toggle" data-key="<?php echo
|
579 |
<?php } ?>
|
580 |
<?php } ?>
|
581 |
jQuery( "input.p3-detailed-series-toggle" ).click( function() {
|
@@ -879,7 +879,7 @@ $component_runtime_chart_id = substr( md5( uniqid() ), -8 );
|
|
879 |
<strong>Total Load Time: </strong>
|
880 |
</td>
|
881 |
<td>
|
882 |
-
<?php printf( '%.4f', $profile->averages['total'] ); ?> seconds <em class="p3-em">avg.</em>
|
883 |
</td>
|
884 |
</tr>
|
885 |
<tr>
|
@@ -888,7 +888,7 @@ $component_runtime_chart_id = substr( md5( uniqid() ), -8 );
|
|
888 |
<strong>Site Load Time</small></em></strong>
|
889 |
</td>
|
890 |
<td>
|
891 |
-
<?php printf( '%.4f', $profile->averages['site'] ); ?> seconds <em class="p3-em">avg.</em>
|
892 |
</td>
|
893 |
</tr>
|
894 |
<tr class="advanced">
|
@@ -898,7 +898,7 @@ $component_runtime_chart_id = substr( md5( uniqid() ), -8 );
|
|
898 |
<strong>Profile Overhead: </strong>
|
899 |
</td>
|
900 |
<td>
|
901 |
-
<?php printf( '%.4f', $profile->averages['profile'] ); ?> seconds <em class="p3-em">avg.</em>
|
902 |
</td>
|
903 |
</tr>
|
904 |
<tr>
|
@@ -908,7 +908,7 @@ $component_runtime_chart_id = substr( md5( uniqid() ), -8 );
|
|
908 |
<strong>Plugin Load Time: </strong>
|
909 |
</td>
|
910 |
<td>
|
911 |
-
<?php printf( '%.4f', $profile->averages['plugins'] ); ?> seconds <em class="p3-em">avg.</em>
|
912 |
</td>
|
913 |
</tr>
|
914 |
<tr>
|
@@ -918,7 +918,7 @@ $component_runtime_chart_id = substr( md5( uniqid() ), -8 );
|
|
918 |
<strong>Theme Load Time: </strong>
|
919 |
</td>
|
920 |
<td>
|
921 |
-
<?php printf( '%.4f', $profile->averages['theme'] ); ?> seconds <em class="p3-em">avg.</em>
|
922 |
</td>
|
923 |
</tr>
|
924 |
<tr>
|
@@ -928,7 +928,7 @@ $component_runtime_chart_id = substr( md5( uniqid() ), -8 );
|
|
928 |
<strong>Core Load Time: </strong>
|
929 |
</td>
|
930 |
<td>
|
931 |
-
<?php printf( '%.4f', $profile->averages['core'] ); ?> seconds <em class="p3-em">avg.</em>
|
932 |
</td>
|
933 |
</tr>
|
934 |
<tr class="advanced">
|
@@ -942,15 +942,15 @@ $component_runtime_chart_id = substr( md5( uniqid() ), -8 );
|
|
942 |
<strong>Margin of Error: </strong>
|
943 |
</td>
|
944 |
<td>
|
945 |
-
<?php printf( '%.4f', $profile->averages['drift'] ); ?> seconds <em class="p3-em">avg.</em>
|
946 |
<br />
|
947 |
<em class="p3-em">
|
948 |
(<span class="qtip-tip" title="How long the site took to load. This is an observed measurement (start timing
|
949 |
when the page was requested, stop timing when the page was delivered to the browser, calculate the
|
950 |
-
difference)."><?php printf( '%.4f', $profile->averages['observed'] ); ?> observed<span>,
|
951 |
<span class="qtip-tip" title="The expected site load time calculated by adding plugin load time, core
|
952 |
load time, theme load time, and profiler overhead.">
|
953 |
-
<?php printf( '%.4f', $profile->averages['expected'] ); ?> expected</span>)
|
954 |
</em>
|
955 |
</td>
|
956 |
</tr>
|
@@ -960,7 +960,7 @@ $component_runtime_chart_id = substr( md5( uniqid() ), -8 );
|
|
960 |
<strong>Visits: </strong>
|
961 |
</td>
|
962 |
<td>
|
963 |
-
<?php echo number_format( $profile->visits ); ?>
|
964 |
</td>
|
965 |
</tr>
|
966 |
<tr class="advanced">
|
@@ -968,7 +968,7 @@ $component_runtime_chart_id = substr( md5( uniqid() ), -8 );
|
|
968 |
<strong>Number of Plugin Function Calls: </strong>
|
969 |
</td>
|
970 |
<td>
|
971 |
-
<?php echo number_format( $profile->averages['plugin_calls'] ); ?> calls <em class="p3-em">avg.</em>
|
972 |
</td>
|
973 |
</tr>
|
974 |
<tr>
|
@@ -977,7 +977,7 @@ $component_runtime_chart_id = substr( md5( uniqid() ), -8 );
|
|
977 |
<strong>Memory Usage: </strong>
|
978 |
</td>
|
979 |
<td>
|
980 |
-
<?php echo number_format( $profile->averages['memory'] / 1024 / 1024, 2 ); ?> MB <em class="p3-em">avg.</em>
|
981 |
</td>
|
982 |
</tr>
|
983 |
<tr>
|
@@ -986,7 +986,7 @@ $component_runtime_chart_id = substr( md5( uniqid() ), -8 );
|
|
986 |
<strong>MySQL Queries: </strong>
|
987 |
</td>
|
988 |
<td>
|
989 |
-
<?php echo round( $profile->averages['queries'] ); ?> queries <em class="p3-em">avg.</em>
|
990 |
</td>
|
991 |
</tr>
|
992 |
</tbody>
|
@@ -1036,27 +1036,27 @@ to share the results with you. Please take a look at the information below:</te
|
|
1036 |
<textarea disabled="disabled" id="p3-email-results-results" style="width: 95%; height: 120px;"><?php
|
1037 |
echo "WordPress Plugin Profile Report\n";
|
1038 |
echo "===========================================\n";
|
1039 |
-
echo 'Report date: ' . date( 'D M j, Y', $profile->report_date ) . "\n";
|
1040 |
-
echo 'Theme name: ' . $profile->theme_name . "\n";
|
1041 |
-
echo 'Pages browsed: ' . $profile->visits . "\n";
|
1042 |
-
echo 'Avg. load time: ' . sprintf( '%.4f', $profile->averages['site'] ) . " sec\n";
|
1043 |
-
echo 'Number of plugins: ' . count( $profile->detected_plugins ) . " \n";
|
1044 |
-
echo 'Plugin impact: ' . sprintf( '%.2f%%', $profile->averages['plugin_impact'] ) . " % of load time\n";
|
1045 |
-
echo 'Avg. plugin time: ' . sprintf( '%.4f', $profile->averages['plugins'] ) . " sec\n";
|
1046 |
-
echo 'Avg. core time: ' . sprintf( '%.4f', $profile->averages['core'] ) . " sec\n";
|
1047 |
-
echo 'Avg. theme time: ' . sprintf( '%.4f', $profile->averages['theme'] ) . " sec\n";
|
1048 |
-
echo 'Avg. mem usage: ' . number_format( $profile->averages['memory'] / 1024 / 1024, 2 ) . " MB\n";
|
1049 |
-
echo 'Avg. plugin calls: ' . number_format( $profile->averages['plugin_calls'] ) . "\n";
|
1050 |
-
echo 'Avg. db queries : ' . sprintf( '%.2f', $profile->averages['queries'] ) . "\n";
|
1051 |
-
echo 'Margin of error : ' . sprintf( '%.4f', $profile->averages['drift'] ) . " sec\n";
|
1052 |
echo "\nPlugin list:\n";
|
1053 |
echo "===========================================\n";
|
1054 |
-
foreach ( $profile->plugin_times as $k => $v) {
|
1055 |
-
echo
|
1056 |
}
|
1057 |
?></textarea>
|
1058 |
</div>
|
1059 |
-
<input type="hidden" id="p3-email-results-scan" value="<?php echo basename( $scan ); ?>" />
|
1060 |
</div>
|
1061 |
|
1062 |
<!-- Email sending dialog -->
|
3 |
die( 'Forbidden ');
|
4 |
$url_stats = array();
|
5 |
$domain = '';
|
6 |
+
if ( !empty( $this->profile ) ) {
|
7 |
+
$url_stats = $this->profile->get_stats_by_url();
|
8 |
+
$domain = @parse_url( $this->profile->report_url, PHP_URL_HOST );
|
9 |
}
|
10 |
$pie_chart_id = substr( md5( uniqid() ), -8 );
|
11 |
$runtime_chart_id = substr( md5( uniqid() ), -8 );
|
21 |
|
22 |
// Raw json data ( used in the charts for tooltip data
|
23 |
var _data = [];
|
24 |
+
<?php if ( !empty( $this->scan ) && file_exists( $this->scan ) ) { ?>
|
25 |
+
<?php foreach ( file( $this->scan, FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES ) as $line ) { ?>
|
26 |
_data.push(<?php echo $line; ?>);
|
27 |
<?php } ?>
|
28 |
<?php } ?>
|
165 |
/** Plugin pie chart **/
|
166 |
/**************************************************************/
|
167 |
var data_<?php echo $pie_chart_id; ?> = [
|
168 |
+
<?php if ( !empty( $this->profile ) ){ ?>
|
169 |
+
<?php foreach ( $this->profile->plugin_times as $k => $v ) { ?>
|
170 |
{
|
171 |
+
label: "<?php echo $k; ?>",
|
172 |
data: <?php echo $v; ?>
|
173 |
},
|
174 |
<?php } ?>
|
327 |
{
|
328 |
label: "# of Queries",
|
329 |
data: [
|
330 |
+
<?php if ( !empty( $this->profile ) ){ ?>
|
331 |
<?php foreach ( array_values( $url_stats ) as $k => $v ) { ?>
|
332 |
[
|
333 |
<?php echo $k + 1; ?>,
|
406 |
|
407 |
|
408 |
/**************************************************************/
|
409 |
+
/** Compnent bar chart data **/
|
410 |
/**************************************************************/
|
411 |
var chart_<?php echo $component_breakdown_chart_id; ?> = null;
|
412 |
var data_<?php echo $component_breakdown_chart_id; ?> = [
|
420 |
<?php for ( $i = -999 ; $i < 999 + 2; $i++ ) { ?>
|
421 |
[
|
422 |
<?php echo $i; ?>,
|
423 |
+
<?php echo $this->profile->averages['site']; ?>
|
424 |
],
|
425 |
<?php } ?>
|
426 |
]
|
427 |
},
|
428 |
{
|
429 |
label: 'WP Core Time',
|
430 |
+
data: [[0, <?php echo $this->profile->averages['core']; ?>]]
|
431 |
},
|
432 |
{
|
433 |
label: 'Theme',
|
434 |
+
data: [[1, <?php echo $this->profile->averages['theme']; ?>]]
|
435 |
},
|
436 |
<?php $i = 2; $other = 0; ?>
|
437 |
+
<?php foreach ( $this->profile->plugin_times as $k => $v ) { ?>
|
438 |
{
|
439 |
+
label: '<?php echo $k; ?>',
|
440 |
data: [[
|
441 |
<?php echo $i++; ?>,
|
442 |
<?php echo $v; ?>
|
473 |
[1, 'WP Core Time'],
|
474 |
[2, 'Theme'],
|
475 |
<?php $i = 3; ?>
|
476 |
+
<?php foreach ( $this->profile->plugin_times as $k => $v ) { ?>
|
477 |
[
|
478 |
<?php echo $i++ ?>,
|
479 |
+
'<?php echo $k; ?>'
|
480 |
],
|
481 |
<?php } ?>
|
482 |
],
|
526 |
{
|
527 |
label: "WP Core Time",
|
528 |
data: [
|
529 |
+
<?php if ( !empty( $this->profile ) ){ ?>
|
530 |
<?php foreach ( array_values( $url_stats ) as $k => $v ) { ?>
|
531 |
[
|
532 |
<?php echo $k + 1; ?>,
|
539 |
{
|
540 |
label: "Theme",
|
541 |
data: [
|
542 |
+
<?php if ( !empty( $this->profile ) ){ ?>
|
543 |
<?php foreach ( array_values( $url_stats ) as $k => $v ) { ?>
|
544 |
[
|
545 |
<?php echo $k + 1; ?>,
|
549 |
<?php } ?>
|
550 |
]
|
551 |
},
|
552 |
+
<?php if ( !empty( $this->profile ) && !empty( $this->profile->detected_plugins ) ) { ?>
|
553 |
+
<?php foreach ( $this->profile->detected_plugins as $plugin ) { ?>
|
554 |
{
|
555 |
+
label: "<?php echo $plugin; ?>",
|
556 |
data: [
|
557 |
<?php foreach ( array_values( $url_stats ) as $k => $v ) { ?>
|
558 |
<?php if ( array_key_exists( $plugin, $v['breakdown'] ) ) { ?>
|
571 |
var detailed_timeline_options = {};
|
572 |
|
573 |
jQuery( document ).ready( function ( $ ) {
|
574 |
+
<?php if ( !empty( $this->profile ) && !empty( $this->profile->detected_plugins ) ) { ?>
|
575 |
jQuery( "#p3-detailed-series-toggle" ).append( '<div><label><input type="checkbox" checked="checked" class="p3-detailed-series-toggle" data-key="WP Core Time" />WP Core Time</label></div>' );
|
576 |
jQuery( "#p3-detailed-series-toggle" ).append( '<div><label><input type="checkbox" checked="checked" class="p3-detailed-series-toggle" data-key="Theme" />Theme</label></div>' );
|
577 |
+
<?php foreach ( $this->profile->detected_plugins as $plugin ) { ?>
|
578 |
+
jQuery( "#p3-detailed-series-toggle" ).append( '<div><label><input type="checkbox" checked="checked" class="p3-detailed-series-toggle" data-key="<?php echo $plugin; ?>" /><?php echo $plugin ;?></label></div>' );
|
579 |
<?php } ?>
|
580 |
<?php } ?>
|
581 |
jQuery( "input.p3-detailed-series-toggle" ).click( function() {
|
879 |
<strong>Total Load Time: </strong>
|
880 |
</td>
|
881 |
<td>
|
882 |
+
<?php printf( '%.4f', $this->profile->averages['total'] ); ?> seconds <em class="p3-em">avg.</em>
|
883 |
</td>
|
884 |
</tr>
|
885 |
<tr>
|
888 |
<strong>Site Load Time</small></em></strong>
|
889 |
</td>
|
890 |
<td>
|
891 |
+
<?php printf( '%.4f', $this->profile->averages['site'] ); ?> seconds <em class="p3-em">avg.</em>
|
892 |
</td>
|
893 |
</tr>
|
894 |
<tr class="advanced">
|
898 |
<strong>Profile Overhead: </strong>
|
899 |
</td>
|
900 |
<td>
|
901 |
+
<?php printf( '%.4f', $this->profile->averages['profile'] ); ?> seconds <em class="p3-em">avg.</em>
|
902 |
</td>
|
903 |
</tr>
|
904 |
<tr>
|
908 |
<strong>Plugin Load Time: </strong>
|
909 |
</td>
|
910 |
<td>
|
911 |
+
<?php printf( '%.4f', $this->profile->averages['plugins'] ); ?> seconds <em class="p3-em">avg.</em>
|
912 |
</td>
|
913 |
</tr>
|
914 |
<tr>
|
918 |
<strong>Theme Load Time: </strong>
|
919 |
</td>
|
920 |
<td>
|
921 |
+
<?php printf( '%.4f', $this->profile->averages['theme'] ); ?> seconds <em class="p3-em">avg.</em>
|
922 |
</td>
|
923 |
</tr>
|
924 |
<tr>
|
928 |
<strong>Core Load Time: </strong>
|
929 |
</td>
|
930 |
<td>
|
931 |
+
<?php printf( '%.4f', $this->profile->averages['core'] ); ?> seconds <em class="p3-em">avg.</em>
|
932 |
</td>
|
933 |
</tr>
|
934 |
<tr class="advanced">
|
942 |
<strong>Margin of Error: </strong>
|
943 |
</td>
|
944 |
<td>
|
945 |
+
<?php printf( '%.4f', $this->profile->averages['drift'] ); ?> seconds <em class="p3-em">avg.</em>
|
946 |
<br />
|
947 |
<em class="p3-em">
|
948 |
(<span class="qtip-tip" title="How long the site took to load. This is an observed measurement (start timing
|
949 |
when the page was requested, stop timing when the page was delivered to the browser, calculate the
|
950 |
+
difference)."><?php printf( '%.4f', $this->profile->averages['observed'] ); ?> observed<span>,
|
951 |
<span class="qtip-tip" title="The expected site load time calculated by adding plugin load time, core
|
952 |
load time, theme load time, and profiler overhead.">
|
953 |
+
<?php printf( '%.4f', $this->profile->averages['expected'] ); ?> expected</span>)
|
954 |
</em>
|
955 |
</td>
|
956 |
</tr>
|
960 |
<strong>Visits: </strong>
|
961 |
</td>
|
962 |
<td>
|
963 |
+
<?php echo number_format( $this->profile->visits ); ?>
|
964 |
</td>
|
965 |
</tr>
|
966 |
<tr class="advanced">
|
968 |
<strong>Number of Plugin Function Calls: </strong>
|
969 |
</td>
|
970 |
<td>
|
971 |
+
<?php echo number_format( $this->profile->averages['plugin_calls'] ); ?> calls <em class="p3-em">avg.</em>
|
972 |
</td>
|
973 |
</tr>
|
974 |
<tr>
|
977 |
<strong>Memory Usage: </strong>
|
978 |
</td>
|
979 |
<td>
|
980 |
+
<?php echo number_format( $this->profile->averages['memory'] / 1024 / 1024, 2 ); ?> MB <em class="p3-em">avg.</em>
|
981 |
</td>
|
982 |
</tr>
|
983 |
<tr>
|
986 |
<strong>MySQL Queries: </strong>
|
987 |
</td>
|
988 |
<td>
|
989 |
+
<?php echo round( $this->profile->averages['queries'] ); ?> queries <em class="p3-em">avg.</em>
|
990 |
</td>
|
991 |
</tr>
|
992 |
</tbody>
|
1036 |
<textarea disabled="disabled" id="p3-email-results-results" style="width: 95%; height: 120px;"><?php
|
1037 |
echo "WordPress Plugin Profile Report\n";
|
1038 |
echo "===========================================\n";
|
1039 |
+
echo 'Report date: ' . date( 'D M j, Y', $this->profile->report_date ) . "\n";
|
1040 |
+
echo 'Theme name: ' . $this->profile->theme_name . "\n";
|
1041 |
+
echo 'Pages browsed: ' . $this->profile->visits . "\n";
|
1042 |
+
echo 'Avg. load time: ' . sprintf( '%.4f', $this->profile->averages['site'] ) . " sec\n";
|
1043 |
+
echo 'Number of plugins: ' . count( $this->profile->detected_plugins ) . " \n";
|
1044 |
+
echo 'Plugin impact: ' . sprintf( '%.2f%%', $this->profile->averages['plugin_impact'] ) . " % of load time\n";
|
1045 |
+
echo 'Avg. plugin time: ' . sprintf( '%.4f', $this->profile->averages['plugins'] ) . " sec\n";
|
1046 |
+
echo 'Avg. core time: ' . sprintf( '%.4f', $this->profile->averages['core'] ) . " sec\n";
|
1047 |
+
echo 'Avg. theme time: ' . sprintf( '%.4f', $this->profile->averages['theme'] ) . " sec\n";
|
1048 |
+
echo 'Avg. mem usage: ' . number_format( $this->profile->averages['memory'] / 1024 / 1024, 2 ) . " MB\n";
|
1049 |
+
echo 'Avg. plugin calls: ' . number_format( $this->profile->averages['plugin_calls'] ) . "\n";
|
1050 |
+
echo 'Avg. db queries : ' . sprintf( '%.2f', $this->profile->averages['queries'] ) . "\n";
|
1051 |
+
echo 'Margin of error : ' . sprintf( '%.4f', $this->profile->averages['drift'] ) . " sec\n";
|
1052 |
echo "\nPlugin list:\n";
|
1053 |
echo "===========================================\n";
|
1054 |
+
foreach ( $this->profile->plugin_times as $k => $v) {
|
1055 |
+
echo $k . ' - ' . sprintf('%.4f sec', $v) . ' - ' . sprintf( '%.2f%%', $v * 100 / array_sum( $this->profile->plugin_times ) ) . "\n";
|
1056 |
}
|
1057 |
?></textarea>
|
1058 |
</div>
|
1059 |
+
<input type="hidden" id="p3-email-results-scan" value="<?php echo basename( $this->scan ); ?>" />
|
1060 |
</div>
|
1061 |
|
1062 |
<!-- Email sending dialog -->
|