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

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

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

作成日: 更新日:

基本的な使い方

convertToExecutableメソッドは、PHPのPharアーカイブを、異なる形式の実行可能アーカイブに変換するメソッドです。Pharアーカイブは、PHPアプリケーションを単一ファイルとして扱い、配布・実行を容易にする仕組みです。

このメソッドを使用すると、既存のPharアーカイブを、PHAR、TAR、またはZIPなどの実行可能アーカイブ形式に変換できます。さらに、変換後のアーカイブには、GzipやBzip2といった圧縮形式を適用することも可能です。

変換時には、変換後のフォーマット、圧縮形式、新しいファイルの拡張子を指定します。これにより、アプリケーションの配布先や用途に合わせ、最適なアーカイブ形式を選択できます。

アプリケーションを特定の形式で提供したい場合や、他のツールで扱いやすい形式に変換したい場合に有用です。ただし、この操作には、phar.readonly設定の無効化と、元のPharアーカイブへの書き込み権限が必要です。変換が成功すると、新しいPharオブジェクトが返されます。

構文(syntax)

1Phar::convertToExecutable(?array $format = null, ?int $compression = null, ?string $extension = null): ?Phar

引数(parameters)

?int $format = null, ?int $compression = null, ?string $extension = null

  • ?int $format = null: Pharアーカイブのフォーマットを指定する整数。指定しない場合はデフォルトのフォーマットが使用されます。
  • ?int $compression = null: Pharアーカイブの圧縮形式を指定する整数。指定しない場合は圧縮されません。
  • ?string $extension = null: Pharアーカイブのファイル拡張子を指定する文字列。指定しない場合は'.phar'が使用されます。

戻り値(return)

?Phar

このメソッドは、PharアーカイブをPHPの実行可能ファイル形式に変換した結果をPharオブジェクトとして返します。変換に失敗した場合はnullを返します。

サンプルコード

Pharを圧縮実行可能ファイルへ変換する

1<?php
2
3/**
4 * Phar::convertToExecutable メソッドのサンプルコード
5 *
6 * この関数は、既存のPharアーカイブを別の圧縮形式のPharアーカイブに変換する方法を示します。
7 * PharはPHPアプリケーションを単一の実行可能ファイルとして配布するのに使用されます。
8 */
9function convertPharExample(): void
10{
11    // PHP環境設定の確認: Pharファイルの書き込みを許可するため 'phar.readonly' を '0' に設定する必要があります。
12    // スクリプトの実行前にphp.iniを編集するか、ini_set()で一時的に設定してください。
13    if (ini_get('phar.readonly')) {
14        echo "エラー: 'phar.readonly' が '1' に設定されています。\n";
15        echo "Pharファイルを書き込むには、php.ini で 'phar.readonly = 0' に設定するか、\n";
16        echo "スクリプトの先頭で 'ini_set(\"phar.readonly\", \"0\");' を実行してください。\n";
17        return;
18    }
19
20    $sourcePharFile = 'my_application.phar'; // 元となるPharアーカイブのファイル名
21    $targetGzPharFile = 'my_application_compressed.phar.gz'; // GZIP圧縮された新しいPharアーカイブのファイル名
22
23    // --- 1. テスト用のPharアーカイブを作成 ---
24    echo "1. テスト用のPharアーカイブ '{$sourcePharFile}' を作成中...\n";
25    try {
26        // 既存のファイルをクリーンアップし、新しいアーカイブを作成できるように準備
27        if (file_exists($sourcePharFile)) {
28            unlink($sourcePharFile);
29        }
30        if (file_exists($targetGzPharFile)) {
31            unlink($targetGzPharFile);
32        }
33
34        // 新しいPharアーカイブを初期化
35        $phar = new Phar($sourcePharFile);
36        $phar->startBuffering(); // 書き込み操作をバッファリングして効率化
37
38        // アーカイブにPHPファイルを追加
39        $phar->addFromString('index.php', '<?php echo "Hello from the original Phar!";');
40
41        // Pharの実行時にどのファイルが最初に実行されるかを定義する「スタブ」を設定
42        // これにより、`php my_application.phar` のように実行可能になります。
43        $phar->setStub($phar->createDefaultStub('index.php'));
44
45        $phar->stopBuffering(); // バッファリングを停止し、変更をPharファイルに書き込む
46        echo "   Pharアーカイブ '{$sourcePharFile}' が正常に作成されました。\n";
47
48    } catch (PharException $e) {
49        echo "エラー: Pharアーカイブの作成中に問題が発生しました: " . $e->getMessage() . "\n";
50        // エラーが発生した場合、作成途中のファイルを削除して終了
51        if (file_exists($sourcePharFile)) {
52            unlink($sourcePharFile);
53        }
54        return;
55    }
56
57    // --- 2. 既存のPharアーカイブを新しい圧縮形式のPharに変換 ---
58    echo "\n2. Pharアーカイブ '{$sourcePharFile}' を GZIP圧縮のPhar形式 '{$targetGzPharFile}' に変換中...\n";
59    try {
60        // 変換元のPharアーカイブを読み込み
61        $phar = new Phar($sourcePharFile);
62
63        // convertToExecutable メソッドで、Pharのフォーマットと圧縮方法を変更して新しいPharを作成
64        // 引数:
65        //   1. $format: ターゲットのアーカイブ形式。Phar::PHAR を指定し、Phar形式を維持します。
66        //   2. $compression: ターゲットの圧縮形式。Phar::GZ を指定し、GZIP圧縮を適用します。
67        //   3. $extension: 変換後のファイルに付ける拡張子。null を指定すると自動で適切な拡張子が付与されます。
68        //      今回は明示的に '.gz' を指定しても良いですが、Phar::GZを指定していれば自動的に付与されます。
69        $convertedPhar = $phar->convertToExecutable(Phar::PHAR, Phar::GZ, '.gz');
70
71        if ($convertedPhar instanceof Phar) {
72            echo "   Pharアーカイブが GZIP圧縮のPhar形式 '{$targetGzPharFile}' に正常に変換されました。\n";
73            echo "   この新しいPharファイルを実行するには、コマンドラインで 'php {$targetGzPharFile}' と実行してください。\n";
74        } else {
75            echo "   Pharアーカイブの変換に失敗しました。\n";
76        }
77
78    } catch (PharException $e) {
79        echo "エラー: Pharアーカイブの変換中に問題が発生しました: " . $e->getMessage() . "\n";
80    }
81
82    // --- 3. クリーンアップ ---
83    echo "\n3. 作成されたテストファイルをクリーンアップ中...\n";
84    foreach ([$sourcePharFile, $targetGzPharFile] as $file) {
85        if (file_exists($file)) {
86            unlink($file); // テストで作成したファイルを削除
87            echo "   '{$file}' を削除しました。\n";
88        }
89    }
90    echo "   クリーンアップ完了。\n";
91}
92
93// 関数を実行してサンプルコードを動作させる
94convertPharExample();

PHPのPhar::convertToExecutableメソッドは、既存のPhar(PHPアーカイブ)ファイルを別の形式や圧縮方法を持つPharファイルに変換するための機能を提供します。Pharは、複数のPHPファイルや関連リソースを単一の実行可能ファイルとしてまとめ、配布や実行を簡単にするための仕組みです。

このメソッドの第一引数では変換後のアーカイブ形式を(例: Phar::PHAR)、第二引数では新しいPharファイルに適用する圧縮方法を(例: Phar::GZでGZIP圧縮)、第三引数では変換後のファイルに付ける拡張子を指定します。変換に成功すると新しいPharオブジェクトが返され、失敗した場合はnullが返されます。

サンプルコードでは、まずphar.readonlyというPHP設定がPharファイルの書き込みを許可しているかを確認し、必要であれば書き込み可能な状態にします。次に、簡単なPHPコードを含むmy_application.pharというテスト用のPharアーカイブを作成し、このアーカイブが直接実行できるようにスタブを設定します。そして、この作成したmy_application.pharをconvertToExecutableメソッドを用いてGZIP圧縮されたmy_application_compressed.phar.gzに変換しています。これにより、PHPアプリケーションを元の形式を保ちつつ、異なる圧縮形式で配布できる新しいPharファイルを効率的に作成することが可能になります。最後に、テストで作成したファイルを削除してクリーンアップしています。

このサンプルコードを実行するには、PHP設定のphar.readonlyを0に設定する必要があります。これはphp.iniを編集するか、スクリプト内でini_set()関数を使用して一時的に行います。Phar::convertToExecutableメソッドは、既存のPharアーカイブを異なる圧縮形式やアーカイブフォーマットに変換する際に利用されます。第一引数で変換後のアーカイブ形式(例: Phar::PHAR)、第二引数で圧縮形式(例: Phar::GZ)を定数で指定してください。Pharファイルが直接実行可能となるよう、setStub()メソッドで実行開始ファイルを定義することも重要です。変換が成功すると新しいPharオブジェクトが返されますので、戻り値を確認して次の処理に進んでください。ファイルの書き込み権限も必要です。

PharをLinux実行可能形式に変換する

1<?php
2
3// このスクリプトは、Pharアーカイブを作成し、
4// それを別の実行可能なPhar形式(ここではGzip圧縮されたもの)に変換する方法を示します。
5//
6// 注意: Pharアーカイブを作成・変更するには、php.iniで `phar.readonly = 0` が設定されている必要があります。
7// 開発環境で一時的に設定を変更する場合は、以下のようにini_setを使用できますが、
8// 運用環境ではphp.iniファイルを直接編集することを推奨します。
9// ini_set('phar.readonly', '0');
10
11/**
12 * PHPアプリケーションをPharアーカイブとして作成し、
13 * さらに別の実行可能なPhar形式に変換する関数。
14 *
15 * @param string $sourcePharName 元のPharアーカイブのファイル名
16 * @param string $targetPharName 変換後のPharアーカイブのファイル名
17 * @param int $format 変換後のPharのファイルフォーマット (例: Phar::PHAR, Phar::TAR, Phar::ZIP)
18 * @param int $compression 変換後のPharの圧縮方式 (例: Phar::NONE, Phar::GZ, Phar::BZ2)
19 * @param string $extension 変換後のPharのファイル拡張子
20 * @return bool 変換が成功した場合はtrue、失敗した場合はfalse
21 */
22function createAndConvertPhar(
23    string $sourcePharName,
24    string $targetPharName,
25    int $format,
26    int $compression,
27    string $extension
28): bool {
29    // 既存のPharファイルをクリーンアップ(テスト実行用)
30    if (file_exists($sourcePharName)) {
31        unlink($sourcePharName);
32    }
33    if (file_exists($targetPharName)) {
34        unlink($targetPharName);
35    }
36
37    try {
38        // 1. まず、元のPharアーカイブを作成します。
39        // 第2引数 0 はPhar::UNKNOWNを意味し、第3引数はアーカイブのエイリアスです。
40        $phar = new Phar($sourcePharName, 0, basename($sourcePharName));
41
42        // 2. Pharアーカイブにアプリケーションのファイルを追加します。
43        // ここでは簡単なPHPスクリプトを `index.php` として追加します。
44        $phar->addFromString('index.php', <<<'PHP_CODE'
45<?php
46// このコードはPharアーカイブが実行されたときに実行されます
47echo "Hello from a PHP Phar application!\n";
48echo "This is running as a Linux executable.\n";
49if (isset($argv[1])) {
50    echo "Received argument: " . $argv[1] . "\n";
51}
52?>
53PHP_CODE
54        );
55
56        // 3. PharをLinux環境で直接実行可能にするためのスタブ(shebang)を設定します。
57        // `#!/usr/bin/env php` は、システムがPHPインタープリタを見つけてPharを実行するように指示します。
58        // `createDefaultStub` は、`index.php` をエントリポイントとして設定するデフォルトのスタブを生成します。
59        $phar->setStub(
60            '#!/usr/bin/env php' . "\n" .
61            $phar->createDefaultStub('index.php')
62        );
63
64        echo "元のPharアーカイブ '{$sourcePharName}' を作成しました。\n";
65
66        // 4. Phar::convertToExecutable メソッドを使用して、Pharを別の実行可能な形式に変換します。
67        // キーワード「convert exe to linux executable」に合わせ、
68        // 既存のPharをGzip圧縮されたPhar形式に変換し、新しいファイルとして保存する例を示します。
69        // - 第1引数 `$format`: 変換後のPharも標準のPhar形式であることを意味します。
70        // - 第2引数 `$compression`: Gzip圧縮を適用することを意味します。
71        // - 第3引数 `$extension`: 変換後のファイルに付ける拡張子です(例: '.phar.gz')。
72        $convertedPhar = $phar->convertToExecutable($format, $compression, $extension);
73
74        if ($convertedPhar instanceof Phar) {
75            echo "Pharアーカイブ '{$sourcePharName}' をGzip圧縮された '{$targetPharName}' に変換しました。\n";
76
77            // 変換後のPharファイルをLinux環境で直接実行可能にするために、パーミッションを設定します。
78            // `0755` は所有者に読み書き実行権限、グループとその他に読み書き実行権限を与えることを意味します。
79            chmod($targetPharName, 0755);
80            echo "ファイル '{$targetPharName}' に実行権限を設定しました。\n";
81
82            // convertToExecutableは成功すると元のPharファイルを削除します。
83            // なので、ここでは元のファイルを明示的に削除する必要はありません。
84            echo "これで '{$targetPharName}' はLinux環境で直接実行可能な、圧縮されたPharファイルとして利用できます。\n";
85            return true;
86        } else {
87            echo "Pharの変換に失敗しました。\n";
88            return false;
89        }
90
91    } catch (PharException $e) {
92        echo "Pharエラー: " . $e->getMessage() . "\n";
93        return false;
94    } catch (Exception $e) {
95        echo "一般エラー: " . $e->getMessage() . "\n";
96        return false;
97    } finally {
98        // 必要であれば、クリーンアップ処理をここに追加できます。
99        // 例: if (file_exists($sourcePharName)) { unlink($sourcePharName); }
100    }
101}
102
103// サンプルコードの実行部分
104$source = 'my_app.phar';
105$target = 'my_app_compressed.phar.gz';
106
107// Phar::PHAR: 標準のPhar形式
108// Phar::GZ: Gzip圧縮
109// '.phar.gz': 変換後のファイルの拡張子
110if (createAndConvertPhar($source, $target, Phar::PHAR, Phar::GZ, '.phar.gz')) {
111    echo "\n--- 変換されたPharを実行するには --- \n";
112    echo "1. Linuxターミナルでこのスクリプトと同じディレクトリに移動します。\n";
113    echo "2. `./{$target}` と入力して実行してみてください。\n";
114    echo "   例: `./{$target} some_argument`\n";
115}
116?>

PHP 8のPhar::convertToExecutableメソッドは、既存のPharアーカイブを別の実行可能なPhar形式に変換するために使用されます。これにより、PHPアプリケーションを、異なる圧縮方式やファイル形式を持つ独立した実行ファイルとして配布できるようになります。特に、キーワードにあるように、Linux環境で直接実行可能な形式に変換する際にも役立ちます。

このメソッドは3つの引数を取ります。第1引数 $format は変換後のPharのファイルフォーマット(例: Phar::PHAR、Phar::TAR、Phar::ZIP)を指定し、第2引数 $compression は変換後の圧縮方式(例: Phar::NONE、Phar::GZ、Phar::BZ2)を設定します。第3引数 $extension は、変換後のファイルに付与する拡張子を指定します。成功すると新しいPharオブジェクトが返されますが、失敗した場合はnullが返されることがあります。このメソッドは、変換が完了すると元のPharファイルを自動的に削除します。

提供されたサンプルコードでは、まずPHPスクリプトを含むPharアーカイブを作成し、#!/usr/bin/env phpというスタブを設定することで、Linux環境でPHPインタープリタによって直接実行可能にします。その後、convertToExecutableメソッドを使って、この元のPharをGzipで圧縮された標準Phar形式(拡張子.phar.gz)に変換しています。変換後のファイルには、Linux上で実行可能にするためのパーミッション(chmod 0755)が付与されます。Pharアーカイブの作成や変更には、php.iniでphar.readonly = 0の設定が必要です。

PHPでPharアーカイブを作成・変換するには、まずphp.iniのphar.readonly設定を0にする必要があります。開発時以外は直接php.iniを編集してください。convertToExecutableメソッドは、変換に成功すると元のPharファイルを削除しますので、必要な場合はバックアップが必要です。Linux環境で直接実行可能にするには、chmodコマンドで0755などの実行権限を付与することが必須です。また、ファイル冒頭に#!/usr/bin/env phpのようなスタブを設定することで、PHPインタープリタで実行されるようになります。変換後のPharのファイル形式、圧縮方式、拡張子を正しく指定することが重要です。エラーハンドリングも忘れずに行いましょう。

関連コンテンツ

関連IT用語

関連プログラミング言語