Можно ли положить фар в фар? - PullRequest
5 голосов
/ 03 ноября 2011

обо всем по порядку: мои фарс бегут.Я немного поиграюсь, и у меня есть следующий сценарий:

  • Phar для приложения (ничего необычного с ним) (application-phar)
  • второй phar,например для библиотеки.(lib-phar)

Я бы хотел поместить lib-phar в application-phar.и требуют только приложение-фар.Так что начальный загрузчик (заглушка) из application-phar загружает начальный загрузчик из lib-phar.

Это лучший вводный ресурс, который я придумал: http://www.slideboom.com/presentations/26182/PHP-5.3-Part-3---Introducing-PHAR

Iиметь следующее:

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

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

внешняя заглушка

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

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

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

main

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 находится в приложении IN.фармацевтическийПоэтому я думаю, что мне понадобится обертка вокруг обертки.Так что, возможно, расширение PHAR не сделано для этого.Как мы видим, вторая заглушка называется, но магическая __FILE__ константа (а также Phar::running(TRUE|FALSE) установлена ​​здесь неправильно.

У вас есть какие-нибудь идеи? Или сделали подобную настройку?

Конечно, я знаю альтернативы:

  • использовать одну заглушку и один phar для приложения lib +
  • распаковать lib.phar во временное место и потребовать его оттуда с Phar:: load ()

Мне действительно нравится думать об этой установке вложенности. Может быть, у вас есть другая отличная идея?

С наилучшими пожеланиями Филипп

Ответы [ 2 ]

1 голос
/ 17 апреля 2012

Ваша идея использования phar выглядит великолепно и вкладывает его тоже.в то время как я вижу ту же проблему, объясненную вами.

В мире Java они используют jar и war, jar - для библиотек, а war - для приложений, которые содержат все jar-файлы и извлекают их на веб-сервере перед выполнением., заканчивая тем, что в папке lib есть все jar-файлы.

phar появился в PHP после jar из Java, поэтому определенно следует попытаться выполнить нечто подобное.

Цель phar состоит в том, чтобыповторно использовать этот phar в каком-либо другом приложении, делая его частью другого phar, и его будет нелегко определить для других приложений.Поэтому я предпочитаю использовать phpmaven

Используйте phpmaven и создайте проект библиотеки и опубликуйте ее на сервере maven.Используйте phpmaven и постройте свой проект приложения с зависимостью от всех ваших библиотечных проектов

вы получите сборку со всеми библиотечными фарами, вы даже можете сделать из нее один phar с помощью onestub, как вы объяснили, используя maven, которыйпроще понять проект и его зависимости.

0 голосов
/ 24 ноября 2012

Короткая версия, файлы 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?

...