Webエンジニア向けプログラミング解説動画をYouTubeで配信中!
▶ チャンネル登録はこちら

【PHP8.x】umask()関数の使い方

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

作成日: 更新日:

基本的な使い方

umask関数は、ファイルやディレクトリが作成される際のデフォルトのパーミッション(アクセス権)を制御する「ファイルモード作成マスク」(umask)を設定または取得する関数です。この関数は主にUNIX系のオペレーティングシステムにおいて利用されます。umask値は、新しく作成されるファイルやディレクトリに与えられる初期のパーミッションから、どのアクセス権を「禁止」するかを指定するために使用されます。

具体的には、ファイルやディレクトリが作成される際の完全なパーミッション(例えば、ファイルは0666、ディレクトリは0777)からumask値を適用することで、最終的なパーミッションが決定されます。例えば、umask値が0022の場合、新しく作成されるファイルは所有者には書き込み権限が与えられますが、グループやその他ユーザーには書き込み権限が与えられません。

umask関数を引数なしで呼び出すと、現在のumask値が8進数として返されます。一方、引数に新しいumask値を8進数で指定して呼び出すと、umask値がその値に設定され、設定前のumask値が返されます。この設定はPHPスクリプトの実行環境に影響を与えます。適切なumask値を設定することは、システムやアプリケーションのセキュリティを確保し、意図しないファイルアクセスを防ぐ上で非常に重要です。

構文(syntax)

1<?php
2umask();
3umask(0o022);
4?>

引数(parameters)

?int $mask = null

  • ?int $mask = null: 新しいファイルパーミッションマスクを指定する整数。省略された場合は現在のマスクが返される

戻り値(return)

int

umask関数の戻り値は、PHPスクリプトが新しく作成するファイルやディレクトリにデフォルトで適用されるパーミッションマスクを表す整数です。この値は、umask関数に渡された新しいマスク値ではなく、umask関数が実行される直前の現在のマスク値です。

サンプルコード

PHP umask でファイルパーミッションを制御する

1<?php
2
3/**
4 * umask 関数の使用例:現在の umask 値を取得し、新しい umask 値を設定し、元の値に戻す。
5 */
6
7// 現在の umask 値を取得
8$old_umask = umask();
9
10echo "現在の umask: " . decoct($old_umask) . "\n";
11
12// 新しい umask 値を設定 (例: 0022)
13$new_umask = 0022;
14umask($new_umask);
15
16echo "新しい umask を設定: " . decoct($new_umask) . "\n";
17
18// ファイル作成時のパーミッションを確認 (umask の影響を確認)
19touch("test_file.txt");
20$perms = fileperms("test_file.txt");
21$file_perms = substr(sprintf('%o', $perms), -4);
22
23echo "作成されたファイルのパーミッション: " . $file_perms . "\n";
24
25// umask を元の値に戻す
26umask($old_umask);
27
28echo "umask を元の値に戻しました: " . decoct($old_umask) . "\n";
29
30// 後始末: 作成したファイルを削除
31unlink("test_file.txt");
32
33?>

このPHPサンプルコードは、umask関数を使ったファイル作成時のパーミッション制御について解説しています。umask関数は、新規ファイルやディレクトリが作成される際のデフォルトパーミッションを設定するために使用します。

umask()のように引数なしで関数を呼び出すと、現在のumask値が整数で返されます。引数 $mask に整数値を指定すると、umask値を設定し、設定前のumask値を返します。$masknullを指定すると、umask値は変更されずに現在のumask値が返されます(PHP 8以降)。

サンプルコードでは、まず現在のumask値をumask()で取得し、decoct()関数を使って8進数表記に変換して表示しています。次に、umask(0022)で新しいumask値を設定します。この例では、0022という一般的な値を設定しています。

touch("test_file.txt")で新しいファイルを作成し、fileperms()関数でそのファイルのパーミッションを取得しています。取得したパーミッションを8進数で表示することで、umaskがファイル作成時のパーミッションにどのように影響するかを確認できます。

最後に、umask($old_umask)でumask値を元の値に戻しています。これは、スクリプトの実行後にシステムのデフォルト設定を変更しないための重要なステップです。unlink("test_file.txt")でテストファイルを削除して、後始末をしています。

この例を通して、umask関数がファイル作成時のセキュリティ設定にどのように影響するかを理解することができます。システムエンジニアを目指す上で、ファイルパーミッションの制御は重要な知識となります。

umask()関数は、ファイルやディレクトリ作成時のデフォルトパーミッション(アクセス権)を設定・取得する関数です。引数を省略すると現在のumask値を返します。umask値は8進数で指定し、通常0022や0077といった値を設定します。設定したumask値は、プログラム終了まで有効です。

注意点として、umaskはプロセス全体に影響するため、他の処理に影響を与えないように、使用後は必ず元の値に戻すようにしてください。また、touch()関数でファイルを作成する際、umaskの影響を受けるパーミッションは、ファイルの初期パーミッションからumask値を引いたものになります。サンプルコードでは、ファイルのパーミッションを確認することで、umaskの影響を具体的に理解できます。

PHP umask(0) でファイルパーミッションを最大にする

1<?php
2
3// 現在の umask 値を取得して表示します。
4$current_umask = umask();
5echo "現在の umask: " . decoct($current_umask) . "\n";
6
7// umask を 0 に設定します。これにより、新規ファイル作成時のパーミッションが最大になります。
8umask(0);
9
10// 設定後の umask 値を確認します。
11$new_umask = umask();
12echo "umask を 0 に設定しました。\n";
13
14// 新規ファイルを作成し、パーミッションを確認します。
15touch("test_file.txt");
16$perms = fileperms("test_file.txt");
17$permissions = substr(sprintf('%o', $perms), -4);
18
19echo "新規ファイルのパーミッション: " . $permissions . "\n";
20
21// umask を元の値に戻します。
22umask($current_umask);
23echo "umask を元の値に戻しました。\n";
24
25// スクリプト終了時の umask 値を表示します。
26$final_umask = umask();
27echo "スクリプト終了時の umask: " . decoct($final_umask) . "\n";
28?>

このPHPのサンプルコードは、umask()関数を使って、新規ファイル作成時のデフォルトのパーミッションを制御する方法を示しています。

umask()関数は、引数 $mask に指定された値を現在のumask値として設定します。$mask にnullが指定された場合は、現在のumask値を返します。この関数はint型の値を返します。

最初に、現在のumask値をumask()関数で取得し、decoct()関数を使って8進数表記に変換して表示しています。

次に、umask(0) を実行することで、umask値を0に設定しています。これにより、新しく作成されるファイルやディレクトリは、最大限のパーミッション(通常は0666または0777からumask値が引かれたもの)を持つようになります。設定後、再度umask()関数でumask値を確認しています。

touch("test_file.txt") で新規ファイルを作成し、fileperms()関数でファイルのパーミッションを取得しています。取得したパーミッションをsprintf('%o', $perms)で8進数表記に変換し、substr()関数で必要な部分を取り出して表示しています。

最後に、umask($current_umask) でumask値を最初に取得した値に戻し、スクリプト終了時のumask値を確認しています。これは、他のスクリプトやシステムに影響を与えないようにするための配慮です。

このサンプルコードを実行することで、umask()関数の挙動と、ファイルパーミッションに与える影響を理解することができます。

umask()関数は、ファイルやディレクトリ作成時のデフォルトパーミッションを設定する際に利用します。引数に0を指定すると、新規作成されるファイルは最大のパーミッション(通常は0666からumask値を引いたもの)を持ちます。

注意点として、umask()はシステム全体に影響を与えるため、スクリプト終了時には元の値に戻すことが重要です。さもないと、他のプログラムのファイル作成に影響を及ぼす可能性があります。特に共有サーバー環境では注意が必要です。

また、touch()で作成されるファイルのパーミッションは、umask()だけでなく、PHPの設定(safe_mode等)やOSのデフォルト設定にも影響を受ける場合があります。fileperms()で実際に作成されたファイルのパーミッションを確認するようにしましょう。

PHP umaskとmkdirでパーミッション制御する

1<?php
2
3/**
4 * PHPのumask関数とmkdir関数を使用して、
5 * ディレクトリ作成時のパーミッション制御をデモンストレーションします。
6 * umaskは、新しいファイルやディレクトリが作成される際に適用されるパーミッションマスクを定義します。
7 */
8function demonstrateUmaskAndMkdir(): void
9{
10    echo "umask関数とmkdir関数のデモンストレーション\n\n";
11
12    // 1. 現在のumask値を取得し、後で元の値に戻すために保存します。
13    // umask()を引数なしで呼び出すと、現在のumask値が返されます。
14    // 値は8進数で表示するためにsprintfを使用しています。
15    $originalUmask = umask();
16    echo "現在のumask値: " . sprintf('%04o', $originalUmask) . " (8進数)\n\n";
17
18    // テスト用のベースディレクトリをシステムの一時ディレクトリ内に作成します。
19    $baseDir = sys_get_temp_dir() . '/php_umask_test_' . uniqid();
20    if (!mkdir($baseDir, 0777, true)) {
21        echo "エラー: ベースディレクトリ '$baseDir' の作成に失敗しました。\n";
22        return;
23    }
24    echo "テスト用ベースディレクトリ '$baseDir' を作成しました。\n\n";
25
26    $dir1 = $baseDir . '/dir_default_umask';
27    $dir2 = $baseDir . '/dir_custom_umask';
28    $requestedMode = 0777; // mkdirに要求するパーミッション (例: 全ての権限)
29
30    // 2. デフォルトのumask値でディレクトリを作成します。
31    // mkdirで指定したパーミッションからumask値でマスクされたビットが除外され、実際のパーミッションが決定されます。
32    echo "--- デフォルトumask (" . sprintf('%04o', $originalUmask) . ") でディレクトリを作成 ---\n";
33    if (mkdir($dir1, $requestedMode)) {
34        // fileperms()はファイルタイプ情報も含むため、& 0777 でパーミッション部分のみを抽出します。
35        $actualMode = fileperms($dir1) & 0777;
36        echo "ディレクトリ '$dir1' を要求パーミッション " . sprintf('%04o', $requestedMode) . " で作成。\n";
37        echo "実際のパーミッション: " . sprintf('%04o', $actualMode) . "\n\n";
38    } else {
39        echo "エラー: ディレクトリ '$dir1' の作成に失敗しました。\n\n";
40    }
41
42    // 3. umask値を変更し、新しいumask値でディレクトリを作成します。
43    // umask(0022) は、グループとその他のユーザーの書き込み権限を許可しない一般的な設定です。
44    // この設定で0777を要求すると、通常0755のパーミッションが適用されます。
45    $newUmask = 0022;
46    umask($newUmask); // 新しいumaskを設定
47    echo "--- umaskを " . sprintf('%04o', $newUmask) . " に設定してディレクトリを作成 ---\n";
48    if (mkdir($dir2, $requestedMode)) {
49        $actualMode = fileperms($dir2) & 0777;
50        echo "ディレクトリ '$dir2' を要求パーミッション " . sprintf('%04o', $requestedMode) . " で作成。\n";
51        echo "実際のパーミッション: " . sprintf('%04o', $actualMode) . "\n\n";
52    } else {
53        echo "エラー: ディレクトリ '$dir2' の作成に失敗しました。\n\n";
54    }
55
56    // 4. 後処理: umaskを元の値に戻し、作成した一時ディレクトリを削除します。
57    umask($originalUmask);
58    echo "umaskを元の値 " . sprintf('%04o', $originalUmask) . " に戻しました。\n";
59
60    // 作成したディレクトリを削除 (rmdirは空のディレクトリのみ削除可能です)
61    if (file_exists($dir1)) {
62        rmdir($dir1);
63    }
64    if (file_exists($dir2)) {
65        rmdir($dir2);
66    }
67    if (file_exists($baseDir)) {
68        rmdir($baseDir);
69    }
70    echo "作成した一時ディレクトリを削除しました。\n";
71}
72
73// デモンストレーションを実行します。
74demonstrateUmaskAndMkdir();

PHPのumask関数は、新しく作成されるファイルやディレクトリのデフォルトのパーミッション(アクセス権)を制御するために使用されます。この関数は、引数に整数値(通常は8進数)を指定することでumask値を変更し、その変更前のumask値を整数として返します。引数を省略してumask()を呼び出した場合は、現在のumask値を取得できます。

サンプルコードでは、このumask関数と、ディレクトリを作成するmkdir関数を組み合わせて、パーミッション制御の挙動を示しています。まず、umask()を引数なしで呼び出して現在のumask値を取得し、この値がディレクトリ作成にどう影響するかを確認します。mkdir関数でディレクトリを作成する際、指定したパーミッションからumask値で「許可しない」と設定されたビットが除外され、実際のパーミッションが決定されます。

次に、umask(0022)のように新しいumask値を設定し、同じようにディレクトリを作成することで、umask値の違いが実際のパーミッションにどのように影響するかを比較しています。例えば、umaskが0022の場合、要求するパーミッションが0777であっても、作成されるディレクトリは通常0755となります。これは、グループとその他のユーザーの書き込み権限がumaskによってマスクされるためです。プログラムの終了時には、umask値を元の状態に戻すことで、他のプロセスへの影響を避けるように配慮しています。このようにumask関数を利用することで、システムエンジニアはファイルやディレクトリのセキュリティ設定をプログラムから細かく制御できます。

umask関数は、ファイルやディレクトリ作成時に自動的に適用されるパーミッション(権限)の制限値を設定します。指定したumask値は「禁止する権限」として機能し、mkdirなどで要求したパーミッションからumask値に該当するビットが除外され、最終的なパーミッションが決まる点に注意が必要です。umask値はPHPプロセス全体に影響するため、値を変更した場合は必ず元の値に戻す処理を組み込むようにしてください。パーミッションは8進数で記述するのが一般的です。fileperms関数で実際のパーミッションを取得する際は、ファイルタイプ情報も含まれるため、ビット演算子を用いてパーミッション部分のみを抽出する方法を覚えておくと良いでしょう。一時ディレクトリの作成と削除は、セキュリティとリソース管理の観点から堅牢に実装することが重要です。

関連コンテンツ

関連プログラミング言語