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

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

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

作成日: 更新日:

基本的な使い方

isExecutableメソッドは、PHPのPhar拡張機能の一部として提供されるPharFileInfoクラスに属するメソッドです。このメソッドは、Pharアーカイブという、PHPアプリケーションを単一のファイルとしてパッケージ化し配布するための標準的な形式において、そのアーカイブ内の特定のエントリ(ファイル)が実行可能であるかどうかを判定するために使用されます。

具体的には、PharFileInfoオブジェクトのインスタンスに対してisExecutableメソッドを呼び出すことで、そのオブジェクトが指し示すPharアーカイブ内のファイルに実行権限が設定されているかどうかが確認されます。ファイルが実行可能であると判断された場合はtrue(真)を返し、実行可能でない場合はfalse(偽)を返します。

この実行可能性の判定は、主にUNIX系オペレーティングシステムにおけるファイルの実行パーミッション(例えば、chmod +xコマンドで設定されるような権限)に基づいています。システムエンジニアを目指す方々にとって、isExecutableメソッドは、Pharアーカイブ内のスクリプトやバイナリファイルを実行する前に、そのファイルが適切な実行権限を持っているかをプログラム上で確認し、アプリケーションのセキュリティや実行フローを安全に制御するために非常に重要な役割を果たします。

構文(syntax)

1<?php
2$pharPath = __DIR__ . '/temp_example.phar';
3@unlink($pharPath);
4$phar = new Phar($pharPath);
5$phar->startBuffering();
6$phar->addFromString('example.php', '<?php echo "Hello from Phar!"; ?>');
7$phar->setStub('<?php __HALT_COMPILER(); ?>');
8$phar->stopBuffering();
9$pharFileInfo = $phar['example.php'];
10$isExecutable = $pharFileInfo->isExecutable();
11@unlink($pharPath);
12?>

引数(parameters)

引数なし

引数はありません

戻り値(return)

bool

PharFileInfo::isExecutable は、そのファイルが実行可能である場合に true を、そうでない場合に false を返します。

サンプルコード

PHP PharFileInfo isExecutableで実行可能性をチェックする

1<?php
2
3/**
4 * Pharアーカイブ内のファイルの実行可能性をチェックするサンプルコード。
5 *
6 * このスクリプトは一時的なPharアーカイブを作成し、
7 * その中に実行可能として設定されたファイルとそうでないファイルを追加します。
8 * その後、PharFileInfo::isExecutable() メソッドを使用して、
9 * 各ファイルの実行権限が正しく認識されるかを確認します。
10 *
11 * 注意: Phar拡張が有効であり、php.iniで 'phar.readonly = 0' が設定されている必要があります。
12 */
13
14// 一時的に作成するPharアーカイブのファイル名
15$pharFileName = 'example_archive.phar';
16
17// スクリプトの終了時に作成したPharファイルを自動的にクリーンアップするための関数を登録
18register_shutdown_function(function (string $fileName): void {
19    if (file_exists($fileName)) {
20        // Pharアーカイブをアンリンク(削除)
21        Phar::unlinkArchive($fileName);
22        echo "Cleaned up '{$fileName}'." . PHP_EOL;
23    }
24}, $pharFileName);
25
26try {
27    // Pharアーカイブを書き込みモードで作成・変更できるように設定
28    ini_set('phar.readonly', '0');
29
30    // 新しいPharアーカイブを作成
31    // PHP 8.0ではnew Phar()は非推奨ですが、サンプルコードの簡潔さを優先しています。
32    // PHP 8.1以降ではこのコンストラクタは削除されています。
33    $phar = new Phar($pharFileName);
34    $phar->startBuffering(); // バッファリングを開始し、効率的な書き込みを可能にする
35
36    // 1. 実行可能として設定するファイルの内容とパスを定義し、Pharに追加
37    $executableFilePath = 'scripts/run.php';
38    $executableContent = '#!/usr/bin/env php' . PHP_EOL . '<?php echo "Hello from executable script!";';
39    $phar->addFromString($executableFilePath, $executableContent);
40    // Pharアーカイブ内のファイルのパーミッションを設定(0755: 実行可能)
41    $phar[$executableFilePath]->chmod(0755);
42
43    // 2. 実行可能でないとして設定するファイルの内容とパスを定義し、Pharに追加
44    $nonExecutableFilePath = 'docs/README.txt';
45    $nonExecutableContent = 'This is a plain text file. It should not be executable.';
46    $phar->addFromString($nonExecutableFilePath, $nonExecutableContent);
47    // Pharアーカイブ内のファイルのパーミッションを設定(0644: 読み書きのみ、実行不可)
48    $phar[$nonExecutableFilePath]->chmod(0644);
49
50    // Pharアーカイブが実行されたときに最初に実行されるstubを設定
51    $phar->setStub($phar->createDefaultStub($executableFilePath));
52
53    $phar->stopBuffering(); // バッファリングを停止し、変更をPharファイルに書き込む
54
55    echo "Phar archive '{$pharFileName}' created successfully." . PHP_EOL . PHP_EOL;
56
57    // 作成したPharアーカイブ内の各ファイルについて、PharFileInfo::isExecutable() メソッドで実行可能性をチェック
58    echo "Checking execution status of files in '{$pharFileName}':" . PHP_EOL;
59
60    // 実行可能として設定したファイルの確認
61    $fileInfoExecutable = $phar[$executableFilePath];
62    echo " - '{$executableFilePath}': ";
63    if ($fileInfoExecutable->isExecutable()) {
64        echo "YES, it is executable." . PHP_EOL;
65    } else {
66        echo "NO, it is NOT executable." . PHP_EOL;
67    }
68
69    // 実行可能でないとして設定したファイルの確認
70    $fileInfoNonExecutable = $phar[$nonExecutableFilePath];
71    echo " - '{$nonExecutableFilePath}': ";
72    if ($fileInfoNonExecutable->isExecutable()) {
73        echo "YES, it is executable." . PHP_EOL;
74    } else {
75        echo "NO, it is NOT executable." . PHP_EOL;
76    }
77
78} catch (PharException $e) {
79    echo "Error with Phar archive: " . $e->getMessage() . PHP_EOL;
80} catch (Exception $e) {
81    echo "An unexpected error occurred: " . $e->getMessage() . PHP_EOL;
82}
83

PharFileInfo::isExecutable()メソッドは、PHPのPhar(PHP Archive)拡張機能の一部として提供され、Pharアーカイブ内部に格納されている特定のファイルが実行可能であるかどうかを判別します。このメソッドは引数を一切受け取らず、対象のファイルに実行権限が設定されていればtrue(真)を、設定されていなければfalse(偽)をブール値として返します。

サンプルコードでは、一時的なPharアーカイブを作成し、その中に二つのファイルを追加しています。一つは実行可能なパーミッション(0755)を設定したスクリプトファイル、もう一つは実行不可能なパーミッション(0644)を設定したテキストファイルです。その後、それぞれのファイルに対応するPharFileInfoオブジェクトを取得し、isExecutable()メソッドを呼び出して実行可能性をチェックしています。これにより、実行権限が付与されたファイルではtrueが、そうでないファイルではfalseが正しく返されることが確認できます。この機能は、Pharアーカイブ化されたアプリケーション内で、特定のスクリプトやプログラムが正しく実行権限を持っているかを確認する際に役立ちます。

このサンプルコードは、Pharアーカイブの作成と、その中のファイルの実行可能性をisExecutable()で確認する方法を示しています。Pharアーカイブを新規作成または変更する際には、PHPのphar.readonly設定を0にすることが必須であり、Phar拡張が有効である必要があります。また、PHP 8.1以降ではnew Phar()コンストラクタが削除されているため、PHPのバージョン互換性にご注意ください。isExecutable()メソッドは、アーカイブ内のファイルにchmod()で設定された実行パーミッション(例えば0755)に基づいて判断を行います。一時的に作成するPharファイルは、register_shutdown_functionを用いてスクリプト終了時に確実に削除し、不要なファイルが残らないようにクリーンアップを徹底してください。例外処理によるエラーハンドリングも、安定した運用には不可欠です。

PHP PharFileInfo::isExecutable で実行可能性をチェックする

1<?php
2
3/**
4 * PharFileInfo::isExecutable メソッドの動作を示すサンプルコードです。
5 *
6 * このコードは、一時的なPharアーカイブを作成し、その中に実行可能ファイルと
7 * そうではないファイルを追加します。その後、Pharアーカイブ内の各ファイルについて、
8 * PharFileInfo::isExecutable メソッドを使用して、ファイルが実行可能かどうかを
9 * チェックし、結果を出力します。
10 *
11 * 注意: Pharアーカイブを作成するため、php.ini の 'phar.readonly' 設定が '0'
12 * (無効) である必要があります。このサンプルコードでは一時的に設定を変更しますが、
13 * 本番環境での 'phar.readonly' の変更は推奨されません。
14 */
15function demonstratePharFileInfoIsExecutable(): void
16{
17    $pharPath = 'my_test_archive.phar';
18    // 一時ディレクトリ名を生成
19    $tempDir = sys_get_temp_dir() . '/phar_test_' . uniqid('php_exec_');
20    $phar = null; // Pharオブジェクトを初期化
21
22    // php.ini の 'phar.readonly' 設定を一時的に無効にする
23    // Pharアーカイブの作成にはこの設定が必要となる場合があります。
24    $oldReadonly = ini_get('phar.readonly');
25    if ($oldReadonly === '1') {
26        ini_set('phar.readonly', '0');
27    }
28
29    try {
30        // 一時ディレクトリを作成し、テストファイルを用意
31        if (!mkdir($tempDir) && !is_dir($tempDir)) {
32            throw new RuntimeException(sprintf('Failed to create temporary directory "%s"', $tempDir));
33        }
34
35        // 実行可能なPHPスクリプトファイルを作成
36        $executableFilePath = $tempDir . '/executable_script.php';
37        file_put_contents($executableFilePath, "#!/usr/bin/env php\n<?php echo 'Hello from executable.php!';");
38        // ファイルに実行可能パーミッション (0755) を設定
39        chmod($executableFilePath, 0755);
40
41        // 実行可能ではないテキストファイルを作成
42        $textFilePath = $tempDir . '/plain_text.txt';
43        file_put_contents($textFilePath, "This is a plain text file.");
44        // ファイルに読み書きパーミッション (0644) を設定
45        chmod($textFilePath, 0644);
46
47        // 既存のPharファイルがあれば削除
48        if (file_exists($pharPath)) {
49            unlink($pharPath);
50        }
51
52        // Pharアーカイブを作成
53        $phar = new Phar($pharPath);
54        $phar->startBuffering(); // バッファリングを開始し、効率的にファイルを追加
55
56        // テストファイルをPharアーカイブに追加
57        // 第2引数でアーカイブ内のパス名を指定
58        $phar->addFile($executableFilePath, 'executable.php');
59        $phar->addFile($textFilePath, 'plain_text.txt');
60
61        $phar->stopBuffering(); // バッファリングを終了し、変更をPharファイルに書き込む
62
63        echo "テストPharファイル '{$pharPath}' を作成しました。\n";
64        echo "一時ディレクトリ '{$tempDir}' にテストファイルを作成しました。\n";
65
66        echo "\n--- Pharアーカイブ内のファイル実行可能性チェック ---\n";
67        // Pharオブジェクトをイテレートし、各PharFileInfoオブジェクトを取得
68        foreach ($phar as $fileInfo) {
69            // $fileInfo は PharFileInfo のインスタンス
70            if ($fileInfo instanceof PharFileInfo) {
71                $fileName = $fileInfo->getFilename();
72                // isExecutableメソッドでファイルの実行可能性をチェック
73                $isExecutable = $fileInfo->isExecutable();
74
75                echo " - ファイル: '{$fileName}' ";
76                if ($isExecutable) {
77                    echo "は実行可能です。\n";
78                } else {
79                    echo "は実行可能ではありません。\n";
80                }
81            }
82        }
83
84    } catch (Exception $e) {
85        echo "エラーが発生しました: " . $e->getMessage() . "\n";
86    } finally {
87        // Pharオブジェクトを明示的に解放し、ファイルハンドルを閉じる
88        $phar = null;
89
90        // 後処理: 作成したPharファイルと一時ファイルを削除
91        if (file_exists($pharPath)) {
92            unlink($pharPath);
93            echo "\nテストPharファイル '{$pharPath}' を削除しました。\n";
94        }
95        if (is_dir($tempDir)) {
96            foreach (glob("{$tempDir}/*") as $file) {
97                unlink($file);
98            }
99            rmdir($tempDir);
100            echo "一時ディレクトリ '{$tempDir}' を削除しました。\n";
101        }
102
103        // 'phar.readonly' 設定を元の値に戻す
104        if ($oldReadonly === '1') {
105            ini_set('phar.readonly', '1');
106        }
107    }
108}
109
110// メイン処理を実行
111demonstratePharFileInfoIsExecutable();

PharFileInfo::isExecutableメソッドは、PHPのPharアーカイブに含まれる個々のファイルが実行可能であるかを判定するために使用されます。このメソッドはPharFileInfoクラスに属し、Pharアーカイブから取り出されたファイルの情報オブジェクトに対して呼び出します。

引数はなく、ファイルが実行可能であればtrueを、そうでなければfalseをブール値で返します。実行可能であるかは、通常、基盤となるオペレーティングシステム上でのファイルパーミッション(例えば、Unix系の実行権限)に基づいて判断されます。

提供されたサンプルコードでは、まず一時的なPharアーカイブを作成し、その中に実行可能パーミッションを設定したPHPスクリプトと、通常のテキストファイルという実行可能ではないファイルを追加しています。その後、アーカイブ内の各ファイルについてisExecutableメソッドを呼び出し、そのファイルが実行可能かどうかの結果を出力しています。これにより、実行可能パーミッションが付与されたファイルではtrueが、付与されていないファイルではfalseが返される動作を確認できます。このメソッドは、Pharアーカイブ内のコンテンツを処理する際に、特定のファイルが実行可能であるかをプログラム的にチェックする場合に役立ちます。

このサンプルコードを実行するには、Pharアーカイブ作成のためphp.iniのphar.readonly設定を一時的に0にする必要がありますが、本番環境での変更は推奨されません。PharFileInfo::isExecutableメソッドは、Pharアーカイブ内のファイルのパーミッション情報、例えばchmodで設定する実行権限に基づいて、そのファイルが実行可能かどうかを判断します。一時ファイルやPharアーカイブを作成する場合、実行後に確実に削除する後処理を記述することが重要です。また、try-catch-finally構文を使って、エラーが発生した場合でもリソースを適切に解放し、元の設定に戻すことで、安全にコードを利用できます。

関連コンテンツ

関連IT用語

関連プログラミング言語