PHP에서 디렉터리 크기를 가져오는 방법
function foldersize($path) {
$total_size = 0;
$files = scandir($path);
foreach($files as $t) {
if (is_dir(rtrim($path, '/') . '/' . $t)) {
if ($t<>"." && $t<>"..") {
$size = foldersize(rtrim($path, '/') . '/' . $t);
$total_size += $size;
}
} else {
$size = filesize(rtrim($path, '/') . '/' . $t);
$total_size += $size;
}
}
return $total_size;
}
function format_size($size) {
$mod = 1024;
$units = explode(' ','B KB MB GB TB PB');
for ($i = 0; $size > $mod; $i++) {
$size /= $mod;
}
return round($size, 2) . ' ' . $units[$i];
}
$SIZE_LIMIT = 5368709120; // 5 GB
$sql="select * from users order by id";
$result=mysql_query($sql);
while($row=mysql_fetch_array($result)) {
$disk_used = foldersize("C:/xampp/htdocs/freehosting/".$row['name']);
$disk_remaining = $SIZE_LIMIT - $disk_used;
print 'Name: ' . $row['name'] . '<br>';
print 'diskspace used: ' . format_size($disk_used) . '<br>';
print 'diskspace left: ' . format_size($disk_remaining) . '<br><hr>';
}
스크립트 실행이 완료될 때까지 프로세서 사용률이 너무 높거나 100% 상승하는 이유를 알고 계십니까?최적화할 수 있는 방법이 있습니까?아니면 폴더와 폴더 사이즈를 확인할 수 있는 다른 방법이 있나요?
function GetDirectorySize($path){
$bytestotal = 0;
$path = realpath($path);
if($path!==false && $path!='' && file_exists($path)){
foreach(new RecursiveIteratorIterator(new RecursiveDirectoryIterator($path, FilesystemIterator::SKIP_DOTS)) as $object){
$bytestotal += $object->getSize();
}
}
return $bytestotal;
}
Janith Chinthana가 제안한 것과 같은 생각입니다.몇 가지 수정 사항:
- 변환
$path
실제 경로로 - 경로가 올바르고 폴더가 존재하는 경우에만 반복 수행
- 스킵
.
그리고...
파일 - 퍼포먼스에 최적화
Windows 호스트의 경우:
<?
$f = 'f:/www/docs';
$obj = new COM ( 'scripting.filesystemobject' );
if ( is_object ( $obj ) )
{
$ref = $obj->getfolder ( $f );
echo 'Directory: ' . $f . ' => Size: ' . $ref->size;
$obj = null;
}
else
{
echo 'can not create object';
}
?>
또는 Linux 호스트인 경우:
<?
$f = './path/directory';
$io = popen ( '/usr/bin/du -sk ' . $f, 'r' );
$size = fgets ( $io, 4096);
$size = substr ( $size, 0, strpos ( $size, "\t" ) );
pclose ( $io );
echo 'Directory: ' . $f . ' => Size: ' . $size;
?>
php filesize 및 RecursiveIteratorIterator를 사용한 디렉토리 크기.
이것은 php 5 이상의 버전을 가진 모든 플랫폼에서 작동합니다.
/**
* Get the directory size
* @param string $directory
* @return integer
*/
function dirSize($directory) {
$size = 0;
foreach(new RecursiveIteratorIterator(new RecursiveDirectoryIterator($directory)) as $file){
$size+=$file->getSize();
}
return $size;
}
순수한 php 예시입니다.
<?php
$units = explode(' ', 'B KB MB GB TB PB');
$SIZE_LIMIT = 5368709120; // 5 GB
$disk_used = foldersize("/webData/users/vdbuilder@yahoo.com");
$disk_remaining = $SIZE_LIMIT - $disk_used;
echo("<html><body>");
echo('diskspace used: ' . format_size($disk_used) . '<br>');
echo( 'diskspace left: ' . format_size($disk_remaining) . '<br><hr>');
echo("</body></html>");
function foldersize($path) {
$total_size = 0;
$files = scandir($path);
$cleanPath = rtrim($path, '/'). '/';
foreach($files as $t) {
if ($t<>"." && $t<>"..") {
$currentFile = $cleanPath . $t;
if (is_dir($currentFile)) {
$size = foldersize($currentFile);
$total_size += $size;
}
else {
$size = filesize($currentFile);
$total_size += $size;
}
}
}
return $total_size;
}
function format_size($size) {
global $units;
$mod = 1024;
for ($i = 0; $size > $mod; $i++) {
$size /= $mod;
}
$endIndex = strpos($size, ".")+3;
return substr( $size, 0, $endIndex).' '.$units[$i];
}
?>
function get_dir_size($directory){
$size = 0;
$files = glob($directory.'/*');
foreach($files as $path){
is_file($path) && $size += filesize($path);
is_dir($path) && $size += get_dir_size($path);
}
return $size;
}
Jonathan Sampson, Adam Pierce 및 Janith Chinthana 덕분에 디렉토리 크기를 얻기 위한 가장 뛰어난 방법을 확인할 수 있었습니다.Windows 및 Linux 호스트에서 작동합니다.
static function getTotalSize($dir)
{
$dir = rtrim(str_replace('\\', '/', $dir), '/');
if (is_dir($dir) === true) {
$totalSize = 0;
$os = strtoupper(substr(PHP_OS, 0, 3));
// If on a Unix Host (Linux, Mac OS)
if ($os !== 'WIN') {
$io = popen('/usr/bin/du -sb ' . $dir, 'r');
if ($io !== false) {
$totalSize = intval(fgets($io, 80));
pclose($io);
return $totalSize;
}
}
// If on a Windows Host (WIN32, WINNT, Windows)
if ($os === 'WIN' && extension_loaded('com_dotnet')) {
$obj = new \COM('scripting.filesystemobject');
if (is_object($obj)) {
$ref = $obj->getfolder($dir);
$totalSize = $ref->size;
$obj = null;
return $totalSize;
}
}
// If System calls did't work, use slower PHP 5
$files = new \RecursiveIteratorIterator(new \RecursiveDirectoryIterator($dir));
foreach ($files as $file) {
$totalSize += $file->getSize();
}
return $totalSize;
} else if (is_file($dir) === true) {
return filesize($dir);
}
}
나는 이 방법이 더 짧고 호환성이 있다는 것을 알았다.Mac OS X 버전의 "du"는 어떤 이유로 -b(또는 --bytes) 옵션을 지원하지 않으므로 호환성이 더 높은 -k 옵션을 사용합니다.
$file_directory = './directory/path';
$output = exec('du -sk ' . $file_directory);
$filesize = trim(str_replace($file_directory, '', $output)) * 1024;
$filesize를 바이트 단위로 반환합니다.
이 투고에는 이미 많은 답변이 있습니다만, 디렉토리내의 모든 파일 사이즈의 합계만을 반환하는 unix 호스트용의 다른 옵션을 추가할 필요가 있다고 생각합니다(재귀적으로).
조나단의 답변을 보시면du
명령어를 입력합니다.이 명령어는 총 디렉토리 크기를 반환하지만 다른 사용자가 게시한 순수 PHP 솔루션은 모든 파일 크기의 합계를 반환합니다.큰 차이!
주의해야 할 점
실행 시du
새로 생성된 디렉토리로 반환될 수 있습니다.4K
대신0
이것은, 문제의 디렉토리에서 파일을 삭제하면, 한층 더 혼란스러울 가능성이 있습니다.du
총 디렉터리 크기가 파일 크기 합계와 일치하지 않음을 보고합니다. 이유가 무엇입니까?명령어du
는, 이 투고에 대해서 Hermann Ingjaldsson이 코멘트한 대로, 파일 설정에 근거해 리포트를 반환합니다.
해결 방법
여기에 게시된 일부 PHP 전용 스크립트와 같은 기능을 하는 솔루션을 형성하려면ls
을 로 부르다awk
음음음같 뭇매하다
ls -ltrR /path/to/dir |awk '{print \$5}'|awk 'BEGIN{sum=0} {sum=sum+\$1} END {print sum}'
PHP 함수로서 다음과 같은 것을 사용할 수 있습니다.
function getDirectorySize( $path )
{
if( !is_dir( $path ) ) {
return 0;
}
$path = strval( $path );
$io = popen( "ls -ltrR {$path} |awk '{print \$5}'|awk 'BEGIN{sum=0} {sum=sum+\$1} END {print sum}'", 'r' );
$size = intval( fgets( $io, 80 ) );
pclose( $io );
return $size;
}
Johnathan Sampson의 Linux 예는 나에게 그다지 좋지 않았다.다음은 개선된 버전입니다.
function getDirSize($path)
{
$io = popen('/usr/bin/du -sb '.$path, 'r');
$size = intval(fgets($io,80));
pclose($io);
return $size;
}
그것은 완벽하게 잘 작동한다.
public static function folderSize($dir)
{
$size = 0;
foreach (glob(rtrim($dir, '/') . '/*', GLOB_NOSORT) as $each) {
$func_name = __FUNCTION__;
$size += is_file($each) ? filesize($each) : static::$func_name($each);
}
return $size;
}
스크립트를 최적화하려면 다음과 같은 몇 가지 작업을 수행할 수 있습니다. 그러나 최대한의 성공을 거두면 스크립트는 CPU 바인딩이 아닌 IO 바인딩이 됩니다.
- 해 보세요.
rtrim($path, '/')
루프 밖에 있습니다. - 만들다
if ($t<>"." && $t<>"..")
테스트 - - 해 보세요.
rtrim($path, '/') . '/' . $t
1번 - 2번 1)번으로 하다. - 해 보세요.
explode(' ','B KB MB GB TB PB');
각화통 서이? ??? ???
PHP가 디렉터리 크기 가져오기(FTP 액세스 포함)
열심히 일한 결과, 이 코드는 잘 작동합니다!!!커뮤니티와 공유하고 싶다(Mundial의)시스템)
function dirFTPSize($ftpStream, $dir) {
$size = 0;
$files = ftp_nlist($ftpStream, $dir);
foreach ($files as $remoteFile) {
if(preg_match('/.*\/\.\.$/', $remoteFile) || preg_match('/.*\/\.$/', $remoteFile)){
continue;
}
$sizeTemp = ftp_size($ftpStream, $remoteFile);
if ($sizeTemp > 0) {
$size += $sizeTemp;
}elseif($sizeTemp == -1){//directorio
$size += dirFTPSize($ftpStream, $remoteFile);
}
}
return $size;
}
$hostname = '127.0.0.1'; // or 'ftp.domain.com'
$username = 'username';
$password = 'password';
$startdir = '/public_html'; // absolute path
$files = array();
$ftpStream = ftp_connect($hostname);
$login = ftp_login($ftpStream, $username, $password);
if (!$ftpStream) {
echo 'Wrong server!';
exit;
} else if (!$login) {
echo 'Wrong username/password!';
exit;
} else {
$size = dirFTPSize($ftpStream, $startdir);
}
echo number_format(($size / 1024 / 1024), 2, '.', '') . ' MB';
ftp_close($ftpStream);
좋은 코드야!페르난도
객체 지향 접근법:
/**
* Returns a directory size
*
* @param string $directory
*
* @return int $size directory size in bytes
*
*/
function dir_size($directory)
{
$size = 0;
foreach(new RecursiveIteratorIterator(new RecursiveDirectoryIterator($directory)) as $file)
{
$size += $file->getSize();
}
return $size;
}
빠르고 격앙된 접근법:
function dir_size2($dir)
{
$line = exec('du -sh ' . $dir);
$line = trim(str_replace($dir, '', $line));
return $line;
}
메인 디렉토리 및 메인 디렉토리 내의 모든 서브 폴더에 액세스하도록 코드가 조정되었습니다.이렇게 하면 전체 디렉토리 크기가 반환됩니다.
function get_dir_size($directory){
$size = 0;
$files= glob($directory.'/*');
foreach($files as $path){
is_file($path) && $size += filesize($path);
if (is_dir($path))
{
$size += get_dir_size($path);
}
}
return $size;
}
Linux에서 호스트되는 경우:
passthru('du -h -s ' . $DIRECTORY_PATH)
포어치보다 낫다
Johnathan Sampson의 Linux 예에 대해서는 "du" 함수의 결과를 처음 볼 때 크기가 2GB 이상이면 2GB가 계속 표시됩니다.
대체:
$totalSize = intval(fgets($io, 80));
기준:
strtok(fgets($io, 80), " ");
"du" 함수는 공백으로 구분된 크기와 디렉토리/파일 이름을 반환합니다.
네이티브 php 함수를 사용하는 다른 함수입니다.
function dirSize($dir)
{
$dirSize = 0;
if(!is_dir($dir)){return false;};
$files = scandir($dir);if(!$files){return false;}
$files = array_diff($files, array('.','..'));
foreach ($files as $file) {
if(is_dir("$dir/$file")){
$dirSize += dirSize("$dir/$file");
}else{
$dirSize += filesize("$dir/$file");
}
}
return $dirSize;
}
메모: 이 함수는 디스크의 크기가 아니라 파일 크기를 반환합니다.
Nate Hugs의 답변에서 진화하여 프로젝트용으로 짧은 기능을 만들었습니다.
function uf_getDirSize($dir, $unit = 'm')
{
$dir = trim($dir, '/');
if (!is_dir($dir)) {
trigger_error("{$dir} not a folder/dir/path.", E_USER_WARNING);
return false;
}
if (!function_exists('exec')) {
trigger_error('The function exec() is not available.', E_USER_WARNING);
return false;
}
$output = exec('du -sb ' . $dir);
$filesize = (int) trim(str_replace($dir, '', $output));
switch ($unit) {
case 'g': $filesize = number_format($filesize / 1073741824, 3); break; // giga
case 'm': $filesize = number_format($filesize / 1048576, 1); break; // mega
case 'k': $filesize = number_format($filesize / 1024, 0); break; // kilo
case 'b': $filesize = number_format($filesize, 0); break; // byte
}
return ($filesize + 0);
}
원라이너 솔루션결과는 바이트 단위입니다.
$size=array_sum(array_map('filesize', glob("{$dir}/*.*")));
추가 보너스: 파일 마스크를 원하는 대로 변경하고 특정 파일만 셀 수 있습니다(예: 확장자).
이것은, 사용하고 있는 프로그래밍 언어에 관계없이, 디렉토리 사이즈를 검출할 수 있는 가장 간단한 알고리즘입니다.PHP 고유의 실장용.[ Calculate Directory Size in PHP ]| [ Algorithm ]| [ Working Code ]으로 이동합니다.
언급URL : https://stackoverflow.com/questions/478121/how-to-get-directory-size-in-php
'programing' 카테고리의 다른 글
GitHub에서 호스트되는 외부 JavaScript 파일 링크 및 실행 (0) | 2022.11.17 |
---|---|
mysql: 특정 데이터베이스에 대해 열려 있는 모든 연결을 볼 수 있습니까? (0) | 2022.11.17 |
mysql 서브쿼리에서 outer column을 액세스하는 방법은 무엇입니까? (0) | 2022.11.16 |
NumPy의 einsum에 대해서 (0) | 2022.11.16 |
발생 전에 window.setTimeout()을 취소/정지합니다. (0) | 2022.11.16 |