recurse_dirsize() WP 3.0.0

Рекурсивно отримує розмір директорії у байтах. Тобто. можна вказати батьківську папку та отримати повні її розміри: включаючи вкладені папки.

З WP 5.6. результат кешується в тимчасову опцію: get_transient(‘dirsize_cache’) .

Є основою однотипної функції get_dirsize() .

Для роботи функції може знадобитися підключити файл:

require_once ABSPATH. WPINC.'/functions.php';

Основа для:
get_dirsize()

Хуки з функції

Повертає

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)
Масив шляхів директорій, розмір яких кешується. Використовується функцією під час рекурсії.

Приклади

0

#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.0The $exclude parameter був added.
З версії 5.2.0$max_execution_time parameter був added.
З версії 5.6.0$directory_cache parameter був added.

Код 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;
}

Залишити відповідь

Ваша e-mail адреса не оприлюднюватиметься. Обов’язкові поля позначені *