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

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

作成日: 更新日:

基本的な使い方

fileperms関数は、指定されたファイルまたはディレクトリのパーミッション(権限)情報を取得する関数です。パーミッションとは、ファイルやディレクトリに対して、誰がどのような操作(読み取り、書き込み、実行)を許可されているかを示す設定のことです。

この関数は、パーミッションを調べたいファイルまたはディレクトリのパスを引数として受け取ります。引数には、例えば /path/to/your/file.txt のように、対象のパスを文字列で指定します。

関数が成功すると、そのパスが指す対象のパーミッションを整数値として返します。この戻り値の整数値は、通常、8進数表記(例: 0755)で解釈されます。0755という表記は、先頭の 0 が8進数であることを示し、続く 7 がファイルの所有者、最初の 5 がファイルのグループ、最後の 5 がその他のユーザーに対する権限を示しています。それぞれの数字は、読み取り、書き込み、実行の組み合わせに対応する特別な意味を持っています。

ファイルが存在しない場合や、パーミッションを取得するための適切な権限がない場合など、エラーが発生した際にはブール値の false が返されます。そのため、この関数を使用する際には、戻り値が false でないかを確認し、エラーハンドリングを行うことが重要です。取得した整数値を人間が読める8進数形式で表示したい場合は、PHPの sprintf() 関数などを用いると便利です。この関数は、主にUNIX系のファイルシステムにおけるパーミッション情報を扱う際に利用されます。

構文(syntax)

1<?php
2$filePath = 'path/to/your/file.txt';
3$filePermissions = fileperms($filePath);

引数(parameters)

string $filename

  • string $filename: ファイルのパーミッション情報を取得したいファイルパスを指定する文字列

戻り値(return)

int|false

指定されたファイルのパーミッションを整数値で返します。パーミッションの取得に失敗した場合は false を返します。

サンプルコード

PHP fileperms() でファイルパーミッションを取得する

1<?php
2
3/**
4 * fileperms() 関数の使用例
5 *
6 * このスクリプトは、一時ファイルを作成し、fileperms() 関数を使ってそのファイルの
7 * パーミッション(アクセス権)を取得・表示し、最後にファイルを削除します。
8 * また、存在しないファイルに対して関数を呼び出した場合の挙動も示します。
9 */
10
11// 処理対象となる一時ファイルの名前を定義
12$filename = 'sample_file_for_perms.txt';
13
14// --- ファイルの作成 ---
15// テスト用に空のファイルを作成します。
16// file_put_contents() は、ファイルの書き込みに失敗した場合に false を返します。
17// 作成されたファイルのパーミッションは、システムのデフォルト設定に依存します。
18if (file_put_contents($filename, 'This is a test file for fileperms().') === false) {
19    echo "エラー: ファイル '{$filename}' の作成に失敗しました。\n";
20    exit(1); // スクリプトを終了
21}
22echo "ファイル '{$filename}' を作成しました。\n\n";
23
24// --- fileperms() 関数の使用 ---
25// fileperms() 関数は、指定されたファイルのパーミッションを整数値で返します。
26// ファイルが存在しない、またはアクセス権がない場合は false を返します。
27$permissions = fileperms($filename);
28
29if ($permissions === false) {
30    echo "エラー: ファイル '{$filename}' のパーミッション取得に失敗しました。\n";
31    // 失敗した場合でもクリーンアップ処理に進む
32} else {
33    // 取得したパーミッションは数値(UNIXモード)です。
34    // 一般的に、この数値は8進数表記(例: 0644, 0755)で理解されます。
35    // sprintf('%o', ...) を使うと、数値を8進数文字列に変換できます。
36    echo "ファイル '{$filename}' のパーミッション: " . sprintf('%o', $permissions) . "\n";
37    echo "(例: '0644' は読み書き可能な所有者、読み込み専用のグループとその他を意味します)\n";
38}
39
40// --- 存在しないファイルの場合の挙動 ---
41echo "\n--- 存在しないファイルに対して fileperms() を呼び出す例 ---\n";
42$nonExistentFile = 'non_existent_file.txt';
43$permissionsNonExistent = fileperms($nonExistentFile);
44
45if ($permissionsNonExistent === false) {
46    echo "ファイル '{$nonExistentFile}' は存在しないため、fileperms() は false を返しました。\n";
47} else {
48    echo "警告: 存在しないはずのファイル '{$nonExistentFile}' のパーミッションが取得されました。\n";
49    // 通常、このメッセージが表示されることはありません
50}
51
52// --- クリーンアップ ---
53// スクリプトの実行後、作成した一時ファイルを削除します。
54if (file_exists($filename)) {
55    if (unlink($filename)) {
56        echo "\nファイル '{$filename}' を削除しました。\n";
57    } else {
58        echo "\nエラー: ファイル '{$filename}' の削除に失敗しました。\n";
59    }
60}
61
62?>

fileperms()関数は、指定されたファイルのパーミッション(アクセス権)を取得するためのPHP関数です。引数には、パーミッションを調べたいファイルへのパスを文字列で指定します。

関数が成功すると、戻り値としてファイルのパーミッションを表す整数値が返されます。この数値は、一般的に8進数(例: 0644)として解釈され、ファイルの所有者、グループ、その他のユーザーに対する読み取り、書き込み、実行の権限を示します。もし指定したファイルが存在しない、またはアクセスできない場合はfalseが返されます。

このサンプルコードでは、まずテスト用のファイルを作成し、そのファイル名を引数にfileperms()を呼び出しています。取得した整数値は、そのままでは分かりにくいため、sprintf('%o', ...)を用いて人間が読みやすい8進数形式の文字列に変換してから表示しています。また、存在しないファイル名を指定して関数を呼び出すとfalseが返されることも示しており、エラーハンドリングの重要性が分かります。最後に、後片付けとして作成したファイルを削除しています。

fileperms関数の戻り値は、成功時はパーミッションを示す整数、失敗時はfalseです。if ($permissions) のような判定では0falseを区別できないため、if ($permissions === false) のように厳密に比較することが重要です。また、関数が返す値は10進数の整数なので、普段見慣れた「0644」のような8進数形式で表示するには、サンプルコードのようにsprintf関数などを使って変換する必要があります。この戻り値にはファイルタイプ(通常ファイルかディレクトリか等)の情報も含まれるため、8進数に変換すると「100644」のように想定より大きな値になることがあります。最後に、存在しないファイルやアクセス権のないファイルを指定すると、falseが返されるだけでなく警告(Warning)も発生する点にご注意ください。

PHP fileperms()の「stat failed」警告を安全に処理する

1<?php
2
3declare(strict_types=1);
4
5/**
6 * 指定されたファイルのパーミッションを取得して表示します。
7 *
8 * fileperms() は、対象ファイルが存在しない場合やアクセスできない場合に
9 * E_WARNING "fileperms(): stat failed for ..." を発生させ、false を返します。
10 * この関数では、エラー制御演算子(@)でこの警告を抑制し、
11 * 戻り値を厳密にチェックすることで、安全にエラー処理を行います。
12 *
13 * @param string $filename パーミッションを取得したいファイルへのパス
14 */
15function showFilePermissions(string $filename): void
16{
17    // @ を付けて fileperms() を呼び出すと、ファイルが存在しない場合の警告出力を抑制できます。
18    $permissions = @fileperms($filename);
19
20    // 戻り値が false かどうかを厳密にチェックします (===)。
21    // これが、キーワードに示された警告への適切な対処法です。
22    if ($permissions === false) {
23        echo "エラー: '{$filename}' のパーミッションを取得できませんでした。ファイルが存在しないか、アクセス権がありません。" . PHP_EOL;
24        return;
25    }
26
27    // 取得したパーミッション(整数値)を、一般的な8進数の4桁形式 (例: 0755) の文字列に変換して表示します。
28    $formattedPerms = substr(sprintf('%o', $permissions), -4);
29    echo "成功: '{$filename}' のパーミッションは {$formattedPerms} です。" . PHP_EOL;
30}
31
32// --- 実行例 ---
33
34// (1) 成功するケース: このスクリプトファイル自身のパーミッションを取得します。
35// このファイルは確実に存在するため、パーミッションが正常に表示されます。
36showFilePermissions(__FILE__);
37
38// (2) "stat failed for" 警告が発生するケース: 存在しないファイルを指定します。
39// @演算子と false チェックにより、プログラムが停止することなく、定義したエラーメッセージが表示されます。
40showFilePermissions('non_existent_file.txt');
41
42?>

このPHPサンプルコードは、fileperms()関数を用いてファイルのパーミッション(読み取り、書き込み、実行の権限)を取得する方法を示しています。fileperms()は、引数 $filename で指定されたファイルのパーミッションを整数値として返します。ファイルが存在しない場合やアクセスできない場合には、警告「stat failed for ...」を発生させ、戻り値としてfalseを返します。

このコードの重要な点は、この警告に安全に対処する手法です。まず、@fileperms()のように関数の前にエラー制御演算子@を付けることで、警告メッセージが画面に出力されるのを抑制しています。次に、if ($permissions === false)という条件式で、戻り値が厳密にfalseかどうかを確認します。これにより、関数の実行が失敗したことを確実に検知し、独自のエラーメッセージを表示して安全に処理を分岐させています。

関数が成功してパーミッションが取得できた場合は、戻り値である整数値をsprintf()substr()を使って、0755のような一般的な8進数4桁の文字列形式に変換し、その結果を表示します。実行例では、確実に存在するファイルと存在しないファイルの両方を試し、それぞれ成功時と失敗時の動作を確認できるようになっています。

fileperms()関数は、対象ファイルが存在しない場合などに警告を発生させ、falseを返します。サンプルコードにある@演算子は、この警告メッセージを画面に表示させないためのものですが、エラー自体がなくなるわけではありません。そのため、@を使う際は、その後のif ($permissions === false)のように、戻り値がfalseであることを必ず厳密にチェックする必要があります。==ではなく===で比較するのは、パーミッションの値が0の場合にfalseと誤判定されるのを防ぐためです。ファイルシステムを扱う関数では、このように失敗する可能性を常に考慮し、適切なエラー処理を記述することが安全なプログラムの基本となります。

関連コンテンツ

【PHP8.x】fileperms関数の使い方 | いっしー@Webエンジニア