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

【PHP8.x】PharFileInfo::getPerms()メソッドの使い方

getPermsメソッドの使い方について、初心者にもわかりやすく解説します。

作成日: 更新日:

基本的な使い方

getPermsメソッドは、Pharアーカイブに格納されている特定のファイルやディレクトリのアクセス権限(パーミッション)を取得するメソッドです。Pharアーカイブとは、複数のPHP関連ファイルを単一のアーカイブにまとめることができる、PHP独自のファイル形式です。

このメソッドは、PharFileInfoオブジェクトが表す、アーカイブ内の個別のファイルやディレクトリに対するアクセス許可の状態を整数値として返します。この整数値は、UNIX系のファイルシステムで一般的に使用されるファイルパーミッションを表しており、ファイルへの読み取り、書き込み、実行といった操作が、誰に対して許可されているかを示します。

システムエンジニアを目指す方にとって、ファイルやディレクトリのセキュリティ管理は重要な知識の一つです。getPermsメソッドを使用することで、Pharアーカイブ内のファイルが意図しないユーザーによって変更されたり、実行されたりするリスクがないかを確認し、適切なセキュリティ設定がなされているかを検証することができます。これにより、アプリケーションの安全性と信頼性を確保する上で役立ちます。

構文(syntax)

1<?php
2$permissions = $pharFileInfo->getPerms();

引数(parameters)

引数なし

引数はありません

戻り値(return)

int

PharFileInfo::getPerms は、この Phar ファイルのエントリに設定されているパーミッション(アクセス権限)を整数値で返します。

サンプルコード

PHP 8 PharFileInfo::getPerms でパーミッションを取得する

1<?php
2
3/**
4 * Pharアーカイブ内のファイルのパーミッションを取得するPHP 8のサンプルコードです。
5 * システムエンジニアを目指す初心者向けに、Pharアーカイブの作成から、
6 * ファイルの追加、パーミッションの取得、そしてクリーンアップまでの一連の流れを示します。
7 *
8 * 注意: このコードはPharアーカイブを作成・操作するため、
9 *       php.ini の 'phar.readonly' 設定が '0' (false) である必要があります。
10 *       開発環境で一時的に `ini_set('phar.readonly', 0);` を使用することも可能ですが、
11 *       セキュリティ上の理由から本番環境での実行は推奨されません。
12 */
13function demonstratePharFileInfoGetPerms(): void
14{
15    $pharPath = __DIR__ . '/example.phar'; // 作成するPharアーカイブのパス
16    $testFilePath = __DIR__ . '/temp_file.txt'; // Pharに追加する一時ファイルのパス
17    $entryName = 'my_document.txt'; // Pharアーカイブ内のエントリ名
18
19    // 1. テスト用の一時ファイルを作成し、内容を書き込む
20    echo "1. テスト用の一時ファイルを作成中: {$testFilePath}\n";
21    if (file_put_contents($testFilePath, "これはPharアーカイブに追加されるテストファイルです。") === false) {
22        echo "エラー: テストファイルの作成に失敗しました。\n";
23        return;
24    }
25    // テストファイルのパーミッションを設定 (例: 所有者読み書き、グループ・その他読み取りのみ)
26    // Windows環境ではchmodは限定的な効果しかない場合があります。
27    chmod($testFilePath, 0644); // rw-r--r-- (8進数表記)
28
29    $phar = null; // PharDataオブジェクトを保持する変数
30
31    try {
32        // 既存のPharアーカイブがあれば、上書きするために削除
33        if (file_exists($pharPath)) {
34            unlink($pharPath);
35        }
36
37        // 2. PharDataオブジェクトを作成
38        // PharDataは、Phar形式だけでなく、tarやzipのような一般的なアーカイブも扱えます。
39        echo "2. Pharアーカイブを作成中: {$pharPath}\n";
40        $phar = new PharData($pharPath);
41
42        // 3. 作成した一時ファイルをPharアーカイブに追加
43        echo "3. ファイル '{$testFilePath}' をPharアーカイブに '{$entryName}' として追加中。\n";
44        $phar->addFile($testFilePath, $entryName);
45
46        // 4. 追加したファイルのエントリからPharFileInfoオブジェクトを取得
47        // これはPharアーカイブ内の特定のファイルに関する情報を持つオブジェクトです。
48        echo "4. 追加されたファイル '{$entryName}' の情報を取得中。\n";
49        $fileInfo = $phar[$entryName]; // 配列アクセスのようにPharFileInfoオブジェクトを取得
50
51        // 5. PharFileInfo::getPerms() を使用してパーミッションを取得
52        // このメソッドは、ファイルエントリのパーミッションを整数値で返します。
53        echo "5. '{$entryName}' のパーミッションを取得中...\n";
54        $perms = $fileInfo->getPerms();
55
56        // 取得したパーミッションは整数値です。
57        // 人間が読みやすい8進数表記 (例: 0644) に変換して表示します。
58        // 通常、ファイルパーミッションのみを取得するために、0777 (rwxrwxrwx) と論理ANDを取ります。
59        // sprintf('%04o', ...) は4桁0埋めの8進数表記にします。
60        echo "   取得されたパーミッション (整数値): {$perms}\n";
61        echo "   取得されたパーミッション (8進数表記): " . sprintf('%04o', $perms & 0777) . "\n";
62        // 例: '0644' と表示されます。
63
64    } catch (Exception $e) {
65        // エラーが発生した場合の処理
66        echo "エラーが発生しました: " . $e->getMessage() . "\n";
67    } finally {
68        // 6. クリーンアップ: 作成したPharアーカイブと一時ファイルを削除
69        echo "6. クリーンアップ中...\n";
70
71        // PharDataオブジェクトがファイルをロックしている可能性があるため、
72        // 削除する前に参照を解除する必要があります。
73        $phar = null;
74
75        if (file_exists($testFilePath)) {
76            unlink($testFilePath);
77            echo "   一時ファイル '{$testFilePath}' を削除しました。\n";
78        }
79        if (file_exists($pharPath)) {
80            unlink($pharPath);
81            echo "   Pharアーカイブ '{$pharPath}' を削除しました。\n";
82        }
83    }
84}
85
86// 関数を実行してサンプルコードの動作を確認します。
87demonstratePharFileInfoGetPerms();
88

このサンプルコードは、PHP 8でPharアーカイブ内のファイルのパーミッションを取得するPharFileInfo::getPerms()メソッドの利用方法を、システムエンジニアを目指す初心者向けに示しています。Pharアーカイブは、複数のファイルを一つの実行可能なアーカイブにまとめることができるPHP独自の形式です。

getPerms()メソッドは、引数を必要とせず、Pharアーカイブ内の特定のファイルエントリのアクセス権限を整数値として返します。この整数値は、UNIXライクなシステムで使われるパーミッション(例: 0644)を表しており、8進数に変換することで視覚的に分かりやすくなります。

コードでは、まず一時的なテキストファイルを作成し、そのパーミッションを設定します。次に、PharDataクラスを用いてPharアーカイブを生成し、作成した一時ファイルをアーカイブ内に追加します。追加されたファイルのエントリからPharFileInfoオブジェクトを取得し、そのオブジェクトのgetPerms()メソッドを呼び出すことで、ファイルに設定されたパーミッション情報を正確に取得しています。取得したパーミッションは、sprintf('%04o', $perms & 0777)を使って4桁の8進数表記に変換して表示されます。

Pharアーカイブの作成や変更には、php.ini設定のphar.readonlyが0(無効)である必要があります。コードの最後では、作成したアーカイブと一時ファイルを確実に削除するクリーンアップ処理も含まれており、この一連のプロセスを通じてgetPerms()の動作を具体的に理解することができます。

このコードはPharアーカイブの作成や変更を伴うため、php.iniのphar.readonly設定を0にする必要があります。セキュリティ上の理由から、本番環境での実行は推奨されません。getPerms()メソッドはファイルのパーミッションを整数値で返しますので、人間が読みやすい8進数表記にするには、取得した値と0777の論理ANDを取り、sprintf('%04o', ...)で整形してください。また、chmodはWindows環境ではその効果が限定的である場合があります。Pharアーカイブ操作後は、作成されたファイルを正しく削除するため、$phar = null;のようにPharオブジェクトの参照を解除することが重要です。

PharFileInfo::getPerms() でパーミッションを取得する

1<?php
2
3// PHARアーカイブを一時的に作成するためのファイル名と、その中に含めるファイルの情報
4$pharFileName = 'temp_example.phar';
5$fileInPhar = 'my_document.txt';
6$fileContent = 'これはPHARアーカイブ内のテストファイルです。';
7
8// システムエンジニアを目指す初心者の方へ:
9// このコードは、PHPのPhar(PHP Archive)拡張機能を使って、
10// アーカイブファイル(.phar)内の特定のファイルのパーミッション(読み書き権限など)を取得する方法を示します。
11//
12// 注意:指定されたキーワード「php get params from url」とは直接関係がありません。
13// このコードは、ファイルシステムのパーミッションに関連する機能の例です。
14// URLパラメータを取得するには、通常 $_GET スーパーグローバル変数を使用します。
15
16try {
17    // 1. 新しいPHARアーカイブを作成または既存のアーカイブを上書きします。
18    // 'w' モードは、書き込み用にファイルを開き、既存の内容があればクリアします。
19    $phar = new Phar($pharFileName, 0, 'temp_example.phar');
20
21    // PHARアーカイブへの書き込みを開始します。
22    // これにより、ファイルがディスクに書き込まれるのを一時的に遅らせます。
23    $phar->startBuffering();
24
25    // 2. PHARアーカイブ内にファイルを追加します。
26    // このメソッドはファイルの内容を直接文字列として追加します。
27    // 追加されたファイルのデフォルトパーミッションは通常 0644 (rw-r--r--) です。
28    $phar->addFromString($fileInPhar, $fileContent);
29
30    // 3. PHARアーカイブへの書き込みを終了し、変更をディスクに保存します。
31    $phar->stopBuffering();
32
33    // 4. PHARアーカイブ内の特定のファイルに対応するPharFileInfoオブジェクトを取得します。
34    // Pharオブジェクトは連想配列のように扱うことができ、ファイル名でアクセスすると
35    // そのファイルのPharFileInfoオブジェクトが返されます。
36    $fileInfo = $phar[$fileInPhar];
37
38    // 5. PharFileInfo::getPerms() メソッドを呼び出して、ファイルのパーミッションを取得します。
39    // 戻り値は整数値で、ファイルシステムのパーミッション(例: 0644)を表します。
40    $permissions = $fileInfo->getPerms();
41
42    // 6. 取得したパーミッションを表示します。
43    // sprintf("0%o", $permissions) は、整数値を8進数(例: 644)としてフォーマットするPHPの一般的な方法です。
44    echo "PHARアーカイブ内のファイル '{$fileInPhar}' のパーミッション: " . sprintf("0%o", $permissions) . PHP_EOL;
45    echo "(数値表現: {$permissions})" . PHP_EOL;
46
47} catch (Exception $e) {
48    // PHAR操作中にエラーが発生した場合、例外がスローされます。
49    echo "エラーが発生しました: " . $e->getMessage() . PHP_EOL;
50} finally {
51    // 最後に、作成した一時的なPHARアーカイブファイルを削除してクリーンアップします。
52    // unset($phar) は、PHARファイルへのすべての参照を解放し、ファイルを削除可能にします。
53    if (isset($phar)) {
54        unset($phar);
55    }
56    if (file_exists($pharFileName)) {
57        unlink($pharFileName);
58        echo "一時的なPHARアーカイブ '{$pharFileName}' を削除しました。" . PHP_EOL;
59    }
60}

PharFileInfo::getPermsメソッドは、PHPのPhar(PHP Archive)拡張機能を使って作成されたアーカイブファイル(.phar)内に含まれる、特定のファイルのパーミッション(読み書き権限など)を取得するための機能です。

このサンプルコードは、まず一時的なPHARアーカイブを作成し、その中にテキストファイルを追加する一連の流れを示しています。ファイルを追加した後、アーカイブ内の特定のファイルに対応するPharFileInfoオブジェクトを取得します。このオブジェクトは、アーカイブ内の個々のファイルに関する詳細情報にアクセスするための窓口となります。

そして、取得したPharFileInfoオブジェクトに対しgetPerms()メソッドを呼び出すことで、対象ファイルのパーミッションを整数値として取得します。このメソッドは引数を必要とせず、ファイルのアクセス権限を示す整数値(例えば、読み書き権限が0644の場合、その10進数表現)を戻り値として返します。この整数値は、ファイルが誰によってどのようにアクセスできるかという情報を含んでおり、通常は8進数形式に変換して表示されます。この機能は、PHARアーカイブ内のファイルの権限設定を確認する際に利用されます。

このサンプルコードは、URLパラメータを取得するものではなく、PHPのPhar拡張機能を使ってアーカイブ内のファイルのパーミッション(アクセス権限)を取得する方法を示しています。URLパラメータは通常$_GETスーパーグローバル変数で扱いますので、混同しないようご注意ください。getPerms()メソッドの戻り値はパーミッションを表す整数値ですが、ファイル権限は0644のような8進数で表現されるのが一般的なため、表示する際にはsprintf("0%o", ...)で変換している点に注目してください。PharはPHPコードをアーカイブする特殊な機能であり、一時ファイルの作成と削除、例外処理による安全なクリーンアップは、他のファイル操作にも応用できる重要な実践例です。本番環境でのPhar利用は、セキュリティ面も考慮し慎重に進めるようにしてください。

関連コンテンツ

関連IT用語

関連プログラミング言語