ホームページ  >  記事  >  バックエンド開発  >  PHP による phar ファイルの操作方法

PHP による phar ファイルの操作方法

php中世界最好的语言
php中世界最好的语言オリジナル
2018-04-11 09:47:403822ブラウズ

今回は、PHPでpharファイルを操作する方法と、PHPでpharファイルを操作する際の注意点を紹介します。実際の事例を見てみましょう。

この記事では、PHP 開発におけるアーカイブ形式の pha ファイルの概念と使用法について説明します。参考のために皆さんと共有してください。詳細は次のとおりです:

PHP アプリケーションは複数のファイルで構成されることが多く、それらを 1 つのファイルにまとめて配布して実行できると非常に便利です。たとえば、Windows オペレーティング システムのインストール プログラムや jquery ライブラリなどです。など、これを実現するために、PHP は phar ドキュメント ファイル形式を使用します。この概念は Java の jar から派生したものですが、主に のために設計されています。 PHP の Web 環境では、JAR アーカイブとは異なり、Phar アーカイブは ネイティブに処理されるため、作成または使用するために追加のツールは必要ありません。PHP スクリプトを使用して作成または抽出するだけです。 pharはPHPと アーカイブ構成とは、php アーカイブ ファイルを意味することがわかります。

phar の公式 Web サイトのドキュメントについては、http://php.net/manual/zh/book.phar.php を参照してください。このドキュメントは、公式 Web サイトのドキュメントを補完するものと見なされます

Phar アーカイブ ファイルには、tar アーカイブ、zip アーカイブ、および phar アーカイブの 3 つの形式があります。最初の 2 つのタイプの実行では、Phar が Phar 拡張機能サポートをインストールする必要がありますが、ここでは主に phar アーカイブ形式について説明します。

phar 形式のアーカイブ ファイルは、Phar 拡張機能に依存して直接実行でき、自分で作成した php スクリプトによって生成されます。

Phar 拡張機能は PHP にとって新しい概念ではなく、PHP5.3 で PHP に組み込まれました。元々は PHP で作成され、名前が付けられました。 その後、2005 年に PHP_Archive が PEAR ライブラリに追加されました。この問題に対する純粋な PHP ソリューションは実際には非常に遅いため、2007 SPL オブジェクトトラバーサル Phar を使用して ArrayAccess を追加しながら、純粋な C 言語拡張機能として書き直された年 アーカイブのサポート。それ以来、Phar アーカイブのパフォーマンスを向上させるために多くの作業が行われてきました。

Phar 拡張機能は PHP ストリーム ラッパーに依存します。これについては、PHP ストリームとラッパー ラッパーの概念と使用例の詳細な説明については、前の記事を参照してください。 多くの PHP アプリケーションは phar 形式で配布され、実行されます。有名なものには、依存関係管理: コンポーザー、

単体テスト

: phpunit の作成、実行、抽出、復元の方法を見てみましょう。

pharファイルの作成:

まず、php.ini の phar.readonly オプションを変更し、先行するセミコロンを削除し、値を off に変更します。php.ini で無効になっている場合、このオプションはデフォルトで on になります (値は 0 または off)。 ) を使用すると、php.ini でオンまたはオフにできます。そのため、ここでは例を示すためにオフに設定します。

プロジェクトを作成しましょう。 サーバーのルートディレクトリにプロジェクトフォルダーを作成します。 ディレクトリ内の構造は次のとおりです。 ファイルフォルダーには、中身が空の 2 つの js ファイルと css ファイルがあります。これは、phar に複数のファイル形式を含めることができることを示しているだけです

。 lib_a.php の内容は次のとおりです:

file
  -yunek.js
  -yunke.css
lib
  -lib_a.php
template
  -msg.html
index.php
Lib.php

msg.htmlの内容は以下の通りです:

<?php
/**
 * Created by yunke.
 * User: yunke
 * Date: 2017/2/10
 * Time: 9:23
 */
function show(){
  echo "l am show()";
}

Index.phpの内容は以下の通りです:

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>phar</title>
</head>
<body>
<?=$str; ?>
</body>
</html>

Lib.phpの内容は以下の通りです:

<?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";

プロジェクトファイルの作成が完了しました。 プロジェクトフォルダーと同じディレクトリに yunkeBuild.php を作成し、内容は次のとおりです。 次に、ブラウザでこの yunkeBuild.php ファイルにアクセスすると、yunke.phar ファイルが生成されます。このとき、サーバーのルート

ディレクトリ構造

は次のようになります。 これは、phar アーカイブ ファイルを生成する最も簡単なプロセスです。詳細については、公式 Web サイトを参照してください。プロジェクトに単一の実行エントリがない場合、phar アーカイブ ファイルの使用は適切ではないことに注意してください。

phar アーカイブ ファイルの使用法:

上記で作成した phar ファイルの使用方法を示すために、サーバーのルート ディレクトリにindex.php ファイルを作成します。内容は次のとおりです。 Index.php ファイルに最初の行しかない場合は、アーカイブ ファイルを使用しない場合とまったく同じように次のコードを追加します。

require "project/index.php";

如果没有第二行,那么第三行的yunke()将提示未定义,所以可见require一个phar文件时并不是导入了里面所有的文件,而只是导入了入口执行文件而已,但在实际项目中往往在这个入口文件里导入其他需要使用的文件,在本例中入口执行文件为project/index.php

phar文件的提取还原:

我们有时候会好奇phar里面包含的文件源码,这个时候就需要将phar文件还原,如果只是看一看的话可以使用一些ide工具,比如phpstorm 10就能直接打开它,如果需要修改那么就需要提取操作了,为了演示,我们下载一个composer.phar放在服务器目录,在根目录建立一个get.php文件,内容如下:

<?php
/**
 * Created by yunke.
 * User: yunke
 * Date: 2017/2/9
 * Time: 19:02
 */
$phar = new Phar(&#39;composer.phar&#39;);
$phar->extractTo('composer'); //提取一份原项目文件
$phar->convertToData(Phar::ZIP); //另外再提取一份,和上行二选一即可

用浏览器访问这个文件,即可提取出来,以上列子展示了两种提取方式:第二行将建立一个composer目录,并将提取出来的内容放入,第三行将产生一个composer.zip文件,解压即可得到提取还原的项目文件。

补充:

1、在部署phar文件到生产服务器时需要调整服务器的配置,避免当访问时浏览器直接下载phar文件

2、可以为归档设置别名,别名保存在归档文件中永久保存,它可以用一个简短的名字引用归档,而不管归档文件在文件系统中存储在那里,设置别名:

$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://的方式包含归档中某一个文件时不会执行存根代码, 往往在存根文件里面require包含要运行的其他文件,对存根文件的限制仅为以HALT_COMPILER();结束,默认的存根设计是为在没有phar扩展时能够运行,它提取phar文件内容到一个临时目录再执行,不过从php5.3开始该扩展默认内置启用了

4、制作的phar文件不能被改动,因此配置文件之类的文件需要另外放置在归档文件外面

5、mapPhar函数:这个函数只应该在stub存根代码中调用,在没有设置归档别名的时候可以用来设置别名,打开一个引用映射到phar流

相信看了本文案例你已经掌握了方法,更多精彩请关注php中文网其它相关文章!

推荐阅读:

如何用swoole与websocket开发一个聊天室

在PHP中怎样实现微信退款功能

以上がPHP による phar ファイルの操作方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。