我的问题是关于$indexfile
的{{1}}和$webindexfile
。我的理解是,如果请求来自cli,则会提供createDefaultStub
,并且$indexfile
将从浏览器请求中提供。
我从任何一个来源得到相同的回复('后端'),我是否误解了这种行为?或者我的实施是错误的?
谢谢!
$webindexfile
PHAR
+--app
+--backend
+--index.php //prints 'backend'
+--frontend
+--index.php //prints 'frontend'
+--build //destination for PHAR
+--build.php
+--index.php
);
$phar = new Phar("build/app.phar", 0, "app.phar");
$phar->buildFromDirectory("./app");
$phar->setStub(
$phar->createDefaultStub(
"backend/index.php", "frontend/index.php"
)
include('phar://./build/app.phar');
答案 0 :(得分:3)
我的原帖: 您是否已尝试直接从浏览器运行您的phar文件? (如果您的网络服务器无法将您的.phar文件识别为php文件,则可以暂时将其重命名为.php。)
你会发现它会起作用。如果您的网址为http://localhost/phar/build/app.phar
,则会自动重定向到http://localhost/phar/build/app.phar/frontend/index.php
。从cli,显然没有重定向,它将自动使用backend / index.php文件(这是你的phar文件中的默认值)。
此重定向行为不会从您自己的index.php发生。 (这就是你在前端看到backend / index.php文件的原因,这是默认的)你必须自己构建重定向部分。
如果你自己构建它,你可以像这样引用你的后端/前端文件:
include('phar://./build/app.phar/frontend/index.php');
请注意,如果您将phar文件包含在另一个文件中,那么php将其视为库phar文件,而不是完整的应用程序phar文件[1]。我认为他们没有考虑到你可能希望你的库在cli上有其他行为而不是webbrowser。
[1] http://php.net/manual/en/phar.using.intro.php(第一段)
编辑:
更多调查表明您可能发现了一个错误。在php中有两种运行phar的方法。一个是使用流包装器phar(就像你正在做的那样),并且正在使用运行的phar文件中的代码,以防你没有使用phar流包装器。
如果您没有使用phar流包装器,那么如果您使用运行的代码,它就会像预期的那样工作。
试试这个:
代码:
stream_wrapper_unregister('phar');
include('./build/app.php');
您将看到它现在按预期工作(但由于您不再使用流包装器中的构建,因此速度较慢)。