5

まず最初に: 私の Phars は実行されます。私は少し遊んでいて、次のシナリオがあります。

  • アプリケーション用の Phar (不規則なものはありません) (application-phar)
  • たとえばライブラリ用の 2 番目の phar。(lib-phar)

lib-phar を application-phar に入れたいと思います。application-phar のみを必要とします。application-phar からのブートストラップ (スタブ) が lib-phar からブートストラップをロードするようにします。

これは私が思いついた最高の紹介リソースです: http://www.slideboom.com/presentations/26182/PHP-5.3-Part-3---Introducing-PHAR

私は次のものを持っています:

lib-phar

$innerPharFile = $this->newFile('lib.phar');
$innerPhar = new Phar((string) $innerPharFile);
$innerPhar->addFromString('index.php', '<?php echo "  inner index loaded"; ?>');
$innerPhar->setStub(file_get_contents('inner_stub.php'));

内部スタブ

<?php
echo "  inner stub loaded\n\n";

// Here is the problem: how do i execute index.php from inner, here?
var_dump(Phar::running (TRUE));

echo "\n";
__HALT_COMPILER();
?>

アプリケーションファー

$pharFile = $this->newFile('application.phar');
$phar = new Phar((string) $pharFile);
$phar->addFile($innerPharFile,'lib.phar');
$phar->addFromString('index.php', '<?php echo "outer index loaded"; ?>');
$phar->setStub(file_get_contents('outer-stub.php'));

外部スタブ

<?php
echo "outer stub loaded\n";

$inner_phar = 'phar://'.__FILE__.'/lib.phar';
require $inner_phar;

require 'phar://'.__FILE__.'/index.php';
__HALT_COMPILER();
?>

主要

php -f 'application.phar'

出力:

outer stub loaded

  inner stub loaded
  string(xx) "phar://full/path/to/application.phar"

outer index loaded

とても長いですが... 内側の index.php を実行するにはどうすればよいですか? 問題は、非常に紛らわしいことをしたいということだと思います:

 require 'phar://phar://full/path/to/application.phar/lib.phar';

これは読み取り可能な形式です: :

 require 'phar://  
            phar://full/path/to/application.phar
          /lib.phar';

私の lib.phar は application.phar にあるためです。だから私はラッパーの周りにラッパーが必要だと思います。したがって、PHAR-Extension はこのために作成されていない可能性があります。ご覧のとおり、2 番目のスタブが呼び出されますが、魔法の__FILE__定数 (およびPhar::running(TRUE|FALSE)ここでは間違って設定されています。

あなたはなにか考えはありますか?または、同様のセットアップを行いましたか?

もちろん、私は代替案を知っています:

  • lib + アプリケーションに 1 つのスタブと 1 つの phar を使用する
  • lib.phar を一時的な場所に解凍し、そこから Phar::load() を使用してそれを要求します。

この入れ子のセットアップについて考えるのが本当に好きです。たぶん、あなたは別の素晴らしいアイデアを思いつきましたか?

よろしくフィリップ

4

2 に答える 2

1

pharを使用するというあなたのアイデアは素晴らしく、ネストもしています。あなたが説明したのと同じ問題があります。

Javaの世界では、jarとwarを使用し、jarはライブラリ用ですが、warはアプリケーション用であり、すべてのjarが含まれ、実行前にWebサーバー上で抽出され、最終的にすべてのjarを含むlibフォルダーになります。

pharはJavaからのjarの後にPHPで登場したので、間違いなく彼らは同様のことを実行しようとする必要があります。

pharの目的は、そのpharを他のアプリケーションで再利用することです。他のpharの一部として使用すると、他のアプリケーションで簡単に評価できなくなります。だから私はphpmavenを使うのが好きです

phpmavenを使用してライブラリプロジェクトをビルドし、Mavenサーバーに公開します。phpmavenを使用して、すべてのライブラリプロジェクトに依存するアプリケーションプロジェクトをビルドします

すべてのライブラリpharを使用してビルドを取得し、プロジェクトとその依存関係をより理解しやすいMavenを使用して説明したように、onestubを使用して単一のpharを作成することもできます。

于 2012-04-17T00:47:37.613 に答える
0

短いバージョンのpharファイルは、他のpharファイル内から開くことはできません。それらは最初にpharの外部の一時ファイルに抽出する必要があります。

関数extractAndLoadPhar(){

$tempFilename =  tempnam( sys_get_temp_dir() , "phar");
//$tempFilename =  "/tmp/phar1.phar";

//echo "tempFilename is $tempFilename\r\n";

$readHandle = fopen("phar://phar2/phar1.phar", "r");
$writeHandle =  fopen($tempFilename, "w");

while (!feof($readHandle)) {
    $result = fread($readHandle, 512);
    fwrite($writeHandle, $result);
}

fclose($readHandle);
fclose($writeHandle);

$result = Phar::loadPhar($tempFilename, "phar1");
//echo "Load result is $result \r\n";

}

参照: pharファイルをpharファイル内に配置する方法は?

于 2012-11-24T12:46:29.137 に答える