5 Stimmen

Ist es möglich, einen Phar in einen Phar zu stecken?

Das Wichtigste zuerst: Meine Phars laufen. Ich spiele ein wenig herum und habe das folgende Szenario:

  • ein Phar für die Bewerbung (nichts Unregelmäßiges dabei) (application-phar)
  • einen zweiten Phar, zum Beispiel für eine Bibliothek. (lib-phar)

Ich möchte die lib-phar in die application-phar einbinden. und nur die application-phar benötigen. So dass die Bootstrap (Stub) aus der Anwendung-Phar lädt die Bootstrap aus der Lib-Phar.

Dies ist die beste einführende Ressource, die mir eingefallen ist: http://www.slideboom.com/presentations/26182/PHP-5.3-Part-3---Introducing-PHAR

Ich habe die folgenden:

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'));

Innenstutzen

<?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();
?>

anwendung-phar

$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'));

Außenstutzen

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

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

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

Haupt

php -f 'application.phar'

Ausgänge:

outer stub loaded

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

outer index loaded

So lange, so gut, aber... Wie führe ich die innere index.php aus? Ich denke, das Problem ist, dass ich etwas sehr verwirrend dome möchte:

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

die in lesbarer Form vorliegt: :

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

denn meine lib.phar ist IN application.phar. Ich denke also, dass ich einen Wrapper um den Wrapper herum brauchen würde. Vielleicht ist die PHAR-Erweiterung also nicht dafür gemacht. Wie wir sehen, wird der zweite Stub aufgerufen, aber die magische __FILE__ konstant (ebenso wie Phar::running(TRUE|FALSE) ist hier falsch eingestellt.

Haben Sie eine Idee? Oder einen ähnlichen Aufbau gemacht?

Natürlich kenne ich die Alternativen:

  • ein Stub und ein Phar für Lib + Anwendung verwenden
  • Dekomprimieren Sie die lib.phar an einen temporären Ort und fordern Sie sie von dort mit Phar::load() an.

Ich denke wirklich gerne über diese Verschachtelung nach. Vielleicht haben Sie eine andere tolle Idee?

Mit freundlichen Grüßen Philipp

1voto

sujaisd Punkte 183

Ihre Idee, phar zu verwenden, sieht großartig aus und verschachtelt es auch, während ich das gleiche Problem sehe, das Sie erklärt haben.

In der Java-Welt werden jar und war verwendet, wobei jar für die Bibliotheken und war für die Anwendung steht, die alle jars enthält und vor der Ausführung auf dem Webserver extrahiert wird, so dass am Ende ein lib-Ordner mit allen jars entsteht.

phar kam in PHP nach dem jar von Java auf, also sollten sie definitiv versuchen, etwas Ähnliches zu verfolgen.

Der Zweck von phar ist es, dieses phar in einer anderen Anwendung wiederzuverwenden. Wenn man es zu einem Teil eines anderen phar macht, ist es für andere Anwendungen nicht mehr so leicht verwertbar. Ich bevorzuge daher die Verwendung von phpmaven

Verwenden Sie phpmaven und erstellen Sie ein Bibliotheksprojekt und veröffentlichen Sie es auf einem Maven-Server. Verwenden Sie phpmaven und erstellen Sie Ihr Anwendungsprojekt mit Abhängigkeiten zu allen Ihren Bibliotheksprojekten

Sie erhalten den Build mit allen Bibliotheks-Phars, Sie können sogar ein einzelnes Phar daraus machen, mit onestub, wie Sie erklärt haben, indem Sie Maven verwenden, was einfacher ist, das Projekt und seine Abhängigkeiten zu verstehen.

0voto

Danack Punkte 23901

Kurzversion: phar-Dateien können nicht aus anderen phar-Dateien heraus geöffnet werden. Sie müssen zunächst in eine temporäre Datei außerhalb der phar-Datei extrahiert werden:

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

}

Siehe auch: Wie platziert man eine Phar-Datei innerhalb einer Phar-Datei?

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X