【PHP8.x】touch関数の使い方

touch関数の使い方について、初心者にもわかりやすく解説します。

作成日: 更新日:

基本的な使い方

touch関数は、指定されたファイルの最終アクセス時刻および最終変更時刻を更新する関数です。この関数は、主にファイルのタイムスタンプを現在の時刻に設定するために使用されます。もし指定されたファイルが存在しない場合、touch関数は、そのパスに新しい空のファイルを自動的に作成します。

この関数には、操作対象のファイルパスを文字列で指定する必須の引数 $filename があります。オプションとして、2つの整数引数を指定できます。2番目の引数 $time は、ファイルの最終変更時刻をUNIXタイムスタンプ形式で指定します。この引数を省略した場合、現在のシステムの時刻が使用されます。3番目の引数 $atime は、ファイルの最終アクセス時刻をUNIXタイムスタンプ形式で指定します。これも省略された場合、現在のシステムの時刻が使用されます。

touch関数は、処理が成功した場合には true を返し、ファイルが存在しない状態で新しいファイルの作成に失敗した場合や、ファイルが存在するがタイムスタンプの更新に失敗した場合など、何らかのエラーが発生した場合には false を返します。ファイルに対する書き込み権限や、新しいファイルを作成するためのディレクトリへの書き込み権限が必要であることに留意してください。システムエンジニアにとって、ファイルのライフサイクル管理やバックアップ処理などで、ファイルのタイムスタンプを操作する必要がある場合に役立ちます。

構文(syntax)

1touch(string $filename, ?int $mtime = null, ?int $atime = null): bool

引数(parameters)

string $filename, ?int $mtime = null, ?int $atime = null

  • string $filename: タイムスタンプを更新するファイルの名前を指定します。
  • ?int $mtime = null: ファイルの最終更新時刻を指定します。指定しない場合は、現在の時刻が使用されます。
  • ?int $atime = null: ファイルの最終アクセス時刻を指定します。指定しない場合は、現在の時刻が使用されます。

戻り値(return)

bool

指定されたファイルへのタッチ操作(更新時刻の変更または新規作成)が成功した場合はtrue、失敗した場合はfalseを返します。

サンプルコード

PHP touch関数でファイル作成・更新する

1<?php
2
3/**
4 * touch() 関数の基本的な使用例。
5 * ファイルが存在しない場合は新規作成し、存在する場合はアクセス時刻と変更時刻を現在の時刻に更新します。
6 */
7
8// 操作対象のファイル名を定義します。
9// このスクリプトと同じディレクトリにファイルが作成されます。
10$filename = 'my_example_file.txt';
11
12echo "ファイル '{$filename}' の操作を開始します。" . PHP_EOL;
13
14// touch() 関数を呼び出し、ファイルの作成または更新を試みます。
15// 成功した場合は true、失敗した場合は false を返します。
16if (touch($filename)) {
17    echo "成功: ファイル '{$filename}' が正常に作成または更新されました。" . PHP_EOL;
18    
19    // オプション: ファイルが実際に存在するか確認します。
20    if (file_exists($filename)) {
21        echo "確認: ファイル '{$filename}' は現在ディスク上に存在します。" . PHP_EOL;
22    }
23    
24    // 注意: このサンプルコードによって作成されたファイルを削除するには、
25    // 以下の `unlink()` 関数の行のコメントアウトを外し、再度スクリプトを実行してください。
26    /*
27    if (unlink($filename)) {
28        echo "クリーンアップ: ファイル '{$filename}' が削除されました。" . PHP_EOL;
29    } else {
30        echo "警告: ファイル '{$filename}' の削除に失敗しました。" . PHP_EOL;
31    }
32    */
33
34} else {
35    echo "エラー: ファイル '{$filename}' の作成または更新に失敗しました。" . PHP_EOL;
36    echo "原因として、書き込み権限がないか、指定されたパスが無効な可能性があります。" . PHP_EOL;
37}
38
39echo "処理を終了します。" . PHP_EOL;
40
41?>

PHPのtouch関数は、ファイルが存在しない場合は新しく作成し、すでに存在する場合はそのファイルの最終変更時刻と最終アクセス時刻を更新するために使用される関数です。

最初の引数$filenameには、操作したいファイルのパスを文字列で指定します。この引数は必須です。オプションの引数として、$mtimeで最終変更時刻を、$atimeで最終アクセス時刻をUNIXタイムスタンプ形式で指定できます。これらのオプションを省略した場合、現在時刻が設定されます。

この関数は、処理が成功した場合はtrueを、ファイルが存在しないか書き込み権限がないなど、何らかの理由で失敗した場合はfalseをブール値として返します。

提供されたサンプルコードでは、my_example_file.txtというファイルを指定してtouch関数を呼び出しています。これにより、ファイルが存在しない場合は新規に作成され、すでに存在する場合はタイムスタンプが現在の時刻に更新されます。if文でtouch関数の戻り値をチェックすることで、ファイル操作が成功したか失敗したかを判別し、その結果に応じたメッセージを出力しています。これにより、プログラムはファイル操作の成否を正確に把握し、次の処理へ進むことができます。ファイルシステムの操作において非常に基本的な、かつ重要な関数の一つです。

touch関数は、指定されたファイルが存在しない場合に新規作成し、存在する場合はファイルの最終更新時刻と最終アクセス時刻を現在の時刻に更新します。処理の成功・失敗は戻り値(trueまたはfalse)で判断できるため、必ずエラー時の処理を記述してください。ファイルを作成または更新するには、PHPを実行するユーザー(プロセス)が、対象ディレクトリへの書き込み権限を持っている必要があります。権限がない場合、操作は失敗しますのでご注意ください。サンプルコードのように一時的なファイルを生成する際には、処理完了後にunlink()関数を用いてファイルを適切に削除する習慣をつけましょう。これにより、不要なファイルが残り続けることを防ぎ、ディスク容量やセキュリティ上の問題を回避できます。また、必要に応じて引数で特定のタイムスタンプを指定し、更新することも可能です。

PHP touch 失敗: 親ディレクトリ不在時の挙動

1<?php
2
3/**
4 * PHPのtouch()関数の基本的な使用方法と、ファイル作成に失敗する一般的なケースを示します。
5 *
6 * システムエンジニアを目指す初心者向けに、成功例と失敗例、および失敗の理由を解説します。
7 */
8function demonstrateTouchFailure(): void
9{
10    // テスト用のディレクトリを作成します。現在のスクリプトがあるディレクトリ内に作成します。
11    $testDir = __DIR__ . '/touch_test_files';
12    if (!is_dir($testDir)) {
13        // mkdir の第三引数 `true` は、必要に応じて親ディレクトリも作成することを意味します。
14        // 第四引数 `0755` はディレクトリのパーミッション(読み書き実行権限)です。
15        if (!mkdir($testDir, 0755, true)) {
16            echo "エラー: テストディレクトリ '{$testDir}' の作成に失敗しました。権限を確認してください。\n";
17            return;
18        }
19        echo "情報: テストディレクトリ '{$testDir}' を作成しました。\n";
20    }
21
22    // --- 成功するケース ---
23    // 存在するディレクトリ内にファイルを「touch」します。
24    // ファイルが存在しない場合は新規作成され、存在する場合は最終アクセス・更新日時が更新されます。
25    $successFilename = $testDir . '/success_file.txt';
26    echo "\n--- 成功ケース: 存在するディレクトリにファイルを操作 ---\n";
27    echo "試行ファイル名: '{$successFilename}'\n";
28    if (touch($successFilename)) {
29        echo "結果: 成功。ファイル '{$successFilename}' が作成されたか、タイムスタンプが更新されました。\n";
30    } else {
31        // ここに到達することは稀ですが、ディスクフルや権限問題で失敗する可能性はあります。
32        echo "結果: 失敗。予期せぬエラーが発生しました。\n";
33    }
34
35    // --- 失敗するケース ---
36    // touch() 関数が失敗する一般的なケースの一つは、
37    // ファイルを作成しようとするパスの「親ディレクトリ」が存在しない場合です。
38    // touch() は `mkdir -p` のように、存在しない親ディレクトリを自動的に作成しません。
39    $nonExistentParentDir = $testDir . '/non_existent_subdir';
40    $failFilename = $nonExistentParentDir . '/fail_file.txt';
41    echo "\n--- 失敗ケース: 存在しない親ディレクトリにファイルを作成しようとする ---\n";
42    echo "試行ファイル名: '{$failFilename}'\n";
43    if (touch($failFilename)) {
44        // このコードブロックに到達した場合、何らかの予期せぬ成功(例: ディレクトリ名がファイル名と誤認識されたなど)
45        // または、サンプルコードの意図とは異なる環境設定が発生しています。
46        echo "結果: 成功。しかし、これは通常発生しないはずです。パスを確認してください。\n";
47    } else {
48        echo "結果: 失敗。親ディレクトリ '{$nonExistentParentDir}' が存在しないため、ファイルを作成できませんでした。\n";
49        echo "ヒント: ファイルを作成する前に、`mkdir('{$nonExistentParentDir}', 0755, true);` のように親ディレクトリを先に作成する必要があります。\n";
50    }
51
52    // --- 後処理(テストで作成したファイルやディレクトリをクリーンアップ) ---
53    echo "\n--- 後処理 ---\n";
54    // 成功ケースで作成されたファイルを削除
55    if (file_exists($successFilename)) {
56        unlink($successFilename);
57        echo "情報: ファイル '{$successFilename}' を削除しました。\n";
58    }
59
60    // テストディレクトリが空であれば削除
61    // scandir は `.` (カレントディレクトリ) と `..` (親ディレクトリ) を常に含みます。
62    // そのため、実ファイルがなければ要素数は2になります。
63    if (is_dir($testDir) && count(array_diff(scandir($testDir), ['.', '..'])) === 0) {
64        rmdir($testDir);
65        echo "情報: テストディレクトリ '{$testDir}' を削除しました。\n";
66    } else if (is_dir($testDir)) {
67        echo "警告: テストディレクトリ '{$testDir}' にファイルが残っているため、削除できませんでした。\n";
68    }
69}
70
71// 関数を実行してデモンストレーションを開始します。
72demonstrateTouchFailure();
73
74?>

PHPのtouch関数は、ファイルが存在しない場合は指定された名前で空のファイルを新規作成し、ファイルが既に存在する場合はそのファイルの最終更新日時と最終アクセス日時を更新する機能を提供します。

第一引数$filenameには、操作対象となるファイルパスを文字列で指定します。オプションの第二引数$mtimeと第三引数$atimeは、それぞれファイルの最終更新日時と最終アクセス日時をUNIXタイムスタンプで指定するために使用します。これらを省略した場合は、現在の時刻が設定されます。関数の戻り値はbool型で、操作が成功すればtrue、失敗すればfalseを返します。

サンプルコードでは、まず成功例として、存在するディレクトリ内にtouchでファイルを新規作成する様子を示しています。このケースではファイルが正常に作成され、trueが返されます。

次に失敗例として、存在しない親ディレクトリの中にファイルをtouchで作成しようとするケースを提示しています。touch関数は、ファイルを作成しようとするパスの途中に存在する親ディレクトリがなければ、そのディレクトリを自動的に作成しません。そのため、この操作は失敗し、falseが返されます。このような場合、touchを実行する前にmkdir関数などで親ディレクトリを事前に作成しておく必要があります。

その他にも、ファイルやディレクトリへの書き込み権限がない場合や、ディスク容量が不足している場合などにもtouch関数は失敗する可能性があります。

touch()関数は、指定したファイルが存在しない場合に新規作成し、存在する場合はファイルの最終アクセス・更新日時を更新します。重要な注意点として、ファイルを作成しようとするパスの親ディレクトリが存在しない場合、touch()は失敗します。mkdir -pのように親ディレクトリを自動で作成する機能はありませんので、事前にmkdir()関数を使って必要な親ディレクトリを作成しておく必要があります。touch()は処理の成否をブール値で返しますので、必ずその戻り値を確認してエラーハンドリングを行うことが安全なコードを書く上で不可欠です。また、ディレクトリの書き込み権限不足やディスク容量不足など、環境的な要因でも失敗する可能性がある点にもご留意ください。

関連コンテンツ