Я пытаюсь сделать архив Phar с одной из моих lib. Lib – это всего лишь куча классов, организованных в папки и подпапки. Здесь нет index.php, просто статический класс Config для вызова инициатора автозагрузчика.
Во всяком случае, я создал такой архив:
$phar = new Phar(__DIR__ . '/lis.phar',0,'lib.phar'); $phar->buildFromDirectory(__DIR__ . '/class','/\.php$'); $phar->stopBuffering();
После этого я пытаюсь использовать phar следующим образом:
require('lib.phar'); Config::register(); // Config is in the phar
Но я получаю следующую ошибку:
Предупреждение: include (phar: // D: \ wamp \ www_test \ phar \ lib.phar / index.php) [function.include]: не удалось открыть поток: ошибка phar: «index.php» не является файлом в phar «D: /wamp/www/_test/phar/lib.phar» в D: \ wamp \ www_test \ phar \ lib.phar в строке 9
Как я могу сделать phar-архив без какого-либо файла index.php внутри него? На самом деле мне просто нужен архив, чтобы быть контейнером для моих файлов, нет необходимости автоматически выполнять что-либо.
благодаря
Прежде всего, я думаю, что вам нужно startBuffering()
перед stopBuffering()
. И я могу подумать, что buildFromDirectory
делает это внутри вас. Вам не нужно делать stopBuffering()
для «запечатывания» архива. Его готово «на лету».
Итак, второй: вы можете посмотреть defaultStub (который используется в имплантировании кода) следующим образом:
$phar->setDefaultStub(); var_dump($phar->getStub());
Его маленький бит загадочный, но вы это выясните. Он проверяет поддержку флеш-потока (в 5.3), и если он не извлекает содержимое в файл temp, а затем выполняет постоянный файл Phar::START
который по умолчанию является «index.php». И, конечно же, это Phar::interceptFileFuncs()
и устанавливает путь включения, что делает phar «волшебным». Но ваш вопрос звучит так, будто вам нужен только архив для ваших библиотек. Таким образом, вам лучше использовать класс «PharData». Еще не пробовал, но в документации так говорится.