[wp-trac] [WordPress Trac] #50587: Provide short-circuit filter for scandir() in wp_unique_filename()
WordPress Trac
noreply at wordpress.org
Tue Jul 7 09:55:53 UTC 2020
#50587: Provide short-circuit filter for scandir() in wp_unique_filename()
------------------------------------+------------------------------
Reporter: joehoyle | Owner: (none)
Type: enhancement | Status: new
Priority: normal | Milestone: Awaiting Review
Component: Upload | Version: 5.3
Severity: normal | Resolution:
Keywords: has-patch dev-feedback | Focuses:
------------------------------------+------------------------------
Description changed by SergeyBiryukov:
Old description:
> In https://core.trac.wordpress.org/ticket/42437, WordPress introduced an
> enhancement to how unique filenames are calculated. The tl;dr of that
> change was to run `scandir()` on the directory that a file will be placed
> in, and iterate over all files, to check if there is any files that can
> potentially conflict with the newly added file (or future resize
> variants).
>
> In situations where you have many thousands of files in your monthly
> uploads directories, or where the upload DIR path is particularly slow
> for access (such as remote file systems) this `scandir()` can cause a
> large performance overhead.
>
> I propose we add a "pre filter" to `scandir()` to allow plugins to
> override the file fetching behaviour. The current implementation is quite
> wasteful, as it will do a list on the whole directory, but then call
> `preg_match()` on each file with `^$filename*...`. In situations where
> plugins can get file listings by other mechanisms, a file list for
> `$dir/$filename*` would return many fewer results but provide the same
> file list needed for `_wp_check_existing_file_names()` for example.
New description:
In #42437, WordPress introduced an enhancement to how unique filenames are
calculated. The tl;dr of that change was to run `scandir()` on the
directory that a file will be placed in, and iterate over all files, to
check if there is any files that can potentially conflict with the newly
added file (or future resize variants).
In situations where you have many thousands of files in your monthly
uploads directories, or where the upload DIR path is particularly slow for
access (such as remote file systems) this `scandir()` can cause a large
performance overhead.
I propose we add a "pre filter" to `scandir()` to allow plugins to
override the file fetching behaviour. The current implementation is quite
wasteful, as it will do a list on the whole directory, but then call
`preg_match()` on each file with `^$filename*...`. In situations where
plugins can get file listings by other mechanisms, a file list for
`$dir/$filename*` would return many fewer results but provide the same
file list needed for `_wp_check_existing_file_names()` for example.
--
--
Ticket URL: <https://core.trac.wordpress.org/ticket/50587#comment:3>
WordPress Trac <https://core.trac.wordpress.org/>
WordPress publishing platform
More information about the wp-trac
mailing list