Webアプリケーションを配布する方法としての自己実行phar

おそらく誰もが既に知っているように、PHP 5.3は.phar拡張子を持つ特別な種類のアーカイブのサポートを導入しました。 知らない人は、すばらしい記事.phar-実行可能なPHPアーカイブを読むことができます。

すぐに思い浮かぶのは、プラグイン* .pharアーカイブの形式のライブラリ/フレームワークと、CMSなどのWebアプリケーションのインストーラーです。 後者について、より詳細に、例とともに説明します。



問題の声明



目標は、1つのファイルの出力を取得することです。このファイルはそれ自体で実行可能であり、必要なすべてのファイルが含まれます。 従来のアプリケーションから類推すると、これはSFX(自己解凍アーカイブ)にパッケージ化されたアプリケーションです。



必要条件



この記事の例はPHP 5.4用に書かれています(ただし、5.3用に簡単に修正できます)。また、PEARライブラリArchive_Tarは、ネイティブ* .tarアーカイブの作成にも使用されます。



たとえば、最も単純な構造を考えてみましょう。

     build.php
     index.php
     install.php
     readme.txt


当然、install.phpファイルはインストール段階でのみ必要で、build.phpはビルド段階でのみ必要です。 readme.txtファイルは、ビルド段階で作成されます。



タールを作成する



まず、必要なファイルをtarで収集します。これにより、* .phar形式の制限(たとえば、ファイル名に含まれるキリル文字のアルファベットの不許可)を回避できます。 このためにPharまたはPharDataを使用する場合は、パック時にファイルの名前を有効なビューに変更し、アンパック時に元のビューに戻す必要があります。



tarアーカイブを作成します。

// PEAR  require_once 'Archive/Tar.php'; //  $tar = new Archive_Tar(__DIR__.'/system.phar.tar');
      
      





ファイル拡張子は.phar.tarで指定されているため、phpはそれを使用できます。

アーカイブにファイルを追加します。

 //   $tar->createModify( [ 'index.php', 'install.php' ], null, __DIR__ ); //   ,        ,     . // readme.txt,         $tar->addString( 'readme.txt', "This is demo project\nBuilt ".date('dm-Y').' at '.date('H:i') );
      
      







tarをpharに変える



結果のアーカイブからいわゆるtarベースのpharを作成します。

 //   $phar = new Phar(__DIR__.'/system.phar.tar'); //  bz2 ,   .phar $phar->convertToExecutable(Phar::TAR, Phar::BZ2, '.phar');
      
      







アーカイブ自体を実行可能にする



これを行うには、Webサーバーがファイルに直接アクセスしようとしたときに開くファイルを指定する必要があります。 デフォルトでは、これはindex.phpですが、インストール済みなので、install.phpを開く必要があります

 //   $phar = new Phar(__DIR__.'/system.phar'); //     $phar->setStub("<?php Phar::webPhar(null, 'install.php'); __HALT_COMPILER();"); // rename(__DIR__.'/system.phar', __DIR__.'/system.phar.php');
      
      





奇妙な.phar.php形式は非常に重要な役割を果たします。 .php拡張子は、ファイルをPHPインタープリターに強制的に転送し、.pharは、これがソースコードを含むファイルではなく、アーカイブであることを明確にします。 実際、アーカイブはディレクトリになります。たとえば、ブラウザのアドレスバーに/system.phar.php/index.phpと入力できます。これは機能します。



設置



インストールするinstall.phpリスト

 //   ,   ,    $root = substr(pathinfo(__DIR__, PATHINFO_DIRNAME), 7); //   2      (new Phar($root.'/'.pathinfo(__DIR__, PATHINFO_BASENAME)))->extractTo( $root, [ 'index.php', 'readme.txt' ] ); //  ( ) unlink($root.'/'.pathinfo(__DIR__, PATHINFO_BASENAME));
      
      





そして、キッチン全体が考案されたヒーロー-index.php

 echo 'I was inside the phar archive';
      
      





この情報が一部の人々にとって有用であり、zip / rar / tar / gz / bz2アーカイブの形式ではなく、作成されたネイティブpharで提供される製品がますます増えることを願っています。



ソースファイル system.phar.php



All Articles