Php получение данных файла

stat

Собирает статистическую информацию о файле filename . Если filename является символической ссылкой, информация собирается о самом файле, а не ссылке. До PHP 7.4.0 в Windows NTS в данном случае строил статистику size , atime , mtime и ctime из символьной ссылки.

Функция lstat() идентична функции stat() за исключением того, что в данном случае она вернёт информацию о самой символической ссылке.

Список параметров

Возвращаемые значения

Формат результата работы функций stat() и fstat()

Числовой Ассоциативный Описание
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 .

Читайте также:  Reading text file in java line by line

***** В Windows бит разрешения на запись устанавливается в соответствии с атрибутом файла только для чтения, одно и то же значение сообщается для всех пользователей, группы и владельца. ACL не учитывается, в отличие от is_writable() .

Значение mode содержит информацию, читаемую несколькими функциями. При записи в восьмеричном виде, начиная справа, первые три цифры возвращаются функцией chmod() . Следующая цифра игнорируется PHP. Следующие две цифры указывают тип файла:

mode типов файлов
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’ );

/*
* Выводим последнее время доступа к файлу, это то же самое, что и
* вызов fileatime()
*/
echo ‘Последнее время доступа: ‘ . $stat [ ‘atime’ ];

/*
* Выводим время изменения файла, это то же самое, что и
* вызов filemtime()
*/
echo ‘Время изменения: ‘ . $stat [ ‘mtime’ ];

/* Выводим номер устройства */
echo ‘Номер устройства: ‘ . $stat [ ‘dev’ ];
?>

Пример #2 Использование информации из stat() вместе с touch()

/* Получаем статистику файла */
$stat = stat ( ‘C:\php\php.exe’ );

/* Удалось получить эту статистику? */
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
)

[filetype] => Array
(
[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
)
)

Источник

Оцените статью