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 = [/home/hogehoge/lang/php/file/dirname.php]
dirname = [/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]
5. file_exists ファイルの有無を調べる
file_exists ( string $filename ) : bool
指定した、ファイルが存在すれば「TRUE」、存在しなければ「FALSE」が返ります。
6. file_get_contents ファイルの内容を全て文字列に読み込む
file_get_contents ( string $filename [, bool $use_include_path = FALSE [, resource $context [, int $offset = 0 [, int $maxlen ]]]] ) : string
オープンしたり、クローズしたりの手間がないので、手っ取り早い。
7. file ファイル全体を読み込んで配列に格納する
「PHP: file - Manual」参照。
file(string $filename, int $flags = 0, resource $context = ?): array
「$filename」以外のオプション引数で、2番目の「$flags」に「FILE_IGNORE_NEW_LINES」を使用すると便利。
行末の改行を省略して取り込んでくれます。
下記のようなテキストファイルがあります。
aaaa
BBBB
cccc
これを、べたな入出力を使うと。
$fp = fopen('/パス/ファイル名', "r");
$array = array();
if (flock($fp, LOCK_EX))
{
while (($array[] = fgets($fp)) != false)
{
}
flock($fp, LOCK_UN);
}
fclose($fp);
print_r($array);
といささか長くなりますが、「file」で記述すると
$array = file('/パス/ファイル名', FILE_IGNORE_NEW_LINES);
print_r($array);
てな感じで、簡潔に書けます。
上の例は、改行込みで取得しちゃってますが、下の例は改行を取っ払っちゃってるので、「print_r」に余分な改行が入りません。
ちょっと気になるのが、上の例では、「flock」してロックをかけていますが、下は大丈夫かな?と。
まぁ、一発で読み込んでるし、組み込みの関数なので大丈夫なのかな。
下を実行すると下記の結果が得られます。
Array
(
[0] => aaaa
[1] => BBBB
[2] => cccc
)
8. fgetcsv CSV ファイルを1行読み込んで配列に格納する
fgetcsv(resource $stream, int $length = 0, string $separator = ",", string $enclosure = '"', string $escape = "\\"): array
先頭の「$tream」は必須で、有効なファイルポインタを渡します。
「$length」は、行の最大の長さ。
「$separator」は、デリミタ (シングルバイト文字 1 文字のみ) を設定。
「$enclosure」は、フィールド囲いこみ文字 (シングルバイト文字 1 文字のみ) を設定。
「$escape」は、エスケープ文字 (シングルバイト文字 最大で1文字) を設定。
aaaa,1,はじめ
BBBB,2,おわり
aaaa,1,はじめ
BBBB,2,おわり
てな、「.csv」ファイルがありまして
<?php
$fp = fopen(__DIR__."/file02.csv", "r");
if ($fp === FALSE)
{
return;
}
while (($array = fgetcsv($fp)) !== FALSE)
{
print_r($array);
}
fclose($fp);
てなソースを書きまして(ファイル名やディレクトリは正しいものとします)、実行すると、下記の結果が得られます。
Array
(
[0] => aaaa
[1] => 1
[2] => はじめ
)
Array
(
[0] => BBBB
[1] => 2
[2] => おわり
)
9. glob パターンにマッチするパス名を探す
詳細は、「PHP: glob - Manual」をご参照ください。
glob(string $pattern, int $flags = 0): array | false
「$pattern」の部分を、「'パス/*.*'」と書けば、「パス」内に存在するファイルをリストすることができます。
10. basename パスの最後にある名前の部分を返す
詳細は、「PHP: basename - Manual」をご参照ください。
basename(string $path, string $suffix = ""): string
/usr/bin/basename
と同じ動きをすると思って、問題ありません。
<?php
print(basename('/usr/local/etc/php.ini'));
を実行すると、下記の結果が得られます。
php.ini