recurse_dirsize() │ WP 3.0.0 Рекурсивно отримує розмір директорії у байтах. Тобто. можна вказати батьківську папку та отримати повні її розміри: включаючи вкладені папки.
Для роботи функції може знадобитися підключити файл:
require_once ABSPATH. WPINC.'/functions.php'; Повертає int|false|null
. Розмір у байтах. Якщо директорії не існує, то поверне fales.
Використання recurse_dirsize( $directory, $exclude, $max_execution_time, $directory_cache );
$directory
(рядок) (обов’язковий)
Повний шлях до каталогу (папки).
$exclude
(рядок)
Повний шлях до вкладених папок, розмір яких не потрібно враховувати.
Типово: null
$max_execution_time
(число) (WP 5.2)
Максимальний час виконання за секунди. Час вважається, починаючи від глобальної точки відліку (коли WP тільки почав завантажуватися – константа
WP_START_TIMESTAMP ).
За замовчуванням: null – ini_get( ‘max_execution_time’ )
& $directory_cache
(масив) (WP 5.6)
Масив шляхів директорій, розмір яких кешується. Використовується функцією під час рекурсії. Приклади #1 Отримаємо повний розмір каталогу завантажень uploads $upload_dir = (object) wp_upload_dir();
// Підключимо файл функції
require_once ABSPATH. WPINC .'/ms-functions.php';
$mb = recurse_dirsize($upload_dir->basedir);
echo number_format ($ mb / (1024 * 1024), 1). MB'; // виведе: 74.5 MB
Додати свій приклад
список змінЗ версії 3.0.0 Введено. З версії 4.3.0 The $exclude parameter був added. З версії 5.2.0 $max_execution_time parameter був added.З версії 5.6.0 $directory_cache parameter був added.
Код recurse_dirsize() recurse dirsize WP 6.0.2 function recurse_dirsize( $directory, $exclude = null, $max_execution_time = null, &$directory_cache = null ) {
$directory = untrailingslashit( $directory );
$save_cache = false;
if (! isset($directory_cache)) {
$directory_cache = get_transient( 'dirsize_cache');
$save_cache = true;
}
if ( isset( $directory_cache[ $directory ] ) && is_int( $directory_cache[ $directory ] ) ) {
return $directory_cache[$directory];
}
if ( ! file_exists( $directory ) || ! is_dir( $directory ) || ! is_readable( $directory ) ) {
return false;
}
if (
( is_string( $exclude ) && $directory === $exclude ) ||
( is_array( $exclude ) && in_array( $directory, $exclude, true ) )
) {
return false;
}
if ( null === $max_execution_time ) {
// Keep the previous behavior but attempt to prevent fatal errors from timeout if possible.
if ( function_exists( 'ini_get' ) ) {
$max_execution_time = ini_get( 'max_execution_time');
} else {
// Disable...
$max_execution_time = 0;
}
// Leave 1 second "buffer" для інших операцій if $max_execution_time має reasonable value.
if ( $max_execution_time > 10 ) {
$max_execution_time -= 1;
}
}
/**
* Filters за рахунок програвання простору, використовуваних одним директором і всі його дітей, в мегабайтах.
*
* Відновити поточний використовуваний простір до шорт-завершення recursive PHP file size calculation
* І використовуйте деякий власний, як CDN API або природні операційні системи інструментів для більшої ефективності.
*
* @ Since 5.6.0
*
* @param int | false $space_used За допомогою використовуваного простору в кімнатах. Default false.
* @param string $directory Full path of a directory.
* @param string|string[]|null $exclude Повна cestа до subdirectory до вилучення з повного,
* або array of paths.
* @param int $max_execution_time Maximum time to run before giving up. In seconds.
* @param array $directory_cache Array of cached directory paths.
*/
$size = apply_filters( 'pre_recurse_dirsize', false, $directory, $exclude, $max_execution_time, $directory_cache );
if ( false === $size ) {
$ size = 0;
$handle = opendir($directory);
if ($handle) {
while (($file = readdir($handle))! == false) {
$ path = $ directory . '/'. $ file;
if ( '.' !== $file && '..' !== $file ) {
if ( is_file ( $ path ) ) {
$ size + = filesize ($ path);
} elseif ( is_dir ( $ path ) ) {
$handlesize = recurse_dirsize( $path, $exclude, $max_execution_time, $directory_cache );
if ($handlesize > 0) {
$size += $handlesize;
}
}
if ( $max_execution_time > 0 &&
( microtime ( true ) - WP_START_TIMESTAMP ) > $max_execution_time
) {
// Time exceeded. Give up instead of risking a fatal timeout.
$ size = null;
break;
}
}
}
closedir($handle);
}
}
if ( ! is_array( $directory_cache ) ) {
$directory_cache = array();
}
$directory_cache[ $directory ] = $size;
// Тільки перевірте transient на верхньому рівні call і не on recursive calls.
if ( $save_cache ) {
set_transient('dirsize_cache', $directory_cache);
}
return $size;
} Зв’язані функції