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

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

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

作成日: 更新日:

基本的な使い方

unlink関数は、ファイルシステムからファイルを削除する関数です。この関数は、指定されたパスのファイルを削除しようと試みます。削除が成功した場合、関数はtrueを返します。削除が失敗した場合、たとえばファイルが存在しない、または適切な権限がない場合、関数はfalseを返します。

unlink関数を使用する際には、削除するファイルへの書き込み権限があることを確認する必要があります。また、open_basedir制限やセーフモード設定など、PHPの設定によっては、ファイル削除が制限される場合があります。これらの設定は、セキュリティ上の理由からファイルシステムへのアクセスを制限するために設けられています。

unlink関数の引数には、削除するファイルのパスを指定します。パスは文字列で指定し、絶対パスまたは相対パスを使用できます。相対パスは、現在のスクリプトの実行ディレクトリからの相対位置として解釈されます。

エラー処理として、unlink関数がfalseを返した場合、error_get_last()関数を使用して詳細なエラー情報を取得できます。これにより、削除が失敗した原因を特定し、適切な対応を行うことができます。

ファイルが削除されると、そのファイルが占有していたディスクスペースは解放され、他のファイルやデータのために利用できるようになります。unlink関数は、不要になったファイルを削除し、ディスクスペースを効率的に管理するために使用されます。ただし、一度削除されたファイルは通常、復元することが困難であるため、削除するファイルが本当に不要であることを慎重に確認する必要があります。バックアップを取るなどの対策も有効です。

構文(syntax)

1unlink(string $filename, ?resource $context = null): bool

引数(parameters)

string $filename, ?resource $context = null

  • string $filename: 削除するファイル名を指定する文字列
  • ?resource $context = null: ストリームコンテキストを指定するリソース。省略可能

戻り値(return)

bool

unlink関数は、指定したファイルを削除する関数です。ファイルの削除に成功した場合は true を、失敗した場合は false を返します。

サンプルコード

PHP unlink関数でファイルを削除する

1<?php
2
3/**
4 * PHPのunlink関数を使用してファイルを安全に削除するサンプルコードです。
5 * unlink関数はファイルのみを削除できます。ディレクトリの削除には使用できません。
6 * ディレクトリ内のファイルを削除するシナリオを想定しています。
7 */
8function demonstrateUnlinkFunction(): void
9{
10    // 削除対象のファイルを作成する一時ディレクトリを準備します。
11    // sys_get_temp_dir() でOSの一時ディレクトリパスを取得し、
12    // DIRECTORY_SEPARATOR でOSに応じたパス区切り文字を使用します。
13    $tempDirectory = sys_get_temp_dir() . DIRECTORY_SEPARATOR . 'php_unlink_example_' . uniqid();
14    
15    // ディレクトリが存在しない場合は作成します。
16    if (!mkdir($tempDirectory, 0777, true)) {
17        echo "エラー: 一時ディレクトリ '{$tempDirectory}' の作成に失敗しました。\n";
18        return;
19    }
20    echo "一時ディレクトリを作成しました: {$tempDirectory}\n";
21
22    $fileName = "delete_me.txt";
23    $filePath = $tempDirectory . DIRECTORY_SEPARATOR . $fileName;
24
25    // 削除対象となるファイルを準備します。
26    // file_put_contents() でファイルに内容を書き込み、ファイルを作成します。
27    if (file_put_contents($filePath, "このファイルはunlink関数によって削除されます。\n") === false) {
28        echo "エラー: ファイル '{$filePath}' の作成に失敗しました。\n";
29        // ファイル作成失敗時は、作成したディレクトリを削除してクリーンアップします。
30        rmdir($tempDirectory);
31        return;
32    }
33    echo "ファイルを作成しました: {$filePath}\n";
34
35    // ファイルが作成されたことを確認します。
36    if (file_exists($filePath)) {
37        echo "ファイル '{$filePath}' が存在します。削除を試みます。\n";
38
39        // unlink関数を使ってファイルを削除します。
40        // 第1引数: 削除するファイルのパス (string)
41        // 第2引数: オプションでストリームコンテキストを指定できますが、通常はnullで十分です。
42        if (unlink($filePath)) {
43            echo "ファイルを正常に削除しました: {$filePath}\n";
44        } else {
45            // 権限の問題などで削除に失敗する場合があります。
46            echo "エラー: ファイル '{$filePath}' の削除に失敗しました。\n";
47        }
48    } else {
49        echo "エラー: 削除しようとしたファイル '{$filePath}' が見つかりません。\n";
50    }
51
52    // 削除後、ファイルが存在しないことを確認します。
53    if (!file_exists($filePath)) {
54        echo "ファイルは現在、存在しません。\n";
55    }
56
57    // 最後に、作成した一時ディレクトリをクリーンアップします。
58    // unlinkはファイルを削除する関数であり、ディレクトリは削除できません。
59    // rmdir関数は空のディレクトリを削除するために使用します。
60    // scandirの結果が '.' と '..' のみの場合、ディレクトリは空と判断できます。
61    if (is_dir($tempDirectory) && count(scandir($tempDirectory)) === 2) {
62        if (rmdir($tempDirectory)) {
63            echo "一時ディレクトリ '{$tempDirectory}' を削除しました。\n";
64        } else {
65            echo "注意: 一時ディレクトリ '{$tempDirectory}' の削除に失敗しました。\n";
66        }
67    } else {
68        echo "注意: 一時ディレクトリ '{$tempDirectory}' が空ではないため削除できませんでした。手動で確認してください。\n";
69    }
70}
71
72// 関数の実行
73demonstrateUnlinkFunction();
74

PHP 8のunlink関数は、ファイルシステムから指定されたファイルを削除するための基本的な関数です。この関数は、プログラムから不要なファイルを削除する際に利用されます。

第一引数$filenameには、削除したいファイルの完全なパスを文字列として渡します。もしファイルが存在しない場合や、PHPスクリプトにファイルを削除する適切な権限がない場合などには、削除に失敗します。第二引数$contextはオプションで、ストリームコンテキストを指定する際に使用しますが、通常は省略可能です。関数がファイルの削除に成功した場合はtrueを返し、何らかの理由で失敗した場合はfalseを返します。

特に重要な点として、unlink関数はファイルのみを対象とし、ディレクトリ(フォルダ)を削除することはできません。もしディレクトリを削除しようとすると、エラーが発生します。サンプルコードでは、一時ディレクトリを作成し、その中に一時的なファイルを作成した後、unlink関数を使ってそのファイルを削除する手順を具体的に示しています。ファイルの削除後、作成したディレクトリはrmdir関数を使ってクリーンアップしており、ファイルとディレクトリの削除には異なる関数が必要であることが理解できます。

PHPのunlink関数は、ファイルのみを削除できる関数です。ディレクトリを削除することはできませんので、ディレクトリの削除にはrmdir関数を使用してください。ただし、rmdir関数は空のディレクトリしか削除できない点にご注意ください。unlink関数を使用する際は、削除対象のファイルパスが正しいか、またPHPがそのファイルを削除する適切な権限を持っているかを必ず確認してください。関数は成功するとtrue、失敗するとfalseを返しますので、必ず戻り値を確認し、エラーハンドリングを行うようにしましょう。サンプルコードのように、一時的に作成したファイルやディレクトリは、処理の最後に必ず削除(クリーンアップ)することが、システムを安全に保つ上で非常に重要です。

PHP unlinkとglobでワイルドカード削除する

1<?php
2
3/**
4 * 指定されたワイルドカードパターンに一致するファイルを削除します。
5 * unlink関数は単一のファイルを削除しますが、glob関数と組み合わせることで
6 * ワイルドカードパターンに一致する複数のファイルを削除できます。
7 *
8 * @param string $pattern 削除するファイルのワイルドカードパターン (例: 'temp_*.txt')
9 */
10function deleteFilesWithWildcard(string $pattern): void
11{
12    // glob() 関数は、指定されたパターンに一致するファイルのパスを配列で返します。
13    // 例: 'delete_me_*.txt' は 'delete_me_1.txt', 'delete_me_2.txt' などに一致します。
14    // 一致するファイルが見つからない場合は、空の配列を返します。
15    $files = glob($pattern);
16
17    if (empty($files)) {
18        echo "情報: パターン '{$pattern}' に一致するファイルは見つかりませんでした。\n";
19        return;
20    }
21
22    echo "情報: 以下のパターン '{$pattern}' に一致するファイルを削除します。\n";
23
24    foreach ($files as $file) {
25        // unlink() 関数で個々のファイルを削除します。
26        // 削除に成功した場合は true、失敗した場合は false を返します。
27        if (unlink($file)) {
28            echo "成功: ファイル '{$file}' を削除しました。\n";
29        } else {
30            // 削除に失敗した場合、エラーメッセージを表示します。
31            // 失敗の原因としては、ファイルが存在しない、書き込み権限がないなどが考えられます。
32            echo "エラー: ファイル '{$file}' の削除に失敗しました。パーミッションなどを確認してください。\n";
33        }
34    }
35}
36
37// --- サンプルコードの実行例 ---
38
39// 1. 削除対象となるテストファイルをいくつか作成します。
40//    この部分は、スクリプトが単体で動作することを示すための準備です。
41//    実際のアプリケーションでは、削除したいファイルが既に存在することを前提とします。
42file_put_contents('delete_me_1.txt', 'これは削除対象のテストファイルです。');
43file_put_contents('delete_me_2.txt', 'これも削除対象のテストファイルです。');
44file_put_contents('keep_me.log', 'このファイルは削除されないはずです。');
45file_put_contents('delete_me_3.temp', '一時的な削除対象ファイルです。');
46echo "情報: テストファイルを作成しました。\n\n";
47
48// 2. ワイルドカードパターン 'delete_me_*.txt' に一致するファイルを削除します。
49//    これにより 'delete_me_1.txt' と 'delete_me_2.txt' が削除されます。
50echo "--- '.txt' ファイルの削除を開始 ---\n";
51deleteFilesWithWildcard('delete_me_*.txt');
52echo "\n";
53
54// 3. ワイルドカードパターン '*.temp' に一致するファイルを削除します。
55//    これにより 'delete_me_3.temp' が削除されます。
56echo "--- '.temp' ファイルの削除を開始 ---\n";
57deleteFilesWithWildcard('*.temp');
58echo "\n";
59
60// 4. 削除後に残っているファイルを確認します。
61//    'keep_me.log' のみが残っているはずです。
62echo "--- 削除後に残っているファイルの確認 ---\n";
63$remainingFiles = glob('*'); // カレントディレクトリ内の全てのファイルとディレクトリを取得
64$foundRemaining = false;
65foreach ($remainingFiles as $file) {
66    if (is_file($file)) { // ディレクトリを除外し、ファイルのみを表示
67        echo "残存ファイル: {$file}\n";
68        $foundRemaining = true;
69    }
70}
71if (!$foundRemaining) {
72    echo "残っているファイルはありません。\n";
73}
74echo "\n";
75
76// 5. 残ったテストファイル 'keep_me.log' をクリーンアップします。
77//    これは、テスト実行後に作成されたファイルを全て削除し、環境をきれいにするための処理です。
78echo "--- クリーンアップ ---\n";
79deleteFilesWithWildcard('keep_me.log');
80echo "情報: クリーンアップが完了しました。\n";
81
82?>

PHPのunlink関数は、指定されたファイルパスのファイルを削除するために使用します。この関数は、削除したいファイルのパスを文字列として引数に受け取り、ファイルの削除に成功した場合はtrueを、失敗した場合はfalseを論理値として返します。unlink関数は一度に一つのファイルしか削除できませんが、サンプルコードでは、glob関数と組み合わせることでワイルドカードパターンに一致する複数のファイルを効率的に削除する方法が示されています。

サンプルコードのdeleteFilesWithWildcard関数は、削除したいファイルのワイルドカードパターン(例: *.txt)を引数に取ります。この関数の中で、まずglob関数が指定されたパターンに一致するすべてのファイルのパスを配列として取得します。次に、取得したファイルパスの配列を一つずつ処理するループ内で、個々のファイルに対してunlink関数を呼び出して削除を試みます。unlinkの実行結果に応じて、ファイルが正常に削除されたか、またはファイルが存在しない、書き込み権限がないなどの理由で削除に失敗したかを分かりやすく表示します。このコードは、テストファイルの作成から、ワイルドカードを使った複数ファイルの削除、そしてその後の環境のクリーンアップまでの一連の流れを具体的に示しており、PHPにおけるファイル操作の基礎を学ぶ上で役立ちます。

unlink関数はファイルを完全に削除し、一度消したファイルは基本的に復元できません。サンプルコードのようにglob関数と組み合わせてワイルドカードでファイルを削除する際は、削除対象となるファイルパターンを厳密に指定し、意図しない重要なファイルが削除されないよう細心の注意を払ってください。unlinkが失敗する場合、多くはファイルが存在しないか、PHPスクリプトにファイルの書き込み権限がないことが原因です。エラーメッセージを確認し、ファイルパスやパーミッションを適切に設定してください。特に本番環境でのファイル削除操作は、事前に十分なテストとバックアップを必ず実施するよう心がけてください。

PHP unlink 削除できない場合の原因と対策

1<?php
2
3/**
4 * ファイルの削除を安全に試みる関数。
5 * 「unlinkで削除できない」場合の一般的な原因と対処法を考慮しています。
6 *
7 * @param string $filename 削除対象のファイルパス。
8 * @return bool 削除が成功した場合はtrue、失敗した場合はfalse。
9 */
10function safelyUnlink(string $filename): bool
11{
12    echo "--- 削除試行: '{$filename}' ---\n";
13
14    // 1. 削除対象のファイルまたはディレクトリが存在するか確認します。
15    //    存在しないファイルを削除しようとすると失敗します。
16    if (!file_exists($filename)) {
17        echo "エラー: ファイル '{$filename}' は存在しません。削除できません。\n";
18        return false;
19    }
20
21    // 2. 削除対象がディレクトリでないか確認します。
22    //    unlink() 関数はファイルを削除するためのものであり、ディレクトリは削除できません。
23    //    ディレクトリを削除するには rmdir() 関数を使用するか、再帰的な削除処理が必要です。
24    if (is_dir($filename)) {
25        echo "エラー: '{$filename}' はディレクトリです。unlink() 関数はファイルを削除できません。\n";
26        echo "ヒント: ディレクトリを削除するには rmdir() 関数を使用してください。\n";
27        return false;
28    }
29
30    // 3. ファイルの削除を試みます。
31    if (unlink($filename)) {
32        echo "成功: ファイル '{$filename}' を削除しました。\n";
33        return true;
34    } else {
35        // 4. 削除失敗時のエラー情報を取得します。
36        //    主な原因として、ファイルへの書き込み権限がない、ファイルが他のプロセスによってロックされているなどが考えられます。
37        $lastError = error_get_last();
38        echo "失敗: ファイル '{$filename}' の削除に失敗しました。\n";
39        if ($lastError && isset($lastError['message'])) {
40            echo "考えられる原因: {$lastError['message']}\n";
41            echo "ヒント: ファイルのパーミッション(PHP実行ユーザーに書き込み権限があるか)や、ファイルが他のアプリケーションで使用中ではないか確認してください。\n";
42        } else {
43            echo "考えられる原因: 不明なエラーです。パーミッションやファイルの状態を詳細に確認してください。\n";
44        }
45        return false;
46    }
47}
48
49// --- サンプル実行 ---
50
51// 1. 正常に削除できるファイルを作成し、削除する例
52$tempFile1 = 'example_file_to_delete.txt';
53file_put_contents($tempFile1, 'このファイルは正常に削除されます。');
54safelyUnlink($tempFile1);
55echo "\n";
56
57// 2. 存在しないファイルを削除しようとする例 (失敗するケース)
58$nonExistentFile = 'non_existent_file.txt';
59safelyUnlink($nonExistentFile);
60echo "\n";
61
62// 3. ディレクトリを unlink() で削除しようとする例 (失敗するケース)
63$tempDir = 'example_directory_to_fail';
64if (!is_dir($tempDir)) {
65    mkdir($tempDir);
66}
67safelyUnlink($tempDir);
68// 後処理: 作成したディレクトリは rmdir() で削除します
69if (is_dir($tempDir)) {
70    rmdir($tempDir);
71    echo "補足: 作成したディレクトリ '{$tempDir}' は rmdir() で削除されました。\n";
72}
73echo "\n";
74
75// 4. (応用) 権限不足で削除できないケース
76//    Windows環境ではファイルのパーミッション制御が異なるため、この例はUnix系OS (Linux, macOS) でより明確に動作します。
77//    ここではコメントアウトし、上記の error_get_last() の説明で対応します。
78/*
79$noPermissionFile = 'no_permission_file.txt';
80file_put_contents($noPermissionFile, 'このファイルはパーミッション不足で削除できない可能性があります。');
81// ファイルのパーミッションを読み取り専用に設定 (オーナー以外書き込み不可)
82// chmod($noPermissionFile, 0444);
83// safelyUnlink($noPermissionFile);
84// 後処理: 権限を戻して削除 (または手動で削除)
85// chmod($noPermissionFile, 0644);
86// unlink($noPermissionFile);
87*/
88
89?>

PHPのunlink関数は、指定されたファイルをシステムから削除するための基本的な機能を提供します。この関数は、削除したいファイルのパスを文字列として$filename引数に指定します。オプションの$context引数は、高度なファイルシステム操作に使用されることがありますが、一般的なファイル削除では不要です。関数の実行結果は、削除が成功した場合はtrueを、失敗した場合はfalseを返します。

unlink関数でファイルが削除できない場合の主な原因はいくつかあります。まず、指定されたファイルがそもそも存在しない場合、削除は失敗します。また、unlink関数はファイルを対象とするため、削除しようとしている対象がディレクトリである場合も失敗します。ディレクトリを削除するには、代わりにrmdir()関数を使用する必要があります。

さらに、PHPが実行されているユーザーに、対象ファイルへの書き込み権限がない場合や、ファイルが他のアプリケーションやプロセスによってロックされている場合にも、削除は失敗します。このような削除失敗時には、error_get_last()関数を使用することで、具体的なエラーメッセージを取得し、原因の特定に役立てることができます。これらの点を確認しながらunlink関数を使用することで、より確実なファイル削除処理を実装できます。

unlink関数はファイルを削除するためのものであり、ディレクトリは削除できません。ディレクトリを削除するにはrmdir()関数を使用してください。削除対象のファイルが存在しない場合も失敗しますので、事前にfile_exists()で確認することをお勧めします。また、PHPが動作するユーザーに、削除対象ファイルへの書き込み権限がない場合や、ファイルが他のアプリケーションによって使用中の場合も削除に失敗します。削除が失敗した際はfalseが返るため、必ず戻り値を確認してください。error_get_last()で詳細なエラーメッセージを取得できる場合があり、原因特定に役立ちます。

PHP unlink 存在しないファイル安全に削除する

1<?php
2
3/**
4 * 指定されたファイルを安全に削除します。
5 * ファイルが存在しない場合は削除を試みず、その旨を通知します。
6 *
7 * @param string $filename 削除するファイルのパス
8 * @return void
9 */
10function safeUnlink(string $filename): void
11{
12    echo "--- ファイル削除処理: {$filename} ---\n";
13
14    // 削除対象のファイルが存在するかどうかを確認します。
15    if (file_exists($filename)) {
16        echo "ファイル '{$filename}' は存在します。削除を試みます...\n";
17        
18        // ファイルが存在する場合、unlink関数で削除を試みます。
19        // unlink関数は成功した場合に true、失敗した場合に false を返します。
20        if (unlink($filename)) {
21            echo "ファイル '{$filename}' の削除に成功しました。\n";
22        } else {
23            // 削除に失敗した場合、エラーメッセージを出力します。
24            // 権限不足などが原因で失敗することがあります。
25            echo "エラー: ファイル '{$filename}' の削除に失敗しました。\n";
26        }
27    } else {
28        // ファイルが存在しない場合、unlink関数を呼び出す必要がないことを通知します。
29        // 存在しないファイルに対してunlinkを呼び出すと、E_WARNINGが発生し、falseが返されます。
30        echo "ファイル '{$filename}' は存在しません。削除処理をスキップします。\n";
31    }
32    echo "\n";
33}
34
35// --- 実際の使用例 ---
36
37// 1. 存在しないファイルを削除しようとするケース
38$nonExistentFile = __DIR__ . '/non_existent_example.txt';
39safeUnlink($nonExistentFile);
40
41// 2. 存在するファイルを削除しようとするケース
42$existentFile = __DIR__ . '/existent_example.txt';
43
44// テスト用にファイルを事前に作成します。
45file_put_contents($existentFile, 'このファイルはテスト用に作成され、削除されます。');
46echo "テスト用にファイル '{$existentFile}' を作成しました。\n\n";
47
48safeUnlink($existentFile);
49
50// 3. (再度) 既に削除されたファイルを削除しようとするケース
51//    これは1番目のケースと同じ結果になります。
52safeUnlink($existentFile);
53
54?>

PHPのunlink関数は、ファイルシステムから指定されたファイルを削除するために使用します。第一引数の$filenameには削除したいファイルのパスを文字列で指定し、第二引数の$contextは高度な用途で使用されるため通常は省略します。この関数は、ファイルの削除に成功した場合はtrueを、失敗した場合はfalseをブール値で返します。

特に注意が必要なのは、存在しないファイルに対してunlink関数を直接呼び出すと、PHPが警告(E_WARNING)を発出し、戻り値はfalseとなる点です。これを避けてより安全にファイルを削除するために、サンプルコードのsafeUnlink関数のアプローチが推奨されます。

safeUnlink関数は、まずfile_exists()関数を使って削除対象のファイルが存在するかどうかを事前に確認します。ファイルが存在する場合のみunlink関数を呼び出し、その成否に応じて適切なメッセージを表示します。ファイルが存在しない場合はunlinkの呼び出し自体をスキップし、ファイルが存在しない旨を通知することで、不要な警告の発生を防ぎ、堅牢なファイル削除処理を実現しています。

unlink関数はファイルを削除しますが、存在しないファイルに対して呼び出すとPHPの警告(E_WARNING)が発生し、処理が失敗したと判断されます。サンプルコードのようにfile_exists関数で事前にファイルの存在を確認することは非常に重要です。これにより、存在しないファイルへのunlinkの呼び出しによる無用な警告を避け、安全に削除処理をスキップできます。結果として、エラーログの肥大化を防ぎ、プログラムの安定性を高めます。また、unlink関数の戻り値は削除の成否を示すため、必ず確認してください。削除失敗の原因としては、ファイルへの権限不足などが考えられます。

関連コンテンツ

関連プログラミング言語