Script Loader: Improve performance of `wp_script_is()` for scripts registered with complex dependencies.
This switches `WP_Dependencies::recurse_deps()` from recursively checking the same handles over and over again to keep a flattened array of queued items and their dependencies for faster lookup in `WP_Dependencies::query()`. Props superdav42. Fixes #46469. Built from https://develop.svn.wordpress.org/trunk@47359 git-svn-id: http://core.svn.wordpress.org/trunk@47146 1a063a9b-81f0-0310-95a4-ce76da25c4cd
This commit is contained in:
parent
c60ea3261f
commit
67a6527d51
|
@ -75,6 +75,14 @@ class WP_Dependencies {
|
||||||
*/
|
*/
|
||||||
public $group = 0;
|
public $group = 0;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Cached lookup array of flattened queued items and dependencies.
|
||||||
|
*
|
||||||
|
* @since 5.4.0
|
||||||
|
* @var array
|
||||||
|
*/
|
||||||
|
private $all_queued_deps;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Processes the items and dependencies.
|
* Processes the items and dependencies.
|
||||||
*
|
*
|
||||||
|
@ -302,8 +310,13 @@ class WP_Dependencies {
|
||||||
public function enqueue( $handles ) {
|
public function enqueue( $handles ) {
|
||||||
foreach ( (array) $handles as $handle ) {
|
foreach ( (array) $handles as $handle ) {
|
||||||
$handle = explode( '?', $handle );
|
$handle = explode( '?', $handle );
|
||||||
if ( ! in_array( $handle[0], $this->queue ) && isset( $this->registered[ $handle[0] ] ) ) {
|
|
||||||
|
if ( ! in_array( $handle[0], $this->queue, true ) && isset( $this->registered[ $handle[0] ] ) ) {
|
||||||
$this->queue[] = $handle[0];
|
$this->queue[] = $handle[0];
|
||||||
|
|
||||||
|
// Reset all dependencies so they must be recalculated in recurse_deps().
|
||||||
|
$this->all_queued_deps = null;
|
||||||
|
|
||||||
if ( isset( $handle[1] ) ) {
|
if ( isset( $handle[1] ) ) {
|
||||||
$this->args[ $handle[0] ] = $handle[1];
|
$this->args[ $handle[0] ] = $handle[1];
|
||||||
}
|
}
|
||||||
|
@ -325,8 +338,12 @@ class WP_Dependencies {
|
||||||
public function dequeue( $handles ) {
|
public function dequeue( $handles ) {
|
||||||
foreach ( (array) $handles as $handle ) {
|
foreach ( (array) $handles as $handle ) {
|
||||||
$handle = explode( '?', $handle );
|
$handle = explode( '?', $handle );
|
||||||
$key = array_search( $handle[0], $this->queue );
|
$key = array_search( $handle[0], $this->queue, true );
|
||||||
|
|
||||||
if ( false !== $key ) {
|
if ( false !== $key ) {
|
||||||
|
// Reset all dependencies so they must be recalculated in recurse_deps().
|
||||||
|
$this->all_queued_deps = null;
|
||||||
|
|
||||||
unset( $this->queue[ $key ] );
|
unset( $this->queue[ $key ] );
|
||||||
unset( $this->args[ $handle[0] ] );
|
unset( $this->args[ $handle[0] ] );
|
||||||
}
|
}
|
||||||
|
@ -334,7 +351,7 @@ class WP_Dependencies {
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Recursively search the passed dependency tree for $handle
|
* Recursively search the passed dependency tree for $handle.
|
||||||
*
|
*
|
||||||
* @since 4.0.0
|
* @since 4.0.0
|
||||||
*
|
*
|
||||||
|
@ -343,19 +360,31 @@ class WP_Dependencies {
|
||||||
* @return bool Whether the handle is found after recursively searching the dependency tree.
|
* @return bool Whether the handle is found after recursively searching the dependency tree.
|
||||||
*/
|
*/
|
||||||
protected function recurse_deps( $queue, $handle ) {
|
protected function recurse_deps( $queue, $handle ) {
|
||||||
foreach ( $queue as $queued ) {
|
if ( isset( $this->all_queued_deps ) ) {
|
||||||
if ( ! isset( $this->registered[ $queued ] ) ) {
|
return isset( $this->all_queued_deps[ $handle ] );
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
if ( in_array( $handle, $this->registered[ $queued ]->deps ) ) {
|
|
||||||
return true;
|
|
||||||
} elseif ( $this->recurse_deps( $this->registered[ $queued ]->deps, $handle ) ) {
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return false;
|
$all_deps = array_fill_keys( $queue, true );
|
||||||
|
$queues = array();
|
||||||
|
$done = array();
|
||||||
|
|
||||||
|
while ( $queue ) {
|
||||||
|
foreach ( $queue as $queued ) {
|
||||||
|
if ( ! isset( $done[ $queued ] ) && isset( $this->registered[ $queued ] ) ) {
|
||||||
|
$deps = $this->registered[ $queued ]->deps;
|
||||||
|
if ( $deps ) {
|
||||||
|
$all_deps += array_fill_keys( $deps, true );
|
||||||
|
array_push( $queues, $deps );
|
||||||
|
}
|
||||||
|
$done[ $queued ] = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
$queue = array_pop( $queues );
|
||||||
|
}
|
||||||
|
|
||||||
|
$this->all_queued_deps = $all_deps;
|
||||||
|
|
||||||
|
return isset( $this->all_queued_deps[ $handle ] );
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -379,18 +408,18 @@ class WP_Dependencies {
|
||||||
|
|
||||||
case 'enqueued':
|
case 'enqueued':
|
||||||
case 'queue':
|
case 'queue':
|
||||||
if ( in_array( $handle, $this->queue ) ) {
|
if ( in_array( $handle, $this->queue, true ) ) {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
return $this->recurse_deps( $this->queue, $handle );
|
return $this->recurse_deps( $this->queue, $handle );
|
||||||
|
|
||||||
case 'to_do':
|
case 'to_do':
|
||||||
case 'to_print': // Back compat.
|
case 'to_print': // Back compat.
|
||||||
return in_array( $handle, $this->to_do );
|
return in_array( $handle, $this->to_do, true );
|
||||||
|
|
||||||
case 'done':
|
case 'done':
|
||||||
case 'printed': // Back compat.
|
case 'printed': // Back compat.
|
||||||
return in_array( $handle, $this->done );
|
return in_array( $handle, $this->done, true );
|
||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
|
@ -13,7 +13,7 @@
|
||||||
*
|
*
|
||||||
* @global string $wp_version
|
* @global string $wp_version
|
||||||
*/
|
*/
|
||||||
$wp_version = '5.4-beta2-47358';
|
$wp_version = '5.4-beta2-47359';
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Holds the WordPress DB revision, increments when changes are made to the WordPress DB schema.
|
* Holds the WordPress DB revision, increments when changes are made to the WordPress DB schema.
|
||||||
|
|
Loading…
Reference in New Issue