gpt4 book ai didi

php - PHAR createDefaultStub 是否应该区分 CLI 和浏览器?

转载 作者:可可西里 更新时间:2023-10-31 23:17:34 24 4
gpt4 key购买 nike

我的问题是关于 createDefaultStub$indexfile$webindexfile。我的理解是,如果请求来自 cli,$indexfile 将被提供,而 $webindexfile 将被浏览器请求提供。

我从任一来源得到相同的响应(“后端”),我是否误解了这种行为?还是我的实现有误?

谢谢!

目录树:

PHAR
+--app
+--backend
+--index.php //prints 'backend'
+--frontend
+--index.php //prints 'frontend'
+--build //destination for PHAR
+--build.php
+--index.php

/build.php

$phar = new Phar("build/app.phar", 0, "app.phar");
$phar->buildFromDirectory("./app");
$phar->setStub(
$phar->createDefaultStub(
"backend/index.php", "frontend/index.php"
)

);

/index.php

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

来自 PHP 手册:

createDefaultStub ([ string $indexfile [, string $webindexfile ]] )

最佳答案

我的原帖:您是否已尝试直接从浏览器运行您的 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 上具有与网络浏览器不同的其他行为。

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

您会看到它现在按预期工作(但速度较慢,因为您不再使用内置流包装器)。

关于php - PHAR createDefaultStub 是否应该区分 CLI 和浏览器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36032695/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com