我的问题是关于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上有其他行为而不是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');
您将看到它现在按预期工作(但由于您不再使用流包装器中的构建,因此速度较慢).
标签:php,phar 来源: https://codeday.me/bug/20190628/1312311.html
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。