在Heroku上设置Yii2高级版

10

我需要一些帮助在Heroku上设置Yii2高级应用程序。我已经使用Composer本地安装了Yii,并且按照它们的指南完全进行了操作:http://www.yiiframework.com/doc-2.0/guide-tutorial-advanced-app.html

我的网站在本地工作正常,具有前端和后端:

http://localhost/yii2app/frontend/web/
http://localhost/yii2app/backend/web/

当我在Heroku上运行时,出现了一些文件找不到的错误。很奇怪的是,通过bash终端访问我的Heroku应用程序,我可以验证该文件确实存在!难道Heroku不喜欢'../../'来更改目录吗?

PHP Fatal error:  require(): Failed opening required '/app/frontend/web/../../common/config/main-local.php'  
include_path='.:/app/.heroku/php/lib/php') in /app/frontend/web/index.php on line 12

在 'frontend/web/index.php' 中是 Yii 框架的默认代码(第 12 行是 main-local.php):

$config = yii\helpers\ArrayHelper::merge(
require(__DIR__ . '/../../common/config/main.php'),
require(__DIR__ . '/../../common/config/main-local.php'),
require(__DIR__ . '/../config/main.php'),
require(__DIR__ . '/../config/main-local.php')
);
如果问题与'../../'更改目录有关,则我认为第一个require语句将出现错误(针对main.php入口)。 我错过了什么,以使Yii2高级版在Heroku上运行? 更新 - 我创建了一个新的Yii2基本应用程序。 应该可以工作并且很简单,所以我认为。 显然,即使是基本应用程序也无法在Heroku上运行。 文档中肯定有遗漏之处... 使用composer安装Yii2 basic,将其放入git下,将其推送到新的heroku堆栈。 转到Heroku上检查我的应用程序,在URL末尾添加/web/index.php。
ReflectionException
Class yii\debug\Module does not exist

我将index.php放在根目录,并包含phpinfo(),确认获得了phpinfo报告。因此,php正在运行,并显示PHP 5.6.5。

看起来Yii2和Heroku需要一些神奇(并且未记录的)技巧才能良好地协同工作。我已经搜索了很久,但找不到任何相关信息。我不可能是唯一一个试图将Yii应用程序部署到Heroku上的人。

于是我尝试使用CloudControl。我将原始的Yii2基本应用程序部署到CloudControl上,同样在根目录的index.php上获取了phpinfo报告。但是当导航到/web/index.php时出现错误:

Invalid Parameter – yii\base\InvalidParamException
The file or directory to be published does not exist: /srv/www/code/vendor/bower/jquery/dist

怎么回事!我在本地可以正常运行,但是当我将它推送到基于云的主机(Heroku或CloudControl)时,它会失败!我以为yiibasic应用程序至少能让它运行PoC,但是Yii从头开始,在这些服务中都无法运行。有一些未提及的东西我可能漏掉了。

1个回答

11

经过数小时的摸索,我终于解决了问题。虽然我还有一个问题需要测试(并再次尝试),但是我成功地将yii基本版和yii高级版应用程序都运行在Heroku上。CloudControl上仍然出现错误,但这是另一天的事情。

我的composer.json文件中缺少2个条目。如果这些条目在生产中是必需的,我不知道为什么它们没有包含在Yii文档中。这是我的require block(我不需要编辑require-dev部分,只需require):

"fxp/composer-asset-plugin": "*",
"ext-gd": "*"

需要 composer 资源插件,联系我们页面(验证码)需要 GD 扩展。在 web/index.php 中注释掉前两行 YII_DEBUG 定义。更新 composer、git 并推送即可。

Yii2 文档中好像没有告诉你需要编辑 web/index.php 去除这些定义。似乎他们只关心开发环境。虽然索引文件有注释,但我们需要知道要去哪里找!如果不删除它们,Yii 将加载不存在的调试工具。我猜当 Heroku 接收到 push 后,会从“require”块运行 composer。

至于高级模板.. Frontend 和 Backend 的 index.php 文件已经正确设置了用于开发和生产的调试常量。只需在服务器上运行 php init --env=Production --overwrite=All 即可(我无法让 Heroku 这样做,但另一天可能可以)。Yii 文档让你运行 init,然后选择开发环境。这将把“environments/dev”文件夹中的所有内容覆盖到应用程序的各个位置。这在开发环境下会失败。因此,您必须将其切换到生产模式,以使用生产文件。我理解为什么会这样,所以我明白...我尝试过 heroku run bash,然后从应用程序目录运行 php init --env=Production --overwrite=All,但似乎没有切换。因此,我的应用程序缺少 frontend/web/index.php 文件等等。

我想知道为什么 'frontend/web/index.php' 甚至不在目录中,但进一步检查后发现许多目录都有 gitignore 文件。因此,当你“git push heroku master”时,'frontend/web/index.php' 以及其他内容因为被忽略而没有被推送。所以因为我无法让 Heroku 运行 Yii 的 init 进入生产模式,我的文件就不在那里了。

要在 Heroku 上运行 Yii Advanced(包括将 2 个提到的包添加到 composer.json),只需删除所有 gitignore 文件,运行 init 选择生产环境,更新 git 并推送即可。问题解决了 :)

现在我需要弄清楚如何让 init 自动执行这个过程,这样我就不必删除 gitignore 文件了。

至于这个问题,已经解决了。Heroku 可以运行 Yii2 基本和高级版。我看到的最大问题是 Yii 文档缺少运行生产所需的必要 composer 包。因此,我想知道是否只是 Heroku 需要这些包...


2
老兄,你刚刚救了我的一天。 - Prostakov
非常感谢。也帮我解决了问题! - Nedim
以下是如何在生产服务器上使用Yii2 Debug模块(虽然不建议这样做):在您的composer.json中,将yiisoft/yii2-debug包移动到require中。此外,您可能还需要移动yiisoft/yii2-gii - Nedim

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接