PHAR createDefaultStub应该区分CLI和浏览器吗?

时间:2016-03-16 10:16:31

标签: php phar

我的问题是关于$indexfile的{​​{1}}和$webindexfile。我的理解是,如果请求来自cli,则会提供createDefaultStub,并且$indexfile将从浏览器请求中提供。

我从任何一个来源得到相同的回复('后端'),我是否误解了这种行为?或者我的实施是错误的?

谢谢!

目录树:

$webindexfile

/build.php

PHAR
+--app
    +--backend
        +--index.php //prints 'backend'
    +--frontend
        +--index.php //prints 'frontend'
+--build //destination for PHAR
+--build.php
+--index.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"
)

来自PHP手册:

include('phar://./build/app.phar');

1 个答案:

答案 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流包装器,那么如果您使用运行的代码,它就会像预期的那样工作。

试试这个:

  • 将您的phar重命名为.php
  • 使用此index.php:

代码:

stream_wrapper_unregister('phar');
include('./build/app.php');

您将看到它现在按预期工作(但由于您不再使用流包装器中的构建,因此速度较慢)。