PHP で開発された phar ファイルの概念と使い方を紹介します。PHP アプリケーションは複数のファイルで構成されていることがよくありますが、それらを 1 つのファイルにまとめて配布できれば非常に便利です。ただし、JAR アーカイブとは異なり、Phar アーカイブは PHP 自体で処理できるため、作成または使用するために追加のツールを使用する必要はありません。PHP スクリプトを使用して作成または抽出できます。 pharはPHPとArchiveからなる合成語で、PHPのアーカイブファイルを意味することがわかります。
Phar アーカイブ ファイルには、tar アーカイブ、zip アーカイブ、および phar アーカイブの 3 つの形式があります。最初の 2 種類の実行では、Phar が Phar 拡張機能のサポートをインストールする必要がありますが、ここでは主に phar アーカイブ形式について説明します。
phar 形式のアーカイブ ファイルは、Phar 拡張機能に依存して直接実行でき、自分で作成した php スクリプトによって生成されます。
Phar 拡張機能は PHP にとって新しい概念ではなく、php5.3 で php に組み込まれており、元々は PHP で書かれて PHP_Archive という名前で、2005 年に PEAR ライブラリに追加されました。この問題に対する純粋な PHP ソリューションは実際には非常に遅かったため、2007 年に純粋な C 言語拡張機能として書き直され、同時に SPL オブジェクト トラバーサル Phar アーカイブを使用した ArrayAccess のサポートが追加されました。それ以来、Phar アーカイブのパフォーマンスを向上させるために多くの作業が行われてきました。
Phar 拡張子は php ストリーム ラッパーに依存します。これについては、前の記事「PHP ストリーム、ラッパー ラッパーの概念と使用例」を参照してください。
多くの php アプリケーションは、phar 形式で配布され、依存関係を持っています。 Composer、単体テスト: phpunit を作成、実行、抽出、復元する方法を見てみましょう。
phar ファイルの作成:
まず、php.ini の phar.readonly オプションを変更し、その前のセミコロンを削除し、セキュリティ上の理由により、このオプションが php にある場合はデフォルトでオンになります。 .ini が無効(値が 0 またはオフ)の場合、ユーザー スクリプトでオンまたはオフにすることができます。php.ini でオンになっている場合、ユーザー スクリプトはオフにできないため、 に設定されます。ここで例を示します。
プロジェクトを作成しましょう。プロジェクトとしてサーバーのルートディレクトリにプロジェクトフォルダーを作成します。ディレクトリ内の構造は次のとおりです。
file -yunek.js -yunke.css lib -lib_a.php template -msg.html index.php Lib.php
<?php /** * Created by yunke. * User: yunke * Date: 2017/2/10 * Time: 9:23 */ function show(){ echo "l am show()"; }
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>phar</title> </head> <body> <?=$str; ?> </body> </html>
<?php /** * Created by yunke. * User: yunke * Date: 2017/2/10 * Time: 9:17 */ require "lib/lib_a.php"; show(); $str = isset($_GET["str"]) ? $_GET["str"] : "hello world"; include "template/msg.html";
<?php /** * Created by yunke. * User: yunke * Date: 2017/2/10 * Time: 9:20 */ function yunke() { echo "l am yunke()"; }
<?php /** * Created by yunke. * User: yunke * Date: 2017/2/10 * Time: 9:36 */ //产生一个yunke.phar文件 $phar = new Phar('yunke.phar', 0, 'yunke.phar'); // 添加project里面的所有文件到yunke.phar归档文件 $phar->buildFromDirectory(dirname(FILE) . '/project'); //设置执行时的入口文件,第一个用于命令行,第二个用于浏览器访问,这里都设置为index.php $phar->setDefaultStub('index.php', 'index.php');
project yunkeBuild.php yunke.phar
<?php /** * Created by yunke. * User: yunke * Date: 2017/2/8 * Time: 9:33 */ require "yunke.phar"; require "phar://yunke.phar/Lib.php"; yunke();
インデックスに最初の行しかない場合.php ファイルを開き、アーカイブ ファイルを使用しない場合とまったく同じ次のコードを追加します。
require "project/index.php";
2 行目がない場合、3 行目の yunke() は未定義であることを示すプロンプトを表示します。 phar ファイルが必要な場合、そのファイル内のすべてのファイルがインポートされるわけではなく、エントリ実行ファイルのみがインポートされることがわかります。ただし、実際のプロジェクトでは、使用する必要がある他のファイルがこのエントリ ファイルにインポートされることがよくあります。この場合、エントリの実行ファイルは project/index.php です
<?php /** * Created by yunke. * User: yunke * Date: 2017/2/9 * Time: 19:02 */ $phar = new Phar('composer.phar'); $phar->extractTo('composer'); //提取一份原项目文件 $phar->convertToData(Phar::ZIP); //另外再提取一份,和上行二选一即可
追加:
1. phar ファイルを実稼働サーバーにデプロイする場合、アクセス時にブラウザーが phar ファイルを直接ダウンロードしないようにサーバー構成を調整する必要があります。エイリアスはアーカイブ ファイルに永続的に保存され、アーカイブがファイル システムのどこに保存されているかに関係なく、短い名前でアーカイブを参照できます。
$phar = new Phar('lib/yunke.phar', 0); $phar->setAlias ( "yun.phar");
<?php require "lib/yunke.phar"; require "phar://yun.phar/Lib.php"; //使用别名访问归档文件 require "phar://lib/yunke.phar/Lib.php"; //当然仍然可以使用这样的方式去引用
phar ファイルを作成するときにエイリアスを指定しない場合は、Phar::mapPhar('yunke.phar'); を使用してスタブ ファイルにエイリアスを指定することもできます
3. アーカイブ ファイル内にスタブ ファイルがあります。これは実際には PHP 実行コードの一部であり、アーカイブ ファイルを直接実行するときに設定できます。つまり、アーカイブ ファイルをスクリプトに含めるときに実行されます。通常の PHP ファイルと同じようにインクルードして実行しますが、phar:// を直接使用します。アーカイブ内のファイルがインクルードされている場合、スタブ コードは実行されません。多くの場合、スタブ ファイルには他のファイルを実行する必要があります。スタブ ファイルは HALT_COMPILER(); で終わるだけです。デフォルトのスタブ設計は、phar 拡張子が使用されている場合に実行できます。phar ファイルの内容を一時ディレクトリに抽出して実行します。ただし、php5.3 からは、拡張機能が組み込まれており、デフォルトで有効になります
4. 生成された phar ファイルは変更できないため、設定ファイルなどのファイルは、アーカイブ ファイルの外に配置される必要があります
5. mapPhar 関数: この関数は、アーカイブ エイリアスが設定されていない場合にのみ、エイリアスを設定し、phar ストリームにマップされた参照を開くために使用できます
これらの事例を読んだ後は、その方法を習得したことになります。さらに興味深い情報については、PHP 中国語 Web サイトの他の関連記事に注目してください。
関連書籍:
大規模な Web サイトのトラフィックと高い同時実行性の問題を PHP がどのように解決するか
JavaScript データ型と git 使用法コードの詳細な説明
以上がPHP開発にアーカイブ形式pharを使用する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。