PHP phar://ストリームラッパーとは?Pharアーカイブの作成と実行方法を解説
はじめに
phar:// ストリームラッパーは、PHP 5.3.0 以降のすべてのバージョンで利用できます。Phar は PHP Archive(PHPアーカイブ) の略で、PHP アプリケーションやライブラリをひとつのファイルにまとめて配布するために使用され、通常の PHP ファイルとして直接実行することも可能です。
phar:// ラッパーは、fopen() による読み書きモードでのファイルオープンやファイル名の変更、opendir() によるディレクトリストリーム操作のほか、ディレクトリの作成・削除といった操作にも対応しています。また、Phar クラスを使えば、ディレクトリ内に配置したアプリケーションのリソース群をひとつの phar アーカイブへ簡単にパッケージ化でき、読み取り時にはこのアーカイブを phar:// ラッパー経由で参照します。
Pharアーカイブの作成方法
まず、php.ini の phar.readonly 設定を 0 に変更しておきます。この設定はデフォルトで有効(1)になっており、アーカイブの作成・更新を行う場合は無効にする必要があります。なお、読み取りだけであれば設定を変更する必要はありません。
次に、アプリケーションのリソースをすべて格納する src フォルダを作成し、その中にエントリポイントとなる index.php ファイルを用意します。
<?php echo "phar application started"; ?>
続いて、Phar クラスのオブジェクトを生成し、buildFromDirectory() メソッドを使って src フォルダ内のファイル一式を含む phar アーカイブを作成します。さらに setDefaultStub() で、すべてのクラスを読み込むメインファイルとして index.php を指定します。
<?php
// php.ini の phar.readonly を 0 に設定しておく必要があります
$pharFile = 'app.phar';
// 既存ファイルのクリーンアップ
if (file_exists($pharFile)) {
unlink($pharFile);
}
if (file_exists($pharFile . '.gz')) {
unlink($pharFile . '.gz');
}
// phar アーカイブの作成
$p = new Phar($pharFile);
// ディレクトリ全体からライブラリを構築
$p->buildFromDirectory('src/');
// エントリポイントとなるメインファイルを指定
$p->setDefaultStub('index.php', '/index.php');
// おまけ:gzip 形式で圧縮
$p->compress(Phar::GZ);
echo "$pharFile successfully created";
?>上記のスクリプトをコマンドラインから実行します。
php create-phar.php
これにより、作業ディレクトリ内に app.phar が生成されます。作成した phar アーカイブを実行するには、次のコマンドを使用します。
php app.phar
phar://ラッパーの使用例
phar:// ラッパーを使うと、アーカイブ内部のファイルに通常のファイルと同じ要領でアクセスできます。以下の例では、app.phar 内の index.php の内容を読み出して表示しています。
<?php
echo file_get_contents('phar://app.phar/index.php');
?>このコードを実行すると、index.php ファイルの中身が出力されます。
セキュリティ上の注意点
phar:// ラッパーは非常に便利である一方、セキュリティ面での留意も欠かせません。phar アーカイブにはシリアライズされたメタデータが含まれており、ユーザー入力経由で phar:// URL にアクセスできる構成の場合、メタデータの自動的なデシリアライズを起点とする攻撃(いわゆる POP チェーン攻撃)が知られています。信頼できない入力値をファイル操作関数に渡さない設計を心がけ、アーカイブの提供元が信頼できる場合にのみ phar:// 経由のアクセスを許可することが推奨されます。
-
【初心者向け】PHPタグとは?基本構文からショートタグまで徹底解説
PHPタグとは?定義と基本的な使い方PHPスクリプトは、拡張子が「.php」のテキストファイルとして作成され、Webサーバー上に保存されます。サーバー上のPHPパーサーは、<?php(開始タグ)と?>(終了タグ)という特殊な文字列を探し出します。この2つのタグは「PHPタグ」と呼ばれ、その間に記述されたステートメントのみがパーサーによって解釈・実行されます。PHPタグで囲まれたコードは、HTMLドキュメントの中に自由に埋め込むことができます。埋め込まれたPHPコードはサーバー側で実行され、その処理結果だけが出力されるため、残りのHTML部分はクライアントのブラウザーにあるHTMLパ
-
PHPのpi()関数とは?使い方と定義済み定数との対応を実例付きで解説
pi()関数の定義と使い方PHPのpi()関数は、数学定数π(円周率)の値を返す関数です。戻り値はfloat型の「3.14159265359」であり、PHPにあらかじめ定義されている定数M_PIとまったく同じ値になります。構文pi ( void ) : floatパラメータこの関数は引数を受け取りません。引数なしでそのまま呼び出すことができます。戻り値pi()関数は数学定数πの値を返し、定義済みの数学定数M_PIと等価です。数式の中では、M_PIの代わりにpi()関数を使うこともできます。対応するPHPバージョンこの関数はPHP 4.x、PHP 5.x、PHP 7.xのすべてのバージョンで利用