stat
Собирает статистическую информацию о файле filename . Если filename является символической ссылкой, информация собирается о самом файле, а не ссылке. До PHP 7.4.0 в Windows NTS в данном случае строил статистику size , atime , mtime и ctime из символьной ссылки.
Функция lstat() идентична функции stat() за исключением того, что в данном случае она вернёт информацию о самой символической ссылке.
Список параметров
Возвращаемые значения
Числовой | Ассоциативный | Описание |
---|---|---|
0 | dev | номер устройства *** |
1 | ino | номер inode **** |
2 | mode | режим защиты inode ***** |
3 | nlink | количество ссылок |
4 | uid | userid владельца * |
5 | gid | groupid владельца * |
6 | rdev | тип устройства, если устройство inode |
7 | size | размер в байтах |
8 | atime | время последнего доступа (временная метка Unix) |
9 | mtime | время последней модификации (временная метка Unix) |
10 | ctime | время последнего изменения inode (временная метка Unix) |
11 | blksize | размер блока ввода-вывода файловой системы ** |
12 | blocks | количество используемых 512-байтных блоков ** |
* В Windows это всегда будет 0 .
** Доступен только на системах, поддерживающих тип st_blksize — другие системы (например, Windows) вернут -1 .
*** В Windows, начиная с PHP 7.4.0, это серийный номер тома, содержащего файл, который представляет собой 64-разрядное целое число без знака, поэтому может переполниться в 32-разрядных системах. Ранее это было числовое представление буквы диска (например, 2 для C: ) для stat() и 0 для lstat() .
**** В Windows, начиная с PHP 7.4.0, идентификатор, связанный с файлом, который представляет собой 64-разрядное целое число без знака, может переполниться в 32-разрядных системах. Ранее он всегда был 0 .
***** В Windows бит разрешения на запись устанавливается в соответствии с атрибутом файла только для чтения, одно и то же значение сообщается для всех пользователей, группы и владельца. ACL не учитывается, в отличие от is_writable() .
Значение mode содержит информацию, читаемую несколькими функциями. При записи в восьмеричном виде, начиная справа, первые три цифры возвращаются функцией chmod() . Следующая цифра игнорируется PHP. Следующие две цифры указывают тип файла:
mode в восьмеричном виде | Значение |
---|---|
0140000 | сокет |
0120000 | символическая ссылка |
0100000 | обычный файл |
0060000 | блочное устройство |
0040000 | директория |
0020000 | символьное устройство |
0010000 | fifo |
Так, например, обычный файл может быть 0100644 , а директория может быть 0040755 .
В случае возникновения ошибки stat() возвращает false .
Замечание: Так как тип integer в PHP является целым числом со знаком, и многие платформы используют 32-х битные целые числа, то некоторые функции файловых систем могут возвращать неожиданные результаты для файлов размером больше 2 Гб.
Ошибки
В случае возникновения ошибки будет сгенерирована ошибка уровня E_WARNING .
Список изменений
Версия | Описание |
---|---|
7.4.0 | В Windows номер устройства теперь является серийным номером тома, содержащего файл и номер inode — это идентификатор, связанный с файлом. |
7.4.0 | Статистика символьных ссылок size , atime , mtime и ctime всегда соответствует статистике целевого объекта. Это было ранее не характерно для NTS -сборки на Windows. |
Примеры
Пример #1 Пример использования stat()
/* Получаем статистику файла */
$stat = stat ( ‘C:\php\php.exe’ );
?php
/*
* Выводим последнее время доступа к файлу, это то же самое, что и
* вызов fileatime()
*/
echo ‘Последнее время доступа: ‘ . $stat [ ‘atime’ ];
/*
* Выводим время изменения файла, это то же самое, что и
* вызов filemtime()
*/
echo ‘Время изменения: ‘ . $stat [ ‘mtime’ ];
/* Выводим номер устройства */
echo ‘Номер устройства: ‘ . $stat [ ‘dev’ ];
?>
Пример #2 Использование информации из stat() вместе с touch()
/* Получаем статистику файла */
$stat = stat ( ‘C:\php\php.exe’ );
?php
/* Удалось получить эту статистику? */
if (! $stat ) echo ‘вызов stat() не удался. ‘ ;
> else /*
* Мы хотим увеличить время последнего доступа к файлу
* на 1 неделю вперёд.
*/
$atime = $stat [ ‘atime’ ] + 604800 ;
/* Касаемся файла */
if (! touch ( ‘some_file.txt’ , time (), $atime )) echo ‘Не удалось коснуться файла. ‘ ;
> else echo ‘touch() выполнился успешно. ‘ ;
>
>
?>
Примечания
Замечание:
Учтите, что обработка времени может отличаться в различных файловых системах.
Замечание: Результаты этой функции кешируются. Более подробную информацию смотрите в разделе clearstatcache() .
Начиная с PHP 5.0.0, эта функция также может быть использована с некоторыми обёртками url. Список обёрток, поддерживаемых семейством функций stat() , смотрите в разделе Поддерживаемые протоколы и обёртки.
Смотрите также
- lstat() — Возвращает информацию о файле или символической ссылке
- fstat() — Получает информацию о файле, используя открытый файловый указатель
- filemtime() — Возвращает время последнего изменения файла
- filegroup() — Получает идентификатор группы файла
- SplFileInfo
User Contributed Notes 18 notes
On GNU/Linux you can retrieve the number of currently running processes on the machine by doing a stat for hard links on the ‘/proc’ directory like so:
You can do the same thing in php by doing a stat on /proc and grabbing the [3] ‘nlink’ — number of links in the returned array.
Here is the function I’m using, it does a clearstatcache() when called more than once.
// check if php version supports clearstatcache params, but only check once
if ( is_null ( $ver ) )
$ver = version_compare ( PHP_VERSION , ‘5.3.0’ , ‘>=’ );
// Only call clearstatcache() if function called more than once */
if ( $runs ++ > 0 ) < // checks if $runs >0, then increments $runs by one.
// if php version is >= 5.3.0
if ( $ver ) clearstatcache ( true , ‘/proc’ );
> else // if php version is < 5.3.0
clearstatcache ();
>
>
// if stat succeeds and nlink value is present return it, otherwise return 0
return ( ( false !== $stat && isset( $stat [ 3 ] ) ) ? $stat [ 3 ] : 0 );
>
?>
Example #1 get_process_count() example
$num_procs = get_process_count ();
var_dump ( $num_procs );
?>
The above example will output:
Which is the number of processes that were running.
This is a souped up ‘stat’ function based on
many user-submitted code snippets and
@ http://www.askapache.com/security/chmod-stat.html
Give it a filename, and it returns an array like stat.
clearstatcache ();
$ss =@ stat ( $file );
if(! $ss ) return false ; //Couldnt stat file
$ts =array(
0140000 => ‘ssocket’ ,
0120000 => ‘llink’ ,
0100000 => ‘-file’ ,
0060000 => ‘bblock’ ,
0040000 => ‘ddir’ ,
0020000 => ‘cchar’ ,
0010000 => ‘pfifo’
);
$p = $ss [ ‘mode’ ];
$t = decoct ( $ss [ ‘mode’ ] & 0170000 ); // File Encoding Bit
$s =array(
‘perms’ =>array(
‘umask’ => sprintf ( «%04o» ,@ umask ()),
‘human’ => $str ,
‘octal1’ => sprintf ( «%o» , ( $ss [ ‘mode’ ] & 000777 )),
‘octal2’ => sprintf ( «0%o» , 0777 & $p ),
‘decimal’ => sprintf ( «%04o» , $p ),
‘fileperms’ =>@ fileperms ( $file ),
‘mode1’ => $p ,
‘mode2’ => $ss [ ‘mode’ ]),
‘owner’ =>array(
‘fileowner’ => $ss [ ‘uid’ ],
‘filegroup’ => $ss [ ‘gid’ ],
‘owner’ =>
( function_exists ( ‘posix_getpwuid’ ))?
@ posix_getpwuid ( $ss [ ‘uid’ ]): » ,
‘group’ =>
( function_exists ( ‘posix_getgrgid’ ))?
@ posix_getgrgid ( $ss [ ‘gid’ ]): »
),
‘file’ =>array(
‘filename’ => $file ,
‘realpath’ =>(@ realpath ( $file ) != $file ) ? @ realpath ( $file ) : » ,
‘dirname’ =>@ dirname ( $file ),
‘basename’ =>@ basename ( $file )
),
‘filetype’ =>array(
‘type’ => substr ( $ts [ octdec ( $t )], 1 ),
‘type_octal’ => sprintf ( «%07o» , octdec ( $t )),
‘is_file’ =>@ is_file ( $file ),
‘is_dir’ =>@ is_dir ( $file ),
‘is_link’ =>@ is_link ( $file ),
‘is_readable’ => @ is_readable ( $file ),
‘is_writable’ => @ is_writable ( $file )
),
‘device’ =>array(
‘device’ => $ss [ ‘dev’ ], //Device
‘device_number’ => $ss [ ‘rdev’ ], //Device number, if device.
‘inode’ => $ss [ ‘ino’ ], //File serial number
‘link_count’ => $ss [ ‘nlink’ ], //link count
‘link_to’ =>( $s [ ‘type’ ]== ‘link’ ) ? @ readlink ( $file ) : »
),
‘size’ =>array(
‘size’ => $ss [ ‘size’ ], //Size of file, in bytes.
‘blocks’ => $ss [ ‘blocks’ ], //Number 512-byte blocks allocated
‘block_size’ => $ss [ ‘blksize’ ] //Optimal block size for I/O.
),
‘time’ =>array(
‘mtime’ => $ss [ ‘mtime’ ], //Time of last modification
‘atime’ => $ss [ ‘atime’ ], //Time of last access.
‘ctime’ => $ss [ ‘ctime’ ], //Time of last status change
‘accessed’ =>@ date ( ‘Y M D H:i:s’ , $ss [ ‘atime’ ]),
‘modified’ =>@ date ( ‘Y M D H:i:s’ , $ss [ ‘mtime’ ]),
‘created’ =>@ date ( ‘Y M D H:i:s’ , $ss [ ‘ctime’ ])
),
);
Array(
[perms] => Array
(
[umask] => 0022
[human] => -rw-r—r—
[octal1] => 644
[octal2] => 0644
[decimal] => 100644
[fileperms] => 33188
[mode1] => 33188
[mode2] => 33188
)
(
[type] => file
[type_octal] => 0100000
[is_file] => 1
[is_dir] =>
[is_link] =>
[is_readable] => 1
[is_writable] => 1
) [owner] => Array
(
[fileowner] => 035483
[filegroup] => 23472
[owner_name] => askapache
[group_name] => grp22558
) [file] => Array
(
[filename] => /home/askapache/askapache-stat/htdocs/ok/g.php
[realpath] =>
[dirname] => /home/askapache/askapache-stat/htdocs/ok
[basename] => g.php
) [device] => Array
(
[device] => 25
[device_number] => 0
[inode] => 92455020
[link_count] => 1
[link_to] =>
) [size] => Array
(
[size] => 2652
[blocks] => 8
[block_size] => 8192
) [time] => Array
(
[mtime] => 1227685253
[atime] => 1227685138
[ctime] => 1227685253
[accessed] => 2008 Nov Tue 23:38:58
[modified] => 2008 Nov Tue 23:40:53
[created] => 2008 Nov Tue 23:40:53
)
)