This plugin hasn’t been tested with the latest 3 major releases of WordPress. It may no longer be maintained or supported and may have compatibility issues when used with more recent versions of WordPress.

P3 (Plugin Performance Profiler)


This plugin creates a profile of your WordPress site’s plugins’ performance by measuring their impact on your site’s load time. Often times, WordPress sites load slowly because of poorly configured plugins or because there are so many of them. By using the P3 plugin, you can narrow down anything causing slowness on your site.

This plugin uses the canvas element for drawing charts and requires requires Firefox, Chrome, Opera, Safari, or IE9 or later. This plugin will not work in IE8 or lower.


  • First, profile your site. The scanner generates some traffic on your site and monitors your site's performance on the server, then shows you the results. With this information, you can decide what action to take.
  • After profiling, you'll see a breakdown of relative runtime for each plugin.
  • Callouts at the top give you quick information like how much load time (in seconds) is dedicated to plugins and how many database queries your site is running per page.
  • The detailed timeline gives you timing information for every plugin, the theme, and the core for every page during the profile. Find out exactly what's happening on slow loading pages.
  • You can toggle each series on and off to customize this timeline for your precise needs.
  • The query timeline gives you the number of database queries for every page during the profile. Find out which pages generate the most database queries.
  • Keep a history of your performance scans, compare your current performance with your previous performance.
  • Full in-app help documentation
  • Send a summary of your performance profile via e-mail. If you want to show your developer, site admin, hosting support, or a plugin developer what's going on with your site, this is good way to start the conversation.
  • Use the advanced settings to activate debug mode, control cache busting, or lock down profiling to a set of IP addresses.
  • View the debug log on the help page to help troubleshoot if P3 isn't recording properly.


Automatic installation

  1. Log into your WordPress admin
  2. Click Plugins
  3. Click Add New
  4. Search for P3
  5. Click Install Now under “P3 (Plugin Performance Profiler)”
  6. Activate the plugin

Manual installation:

  1. Download the plugin
  2. Extract the contents of the zip file
  3. Upload the contents of the zip file to the wp-content/plugins/ folder of your WordPress installation
  4. Then activate the Plugin from Plugins page.


I installed P3, what now?

Open the Tools menu, then open P3 Plugin Profiler then click Scan Now.

What if I get a warning about usort()?

Warning messages like this: Warning: usort() [function.usort]: Array was modified by the user comparison function are due to a known php bug. See php bug #50688 for more information. This warning does not affect the functionality of your site and it is not visible to your users.

In the e-mail report, why is my theme detected as “unknown?”

Previous version of the plugin (before 1.1.0) did not have theme name detection support. If you performed a scan with a previous version, then upgraded to 1.1.0+ to view the scan, the theme name will show as “unknown.”

Help! I used P3 and now my site is down!

First, get your site back up! There are two ways to do this. Try the emergency shutoff switch first. If that doesn’t work, delete the plugin files.

Emergency Shutoff Switch

  1. Visit

Delete the Plugin Files

  1. Delete wp-content/plugins/p3-profiler (the whole folder)
  2. Delete wp-content/mu-plugins/p3-profiler.php (if it exists)

This can happen if P3 hits the memory limit on your server while it’s running. This happens most often on sites with many active plugins or a complex theme. Consider switching to the Twenty Eleven theme or deactivating a few plugins before re-running P3.

I get “Warning: file_put_contents( …. )”

Please check your media settings. This is in Settings -> Media -> Store uploads in this folder. If this folder is not set correctly, P3 won’t know where to read the files.

How do I use P3 with multisite?

P3 is available on the Tools menu for each site in the network.

How can I change the list of pages scanned with auto-scan?

You can write a plugin to hook the p3_automatic_scan_urls filter. Here’s some sample code:

function my_p3_auto_scan_pages() {
    return array(
add_filter( 'p3_automatic_scan_urls', 'my_p3_auto_scan_pages' );


9 0906 November 0906 000000 2021
Make sure you have FTP access so you can delete this plugin. It does not work and will give a critical error when you try to delete it from the WP dashboard.
22 2201 October 2201 000000 2021
THIS NEEDS TO BE REMOVED! Had to log in via FTP and delete this plugin directory to access the website again. THIS NEEDS TO BE REMOVED!
10 1014 October 1014 000000 2021
Horrible, don't use ! As : Fatal error: strict_types declaration must be the very first statement in the script in /customers/2/6/5/ BY MYSELF).php on line 3
25 2512 September 2512 000000 2021
DO NOT INSTALL THIS PLUGIN. After you run a website scan it will break your website. I lost access to the admin panel so I had to modify database records to disable the plugin. Then I couldn't delete it, because WordPress said "critical error". I had to delete the plugin manually via FTP. Do not install it!
26 2649 July 2649 000000 2021
Downloaded it, and isntalled it from then, everything goes wrong. UI is broken, started scan and then error message shows up and the scan will not stop.It also broke the website, so I had to remove the plugin using ssh. Thank you very much.
Read all 402 reviews

Contributors & Developers

“P3 (Plugin Performance Profiler)” is open source software. The following people have contributed to this plugin.


“P3 (Plugin Performance Profiler)” has been translated into 1 locale. Thank you to the translators for their contributions.

Translate “P3 (Plugin Performance Profiler)” into your language.

Interested in development?

Browse the code, check out the SVN repository, or subscribe to the development log by RSS.



Fix: Compatibility with PHP 7 and fix JavaScript errors (props gabriel-munteanu)
Fix: Deprecated create_function() warning

Security update: Escape URLs returned by add_query_arg and remove_query_arg

Bugfix for HTML element with space in the id

Ensure HTML element names are distinct. Props mogulbuster

Internal version bump to ensure new CSS/JS isn’t cached

  • CSS fix for jQuery UI Dialogs. props cklosows

  • Fixes a CSS issue with overlays and soem browsers

  • Style Updates for 4.1

  • Fixed logic bug in determining debug_backtrace arguements


  • Improved scanner performance (props askapache)
  • Fix a CSS conflict in overlays


  • Fix a race condition in the error detection logic
  • Add a notice about WordPress SEO and Jetpack


  • Fix a bug which broke debug mode and caused scanning to not work properly for some users.


  • Fixed a CSS compatibility issue between WordPress 3.8 / MP6 and jQuery UI (props mintfactory)


  • Fixed a php short tag. Props Dean Taylor
  • Fixed an E_STRICT notice. Props Dean Taylor
  • Fixed an issue with debug_backtrace that broke with php 5.2.4. Props tobbykanin


  • Fixed a logged php notice during uninstall
  • Fixed a php notice when starting scan. props rrhobbs
  • Removed a reference to a missing stylesheet. props zorl-zorl


  • Added a Turkish translation. Thanks to Hakaner!
  • Updated some UI elements to allow for longer text strings for translations
  • Refreshed UI to be 3.5.x compatible and use standard admin coloring
  • Added a ‘p3_automatic_scan_urls’ filter


  • Fixed an error when upgrading to 1.3.x from 1.1.x and skipping the 1.2.x upgrade.


  • Internationalized P3
  • Compatibility with WordPress 3.4.0
  • Fixed a bug with European decimalization (0,00 vs. 0.00)
  • Major refactoring for better adherence to best practices, using fewer hooks, and consuming less memory
  • Raised memory limit override to 256M so large backtraces don’t kill the site
  • Added a kill switch. If P3 is causing problems, visit to turn off P3
  • Added automatic error detection. If a page fails to load during profiling, the next page load will turn off P3 automatically
  • Removed ajax error alerts; they weren’t helpful
  • Path to the profiles folder is now determined on the init hook


  • Remove .profiling_enabled file, store profiling flag as a WordPress option
  • Remove code that writes to .htaccess file
  • Removed fix-flag-file page, no longer necessary
  • Added a link to the “no visits recorded” message pointing to the help page
  • Bugfix – with the manual profile “I’m done” button not showing the intended scan
  • On upgrade, remove .htaccess auto_prepend_file code
  • On upgrade, delete .profiling_enabled file
  • Include a data point for all visits for all plugins on the detailed chart (If no data point exists, mark it as 0 to keep the line connected)
  • Add Debug log feature to help diagnose why scans aren’t recording properly on some sites
  • Opcode optimizer detection / documentation
  • Opcode optimizer compatibility
  • Update the list of random URLs to scan – use 4 random categories, 4 random tags, 4 random posts, a random search word from the blog description, and the home page
  • Don’t include the site’s RSS feed in the automated scan, it’s causing problems in some browsers which expect the feed to be loaded as a document
  • Support HTTP_X_REAL_IP
  • Remove file locking, it’s preventing the profiles from being saved on some hosts
  • Removing calls to filter_var, some 5.2.x builds use –disable-filter so this isn’t reliable
  • Bugfix – Pausing a scan and clicking “View results” showed an error message
  • Bugfix – Avoid using “../” for compatibility with open_basedir
  • Upgrade routine was being done in the wrong order


  • Bugfix – regression bug re-introduced in v 1.1.2. Thanks to user adamf for finding this so quickly!


  • Don’t show screen options if there is no table
  • Show a “rate us / tweet us” box
  • Add an option to circumvent browser cache
  • Bugfix – Properly work with encrypted plugins (eval based obfuscation)
  • Bugfix – Work with suhosin/safe mode where ini_set / set_time_limit are disabled
  • Bugfix – Remove “Options -Indexes” because it’s causing 500 error in some apache setups
  • Bugfix – Fix a warning with theme name detection if the theme is no longer installed


  • Bugfix – Plugin names with apostrophes broke the UI
  • Bugfix – Fix a deprecated warning with callt-ime pass by reference


  • Including plugin usage percentage / seconds in e-mail report
  • Including theme name in e-mail report. Profiles created in older versions will show “unknown”
  • Grammar / wording changes
  • Remembering “disable opcode cache” in options table
  • New option for “use my IP.” If this is set, the current user’s IP address will be used, if not, the stored IP pattern will be used
  • IP patterns will be stored as an option
  • Fixed: IP patterns were incorrectly escaped
  • Now displaying profile name in the top right
  • If the profile didn’t record any visits (e.g. wrong IP pattern) then an error will be displayed
  • Fixing pagination on the history page
  • Made the legends on the charts a bit wider for sites with a lot of plugins and plugins with long names
  • Added the ability to toggle series on/off in the “detailed timeline” chart
  • Removed network wide activation code – each site will be “activated” when the admin logs in
  • Removed “sync all profile folders whenever a blog is added/deleted” code. Profile folders will be added when admins log in, removed when blogs are removed
  • When uninstalling, all profile folders and options will be removed
  • Using get_plugin_data() to get plugin names. If the plugin doesn’t exist anymore, or there’s a problem getting the plugin name, the old formatting code is used


  • Security – Fixed a path disclosure vulnerability
  • Security – sanitized user input before it gets back to the browser
  • Thanks to Julio Potier from


  • Bugfix – uninstalling the plugin when it hasn’t been activated can result in an error message


  • Enforcing WordPress 3.3 requirement during activation
  • Documented warning about usort() and php bug


  • Fixed an error message when clicking “stop scan” too fast
  • Brought plugin version from php file in line with version from readme.txt and tag


  • readme.txt changes


  • Automatic site profiling
  • Manual site profiling
  • Profile history
  • Continue a profile session
  • Clear opcode caches (if possible) to improve plugin function detection
  • Limit profiling by IP address (regex pattern)
  • Limit profiling by site URL (for MS compatibility)
  • Rewrite http URLs to https to avoid SSL warnings when using wp-admin over SSL
  • Hide the admin toolbar on the front-end when profiling to prevent extra plugin scripts/styles from loading
  • In-app help / glossary page
  • Activate / deactivate hooks to try different loader methods so the profiler runs as early as possible
  • Uninstall hooks to clean up profiles
  • Hooks add/delete blog to clean up profiles
  • Send profile summary via e-mail