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

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

作成日: 更新日:

基本的な使い方

mkdir関数は、指定されたパスに新しいディレクトリ(フォルダ)を作成する関数です。この関数は、主にファイルシステム上で新しい格納場所をプログラムから動的に生成したい場合に使用されます。

最も基本的な使い方は、第一引数に作成したいディレクトリのパスを文字列で渡すことです。例えば、mkdir('new_folder'); と記述すると、スクリプトが実行されているカレントディレクトリに new_folder という名前のディレクトリが作成されます。

第二引数には、作成されるディレクトリのパーミッション(権限)を八進数で指定できます。デフォルト値は 0777 ですが、これはすべてのユーザーに読み書き実行の権限を与えるため、セキュリティ上の理由から、通常はより制限された 0755 などを指定することが推奨されます。このパーミッションは、システムのファイルモードマスク(umask)によっても影響を受ける点に注意が必要です。

第三引数 $recursivetrue を指定すると、作成したいディレクトリの親ディレクトリが存在しない場合でも、それらの親ディレクトリも同時に作成されます。この引数を false のままにすると、親ディレクトリが存在しない場合はエラーとなり、ディレクトリは作成されません。

mkdir関数は、ディレクトリの作成に成功した場合に true を、失敗した場合に false を返します。そのため、関数を実行した後は、戻り値を確認して処理の成否を判断することが重要です。既に同名のディレクトリが存在する場合や、指定されたパスへの書き込み権限がない場合など、様々な理由で作成に失敗する可能性があります。エラーメッセージはPHPの警告として出力されますが、falseの戻り値を受け取ることでプログラム的に失敗を検知し、適切にエラーハンドリングを行うことができます。

構文(syntax)

1mkdir("path/to/my/new/directory", 0755, true);

引数(parameters)

string $directory, int $permissions = 0777, bool $recursive = false, resource $context = null

  • string $directory: 作成するディレクトリのパスを指定する文字列
  • int $permissions = 0777: ディレクトリのパーミッション(権限)を整数で指定します。デフォルトは0777です。
  • bool $recursive = false: trueを指定すると、親ディレクトリが存在しない場合でも再帰的に作成します。デフォルトはfalseです。
  • resource $context = null: ストリームコンテキストを指定するリソースです。通常はnullで問題ありません。

戻り値(return)

bool

指定されたディレクトリを作成できなかった場合は false を返します。

サンプルコード

PHP mkdir でパーミッションを指定してディレクトリ作成する

1<?php
2
3// 作成するディレクトリのパスを定義します。
4$directoryPath = 'my_new_directory';
5$nestedDirectoryPath = 'temp_parent/temp_child/final_directory';
6
7// ディレクトリのパーミッションを8進数で定義します (例: 0755)。
8// 0755 は通常、所有者に読み書き実行権限、グループとその他に読み込みと実行権限を与えます。
9// (例: 0755 -> 所有者:rwx, グループ:r-x, その他:r-x)
10$permissions = 0755;
11
12echo "--- 単一ディレクトリの作成 (パーミッション指定) ---\n";
13
14// mkdir関数を使用してディレクトリを作成します。
15// 第1引数: 作成するディレクトリのパス
16// 第2引数: パーミッション (8進数)
17if (mkdir($directoryPath, $permissions)) {
18    echo "ディレクトリ '{$directoryPath}' を作成しました。\n";
19    // 作成されたディレクトリの実際のパーミッションを表示します (fileperms() & 0777 でパーミッション部分のみ取得)。
20    echo "実際のパーミッション: " . decoct(fileperms($directoryPath) & 0777) . "\n";
21} else {
22    echo "ディレクトリ '{$directoryPath}' の作成に失敗しました。既に存在するか、権限が不足している可能性があります。\n";
23}
24
25echo "\n--- 複数階層ディレクトリの作成 (再帰的、パーミッション指定) ---\n";
26
27// 第3引数を true にすると、存在しない親ディレクトリも自動的に作成されます (再帰的)。
28// PHP 8 では、親ディレクトリにも指定されたパーミッションが適用されます。
29if (mkdir($nestedDirectoryPath, $permissions, true)) {
30    echo "複数階層ディレクトリ '{$nestedDirectoryPath}' を作成しました。\n";
31    echo "実際のパーミッション: " . decoct(fileperms($nestedDirectoryPath) & 0777) . "\n";
32} else {
33    echo "複数階層ディレクトリ '{$nestedDirectoryPath}' の作成に失敗しました。\n";
34}
35
36// 注意: このスクリプトを実行後、作成されたディレクトリは手動で削除してください。
37
38?>

PHPのmkdir関数は、新しいディレクトリを作成するために使用します。この関数は、指定されたパスにディレクトリを生成し、ファイルシステムの構造をプログラムから操作できる便利な機能を提供します。

第一引数$directoryには、作成したいディレクトリのパスを文字列で指定します。第二引数$permissionsでは、そのディレクトリに与えるアクセス権限を8進数で指定します。例えば0755という値は、ディレクトリの所有者には読み込み・書き込み・実行の全ての権限を与え、グループとその他のユーザーには読み込みと実行権限を与えることを意味します。これにより、セキュリティとアクセス制御を適切に行うことができます。

第三引数$recursivetrueに設定すると、作成しようとしているディレクトリの親ディレクトリが存在しない場合でも、それらを自動的に作成しながら階層的にディレクトリを生成します。PHP 8以降では、この再帰的な作成時に親ディレクトリにも指定された$permissionsが適用されます。関数が正常にディレクトリを作成できた場合はtrueを、失敗した場合はfalseを返します。失敗の主な原因としては、指定されたパスが既に存在しているか、ディレクトリを作成する権限がないなどが挙げられます。

サンプルコードでは、my_new_directoryという単一のディレクトリをパーミッション0755で作成する例と、temp_parent/temp_child/final_directoryという複数階層のディレクトリを再帰的に作成する例を示しています。fileperms()関数とdecoct()関数を組み合わせることで、作成されたディレクトリの実際のパーミッションを8進数で確認できます。

PHPのmkdir関数でディレクトリを作成する際は、パーミッションを8進数で指定し、セキュリティのため安易に0777は避け、適切な権限を設定してください。mkdirは成功時にtrue、失敗時にfalseを返すため、必ず戻り値をチェックし、エラー処理を行ってください。recursive引数をtrueにすると、存在しない親ディレクトリも同時に作成されます。PHP 8以降では、再帰的作成時に親ディレクトリにも指定パーミッションが適用されます。システムのumask設定により、指定パーミッションが期待通りに適用されない場合があるため、fileperms()で実際のパーミッションを確認すると良いでしょう。

PHP mkdir 再帰的ディレクトリ作成

1<?php
2
3/**
4 * 指定されたパスにディレクトリを再帰的に作成します。
5 *
6 * @param string $path 作成するディレクトリのパス。複数の階層を持つ場合でも動作します。
7 * @return bool ディレクトリの作成に成功した場合 true、失敗した場合 false を返します。
8 */
9function createRecursiveDirectory(string $path): bool
10{
11    // パーミッションを0777(全ユーザーに読み書き実行の権限)に設定し、
12    // 第3引数を true にすることで、パス中の存在しない親ディレクトリも全て作成します。
13    // この true が「再帰的」な作成を意味します。
14    if (mkdir($path, 0777, true)) {
15        echo "ディレクトリ '{$path}' を再帰的に作成しました。\n";
16        return true;
17    } else {
18        echo "ディレクトリ '{$path}' の作成に失敗しました。\n";
19        // 失敗の原因は、既にディレクトリが存在する場合、または権限がない場合などが考えられます。
20        return false;
21    }
22}
23
24// 使用例:
25// プロジェクトルートに 'data/uploads/images/2023/10' というディレクトリ構造を作成します。
26// 'data', 'data/uploads', 'data/uploads/images', 'data/uploads/images/2023'
27// の全てが存在しなくても、この関数が再帰的に作成します。
28$directoryToCreate = 'my_app_data/uploads/images/2023/10';
29
30createRecursiveDirectory($directoryToCreate);
31
32// 既に存在するディレクトリを再度作成しようとすると失敗しますが、エラーは発生しません。
33// しかし、この例では成功メッセージが表示されるため、実際にディレクトリが作成されたか確認してください。
34// `mkdir`関数はディレクトリが既に存在する場合に失敗(falseを返す)しますが、PHP警告はデフォルトでは出力されません。
35
36// テスト後に作成したディレクトリを削除する場合は、別途処理が必要です。
37// 例: rmdir($directoryToCreate); // これは一番末端の空のディレクトリしか削除できません
38// 深い階層をまとめて削除するには、より複雑な処理(再帰的な削除関数など)が必要になります。
39
40?>

PHPのmkdir関数は、新しいディレクトリを作成するために使用される機能です。第一引数$directoryには、作成したいディレクトリのパスを文字列で指定します。この関数の特に重要な特徴は、第三引数$recursivetrueに設定することで、「再帰的」なディレクトリ作成が可能になる点です。通常、mkdirは指定されたディレクトリの親ディレクトリが存在しないと失敗しますが、$recursivetrueにすると、指定されたパスに含まれる存在しない親ディレクトリも全て自動的に作成してくれます。これは、例えば「data/uploads/images/2023/10」のような複数の階層を持つディレクトリ構造を一度に作成したい場合に非常に便利です。

第二引数$permissionsには、作成されるディレクトリのアクセス権限を数値で指定し、デフォルトは0777(全ユーザーに読み書き実行の権限)です。戻り値はbool型で、ディレクトリの作成に成功すればtrue、失敗すればfalseを返します。失敗の主な原因としては、指定されたパスに既に同じ名前のディレクトリやファイルが存在する場合、または権限不足などが考えられます。サンプルコードでは、my_app_data/uploads/images/2023/10という多階層のディレクトリを、$recursive引数をtrueにすることで一括して作成しています。これにより、途中のディレクトリが存在しない場合でも、手間なく目的のディレクトリ構造を構築できます。

mkdir関数の第3引数をtrueにすることで、存在しない親ディレクトリもまとめて作成できます。これが「再帰的」な作成を意味します。第2引数の0777は全ユーザーに読み書き実行を許可する権限ですが、セキュリティを考慮し、本番環境ではより適切な権限設定を検討してください。指定したディレクトリが既に存在する場合、mkdirfalseを返し作成に失敗しますが、PHPの警告は通常表示されません。そのため、関数の戻り値で必ず作成の成否を確認することが重要です。また、作成したディレクトリを削除するrmdir関数は、空のディレクトリしか削除できませんので、深い階層をまとめて削除するには、別途再帰的な削除処理が必要になります。

関連コンテンツ

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