php - よく使う関数 - ファイルシステム

 
1. fileXtime ファイルの日時を参照する
2. parse_ini_file ini ファイルの読み込み
3. dirname 親ディレクトリのパスを返す
4. chdir カレントディレクトリを変更する

1. fileXtime ファイルの日時を参照する

 ファイルの日時には、参照日時・更新日時・作成日時の3種類あります。  作成日時は正確には「PHP: filectime - Manual」にあるように最終 inode 変更日時なのですが、作成日時と考えて差し支えないと思います。

int fileatime ( string $filename )		←	参照日時
int filemtime ( string $filename )		←	更新日時
int filectime ( string $filename )		←	作成日時
 説明しにくいので PHP のマニュアルをそのまま丸写しします。  fileatime(参照日時)
 指定したファイルの最終アクセス時刻を取得します。
 filemtime(更新日時)
 この関数は、ファイルのブロックデータが書き込まれた時間を返します。 これは、ファイルの内容が変更された際の時間です。
 filectime(作成日時)
 ファイルの inode 変更時刻を取得します。

注意:
 多くの Unix ファイルシステムでは、i-ノードが変更された際、つまり、 パーミッション、所有者、グループ、または他のメタデータが書き込まれた際に、 ファイルが変更されたとみなされます。 filemtime() (この関数は、Web ページ上に "最終更新時刻" を表示させたい場合に使用するものです) および fileatime() も参照ください。

注意:
 いくつかの Unix では、ファイルの ctime はファイルの作成時間として参照されます。 これは間違っています。多くの Unix ファイルシステムでは Unix ファイルの作成時間は存在しません。

注意:
 時刻の精度は、 ファイルシステムによって異なることがあります。

> ls -l .cshrc_bak
-rw-r--r--  1 hogehoge  hogehoge  1164  3月 10  2018 .cshrc_bak
> stat -x .cshrc_bak
  File: ".cshrc_bak"
  Size: 1164         FileType: Regular File
  Mode: (0644/-rw-r--r--)         Uid: ( 1018/hogehoge)  Gid: ( 1018/hogehoge)
Device: 0,89   Inode: 9075158    Links: 1
Access: Fri Apr 13 17:25:58 2018
Modify: Sat Mar 10 11:25:37 2018
Change: Fri Apr 13 17:28:42 2018
 という状況で、下記のソースを書いて実行すると
<?php
$filename = './.cshrc_bak';

print("fileatime:" . date("Y年m月d日 H:i:s", fileatime($filename)) . "\n");
print("filemtime:" . date("Y年m月d日 H:i:s", filemtime($filename)) . "\n");
print("filectime:" . date("Y年m月d日 H:i:s", filectime($filename)) . "\n");

?>
 以下の結果が得られます。

fileatime:2018年04月13日 17:25:58
filemtime:2018年03月10日 11:25:37
filectime:2018年04月13日 17:28:42

2. parse_ini_file ini ファイルの読み込み

 マニュアルは「PHP: parse_ini_file - Manual」に記載されています。

array parse_ini_file ( string $filename [, bool $process_sections = FALSE [, int $scanner_mode = INI_SCANNER_NORMAL ]] )
 $filename で指定したファイルを PHP の php.ini ファイルと同じ書式で読み込んで、配列の形式で返します。  配列の中身は、連想配列になっているようです。  2番目の引数は、省略すると false になりますが、true を指定するとセクションごとの連想配列になります。
[parse_ini_file]

a = hoge
b = fuga
c = #piyo
d = !moge
e = '!moge'

[FOO]

f = bar



 という .ini ファイルを用意し
<?php
$dir = dirname(__FILE__);
$inifile = $dir.'/parse_ini_file.ini';

$array = parse_ini_file($inifile);
print_r($array);

$array = parse_ini_file($inifile, true);
print_r($array);
?>

 というソースを書いて実行すると下記の結果が得られます。
Array
(
    [a] => hoge
    [b] => fuga
    [c] => #piyo
    [d] => 1
    [e] => !moge
    [f] => bar
)
Array
(
    [parse_ini_file] => Array
        (
            [a] => hoge
            [b] => fuga
            [c] => #piyo
            [d] => 1
            [e] => !moge
        )

    [FOO] => Array
        (
            [f] => bar
        )

)
 注意すべきは、! の表記があるときの動きです。  マニュアルのどこかに書いているとは思うのですが、見つけられませんでした。  要は特殊文字があるときは、シングルコーテーションで囲んだ方がいいようです。  \ コードをつけてエスケープしようとしたのですが、これはエラーになりました。

3. dirname 親ディレクトリのパスを返す

 本項は「PHP・ファイル名・パスなどの取得」を参考にさせていただきました。  マニュアルは「PHP: dirname - Manual」になります。
<?php

$filename = __FILE__;

print('$filename = '."[$filename] \n");
print('dirname   = ['.dirname($filename)."] \n");
?>
 というソースを書いて実行すると下記の結果が得られます。
$filename = [/usr/home/hogehoge/lang/php/file/dirname.php]
dirname   = [/usr/home/hogehoge/lang/php/file]

4. chdir カレントディレクトリを変更する

 composer(「php - composer(パッケージ管理)」)で管理しているライブラリがウェブサーバのドキュメントディレクトリやシステムライブラリで定義しているディレクトリと異なるときに便利です。  require でインクルードさせるのに相対ディレクトリで書いていても、dirname と chdir を組み合わせることで柔軟に対応できます。
<?php
$directory = dirname(__FILE__);
chdir($directory);

require './chdirsub.php';

chdirsub();
?>
 上記のソースと下記のソース(ファイル名が chdirsub.php)を同一のディレクトリに置いて
<?php
function chdirsub() : void
{
	print("[".__FUNCTION__."][".__LINE__."]\n");
}
?>
 実行すると下記の結果が得られます。
[chdirsub][4]