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

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

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

作成日: 更新日:

基本的な使い方

linkinfo関数は、指定されたパスがシンボリックリンクである場合に、その有効性や指し示す対象の種類に関する情報を取得する関数です。この関数は、ファイルシステム上のシンボリックリンクが、正しく機能しているか、つまり有効なターゲットを指しているかを確認する際に利用されます。

引数には、情報取得の対象となるシンボリックリンクのパスを文字列としてpathに指定します。

処理が成功した場合、linkinfo関数は整数値を返します。この整数値は、シンボリックリンクが指す対象の種類を示しており、例えば通常のファイルを指していれば特定の値、ディレクトリを指していれば別の値が返されます。特に重要なのは、シンボリックリンク自体は存在するものの、それが指し示す先のファイルやディレクトリが存在しない(いわゆる「壊れたリンク」の状態)場合は、0(ゼロ)を返す点です。これにより、リンクが有効であるかどうかの確認を直接的に行えます。指定されたpathが存在しない場合や、関数実行中にその他のエラーが発生した場合には、falseが返されます。

この関数は、ファイルシステム操作において、シンボリックリンクが期待通りに機能しているか検証したり、有効なリンクのみを処理したい場合などに非常に有用です。

構文(syntax)

1$info = linkinfo('/path/to/link_or_file');

引数(parameters)

string $path

  • string $path: リンク先のファイルパスを指定する文字列

戻り値(return)

int|false

指定されたリンク情報、またはリンク情報が存在しない場合はfalseを返します。

サンプルコード

PHP linkinfoでシンボリックリンクを調べる

1<?php
2
3/**
4 * 指定されたパスのシンボリックリンク情報を取得し、表示します。
5 * システムエンジニアを目指す初心者向けに、linkinfo関数の使い方を具体的に示します。
6 * Webサーバーでアクセスされるファイルパス(URLに関連するパス)がシンボリックリンクであるかを
7 * 確認するシナリオなどに応用できます。
8 *
9 * @param string $path 情報を取得したいファイルまたはディレクトリのパス。
10 * @return void
11 */
12function displayLinkInfo(string $path): void
13{
14    echo "--- パス: '{$path}' の情報 ---" . PHP_EOL;
15
16    // linkinfo関数は、指定されたパスがシンボリックリンクであれば、
17    // そのリンク先のデバイス番号(inodeが属するデバイスの識別子)を整数で返します。
18    // シンボリックリンクでない場合や、パスが存在しない、アクセスできない場合は false を返します。
19    $info = linkinfo($path);
20
21    if ($info === false) {
22        // linkinfoがfalseを返した場合、以下のいずれかの状況が考えられます。
23        if (!file_exists($path)) {
24            echo "エラー: パス '{$path}' は存在しません。" . PHP_EOL;
25        } elseif (!is_link($path)) {
26            echo "情報: パス '{$path}' はシンボリックリンクではありません。" . PHP_EOL;
27        } else {
28            // パスは存在するがlinkinfoが失敗した場合(権限不足など)
29            echo "エラー: シンボリックリンク '{$path}' の情報を取得できませんでした。";
30            echo "(存在しない、またはアクセス権限がない可能性があります)" . PHP_EOL;
31        }
32    } else {
33        echo "情報: パス '{$path}' はシンボリックリンクです。" . PHP_EOL;
34        echo "リンク先のデバイス番号 (st_dev): {$info}" . PHP_EOL;
35
36        // シンボリックリンクの場合、readlink() を使用して実際のターゲットパスを取得できます。
37        $target = readlink($path);
38        if ($target !== false) {
39            echo "リンク先のパス: '{$target}'" . PHP_EOL;
40        } else {
41            echo "警告: シンボリックリンク '{$path}' のリンク先を取得できませんでした。" . PHP_EOL;
42        }
43    }
44    echo PHP_EOL;
45}
46
47// --- サンプル実行 ---
48
49// 例1: 現在実行中のPHPスクリプトのパスを確認する
50// $_SERVER['SCRIPT_FILENAME'] は、Webサーバー上で実行されている現在のPHPスクリプトの
51// 絶対ファイルパスを返します。これは「URL」でアクセスされるファイルパスの一例です。
52$currentScriptPath = $_SERVER['SCRIPT_FILENAME'];
53displayLinkInfo($currentScriptPath);
54
55// 例2: 存在しないパスの確認
56// linkinfoは存在しないパスに対して false を返します。
57displayLinkInfo('/path/to/non_existent_file_or_link');
58
59// 例3: シンボリックリンクではない通常のファイルの確認
60// linkinfoはシンボリックリンクではないファイルに対して false を返します。
61$tempFile = sys_get_temp_dir() . DIRECTORY_SEPARATOR . 'my_regular_file.txt';
62file_put_contents($tempFile, 'This is a test file.');
63displayLinkInfo($tempFile);
64unlink($tempFile); // テストファイルを削除
65
66// 例4: シンボリックリンクの確認(テスト用に作成)
67// symlink()関数を使って一時的にシンボリックリンクを作成し、linkinfoで情報を取得します。
68// Windows環境でこのコードを実行する場合、symlink()は管理者権限が必要な場合があります。
69$originalFile = sys_get_temp_dir() . DIRECTORY_SEPARATOR . 'original_target.txt';
70$symlinkPath = sys_get_temp_dir() . DIRECTORY_SEPARATOR . 'test_symlink.txt';
71file_put_contents($originalFile, 'This is the original content.');
72
73if (symlink($originalFile, $symlinkPath)) {
74    echo "--- テスト用シンボリックリンクの作成に成功しました ---" . PHP_EOL;
75    displayLinkInfo($symlinkPath);
76    unlink($symlinkPath); // テスト用シンボリックリンクを削除
77    unlink($originalFile); // 元のファイルを削除
78    echo "--- テスト用シンボリックリンクを削除しました ---" . PHP_EOL . PHP_EOL;
79} else {
80    echo "警告: シンボリックリンクの作成に失敗しました。" . PHP_EOL;
81    echo "この環境では symlink() がサポートされていないか、実行権限がありません。" . PHP_EOL;
82    echo "(例4: シンボリックリンクの確認 はスキップされます)" . PHP_EOL . PHP_EOL;
83    if (file_exists($originalFile)) {
84        unlink($originalFile); // 元のファイルが存在すれば削除
85    }
86}
87
88?>

PHPのlinkinfo関数は、指定されたファイルやディレクトリのパスがシンボリックリンクであるかどうかを判断するために利用されます。引数$pathには、情報を取得したいファイルまたはディレクトリのパスを文字列で渡します。この関数は、パスがシンボリックリンクであれば、そのリンク先のファイルシステムにおけるデバイス番号を整数で返します。一方、パスが存在しない、シンボリックリンクではない、またはアクセス権限がないなどの理由で情報を取得できなかった場合はfalseを返します。

このサンプルコードでは、displayLinkInfo関数を通じてlinkinfo関数の具体的な使い方を示しています。例えば、Webサーバー上で実行されているPHPスクリプトのパス($_SERVER['SCRIPT_FILENAME'])がシンボリックリンクであるかを確認するような場面で活用できます。linkinfofalseを返した場合は、パスが存在しないか、あるいは通常のファイルやディレクトリである可能性があり、その状況に応じてメッセージを表示します。整数が返された場合はシンボリックリンクであることを示し、さらにreadlink関数を使って実際のリンク先のパスも取得し、出力しています。システムエンジニアとしてファイルシステムを調査し、特にWebサーバーのデプロイメントやセキュリティ管理において、シンボリックリンクの存在を確認する際に非常に有用な関数です。

linkinfo関数は、指定されたパスがシンボリックリンクの場合にそのデバイス番号を整数で返し、シンボリックリンクでない、パスが存在しない、またはアクセスできない場合はfalseを返します。そのため、戻り値を判定する際は=== falseによる厳密な比較が非常に重要です。パスが存在していてもそれがシンボリックリンクでなければfalseが返される点に注意し、file_exists()is_link()などの関数と組み合わせることで、より詳細な状況を判断できます。また、アクセス権限不足によってもfalseとなるため、エラーハンドリングを丁寧に行う必要があります。Windows環境でsymlink()関数などを用いてシンボリックリンクを作成・操作する場合、管理者権限が必要となるケースがあるため、実行環境の特性に注意してください。シンボリックリンクが指し示す実際のリンク先パスは、readlink()関数を併用することで取得できます。

PHP linkinfoでシンボリックリンク情報を取得する

1<?php
2
3/**
4 * PHPのlinkinfo関数を使用してシンボリックリンクの情報を取得するデモンストレーションを行います。
5 *
6 * linkinfo() 関数は、指定されたパスがシンボリックリンクである場合に、
7 * そのリンク自体に関する低レベルなモード情報(ファイルタイプなど)を整数値で返します。
8 * これは、リンクが指すファイルの情報ではなく、リンク自身の情報を評価する点で stat() 関数とは異なります。
9 * 失敗した場合は false を返します。
10 *
11 * @return void
12 */
13function demonstrateLinkinfoUsage(): void
14{
15    // 一時ファイルとシンボリックリンクのパスを定義します。
16    // システムの一時ディレクトリを使用し、ユニークな名前を生成します。
17    $tempDir = sys_get_temp_dir();
18    $originalFilePath = $tempDir . DIRECTORY_SEPARATOR . 'original_file_' . uniqid() . '.txt';
19    $symlinkPath = $tempDir . DIRECTORY_SEPARATOR . 'my_symlink_' . uniqid() . '.lnk';
20
21    // スクリプトの実行が終了する際に、作成したファイルとリンクを確実に削除するための関数を登録します。
22    // これにより、スクリプトが正常終了しても、エラーで中断しても、クリーンアップが行われます。
23    register_shutdown_function(function() use ($originalFilePath, $symlinkPath) {
24        if (file_exists($symlinkPath)) {
25            @unlink($symlinkPath); // @ でエラー出力を抑制
26        }
27        if (file_exists($originalFilePath)) {
28            @unlink($originalFilePath); // @ でエラー出力を抑制
29        }
30    });
31
32    echo "--- linkinfo() 関数の使用例 ---" . PHP_EOL;
33
34    // 1. 元のファイルを作成します。
35    if (file_put_contents($originalFilePath, "これはシンボリックリンクのテスト用ファイルです。\n") === false) {
36        echo "エラー: 元のファイル '{$originalFilePath}' の作成に失敗しました。" . PHP_EOL;
37        return; // 処理を終了
38    }
39    echo "1. 元のファイル '{$originalFilePath}' を作成しました。" . PHP_EOL;
40
41    // 2. 作成したファイルへのシンボリックリンクを作成します。
42    // 注意: Windows環境では、symlink() を使用するために管理者権限が必要な場合があります。
43    //       また、開発者モードが有効になっている必要があったり、OSのバージョンによっては動作が異なります。
44    //       @ で警告を抑制し、独自にエラーメッセージを表示します。
45    if (!@symlink($originalFilePath, $symlinkPath)) {
46        $error = error_get_last();
47        echo "エラー: シンボリックリンク '{$symlinkPath}' の作成に失敗しました。" . PHP_EOL;
48        echo "  詳細: " . ($error['message'] ?? '不明なエラー') . PHP_EOL;
49        return; // 処理を終了
50    }
51    echo "2. シンボリックリンク '{$symlinkPath}' を作成しました。" . PHP_EOL;
52
53    // 3. linkinfo() 関数を使用してシンボリックリンクの情報を取得します。
54    echo "3. linkinfo() を使ってシンボリックリンク '{$symlinkPath}' の情報を取得します..." . PHP_EOL;
55    $linkInfoResult = linkinfo($symlinkPath);
56
57    if ($linkInfoResult !== false) {
58        echo "  linkinfo() は成功し、次の整数値を返しました: " . $linkInfoResult . PHP_EOL;
59        echo "  この値は、シンボリックリンクのファイルタイプなどを示す低レベルなモード情報です。" . PHP_EOL;
60        echo "  (より詳しい情報を得るには、この値をビット演算で解析する必要がありますが、" . PHP_EOL;
61        echo "  ここでは linkinfo() がシンボリックリンク自体の情報を取得できることを示しています。)" . PHP_EOL;
62    } else {
63        echo "  エラー: linkinfo() がシンボリックリンク '{$symlinkPath}' の情報取得に失敗しました。" . PHP_EOL;
64        $error = error_get_last();
65        echo "  詳細: " . ($error['message'] ?? '不明なエラー') . PHP_EOL;
66    }
67
68    echo "--- デモンストレーション終了 ---" . PHP_EOL;
69    echo "作成したファイルとリンクは自動的に削除されます。" . PHP_EOL;
70}
71
72// デモンストレーション関数を実行します。
73demonstrateLinkinfoUsage();
74
75?>

PHPのlinkinfo関数は、指定されたパスがシンボリックリンクである場合に、そのリンク自体に関する低レベルなモード情報(ファイルタイプなど)を整数値で取得するための機能です。この関数は、シンボリックリンクが指し示している先のファイル情報ではなく、シンボリックリンクそのものの情報を評価する点が特徴です。

引数 $path には、情報を取得したいシンボリックリンクへのパスを文字列で指定します。 処理が成功すると、シンボリックリンクのファイルタイプなどを示す整数値が返されます。この整数値は、シンボリックリンクがどのように設定されているかを示す低レベルな情報であり、通常はビット演算によって詳細を解析します。もし、何らかの理由で情報の取得に失敗した場合は、戻り値としてfalseが返されます。

サンプルコードでは、まず一時ファイルを作成し、次にそのファイルへのシンボリックリンクを作成しています。その後、linkinfo($symlinkPath)のように作成したシンボリックリンクのパスを引数に渡して関数を呼び出し、そのリンクのモード情報を取得しています。これにより、プログラムでシンボリックリンクの存在や種類を判別する際にこの関数が役立つことを示しています。

linkinfo関数は、シンボリックリンク自体に関する低レベルなモード情報を取得するもので、リンク先のファイルの情報ではないことにご注意ください。サンプルコードでシンボリックリンクを作成するsymlink関数は、特にWindows環境では管理者権限や開発者モードの設定が必要な場合があり、環境によって動作が異なりますので、事前の確認が重要です。linkinfo関数は失敗するとfalseを返すため、必ず戻り値をチェックし、適切なエラー処理を実装してください。また、本サンプルのように、一時的に作成したファイルやリンクは、register_shutdown_functionを使ってスクリプト終了時に確実に削除する仕組みを取り入れることで、ファイルシステムをきれいに保つことができます。

関連コンテンツ

関連IT用語

関連プログラミング言語