【问题标题】:Setup Yii2 Advanced on Heroku在 Heroku 上设置 Yii2 Advanced
【发布时间】:2015-03-31 07:44:38
【问题描述】:

我需要一些帮助来在 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 上运行它时,我收到错误消息,抱怨找不到某些文件。奇怪的是,我的 Heroku 应用程序使用 bash 终端,我可以验证该文件是否确实存在! 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')
);

如果它与 '../../' 更改目录有关,那么我认为第一个要求会出错(对于 main.php 条目)。

在 Heroku 上运行 Yii2 高级版我缺少什么?

更新 - 我创建了一个新的 Yii2 基本应用。应该工作并且简单,所以我想。显然,即使是基本应用程序也不能在 Heroku 上运行。文档中必须有一些东西,某处......使用composer安装Yii2 basic,将其放在git下,将其推送到新的heroku堆栈。在heroku上查看我的应用程序,将/web/index.php添加到url的末尾。

ReflectionException
Class yii\debug\Module does not exist

然后我将 index.php 放在包含 phpinfo() 的根目录中。我可以确认我收到了一份 phpinfo 报告。所以 php 正在运行,它报告 PHP 5.6.5。

如果没有一些神奇的(和未记录的)技巧,Yii2 和 Heroku 似乎不能很好地发挥作用。我已经搜索,搜索,搜索,但我找不到任何关于此的信息。我不可能是唯一一个尝试在 Heroku 上安装 Yii 应用的人。

所以我尝试了 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 开箱即用,不会在这些服务上运行。有东西没有提到我错过了。

【问题讨论】:

    标签: php heroku yii2


    【解决方案1】:

    经过几个小时的折腾,我终于弄明白了。好吧,我还有一个问题需要测试(然后再试一次)。然而,我设法让 yii 基本和 yii 高级应用程序都在 Heroku 上运行。虽然在 CloundControl 上仍然出现错误,但那是另一天的事了。

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

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

    composer 资产插件是绝对需要的。联系我们页面需要 GD 扩展名(我假设是验证码)。我还注释掉了 web/index.php 中 YII_DEBUG 定义的前两行。一旦我这样做了,更新了作曲家,更新了 git,然后推送,奇迹发生了 :)

    我认为他们不会告诉您需要编辑 web/index.php 以在 Yii2 文档中删除它们。似乎他们只对让您进行开发感兴趣。是的,索引文件有 cmets,但我们需要知道看看那里!如果你不删除它们,Yii 会加载你的调试工具,这些工具并不存在。我假设当 Heroku 收到推送时,它会从“require”块运行 composer。

    至于高级模板.. 前端和后端 index.php 文件已经具有适用于开发和生产的调试常量。您只需要在服务器上运行php init --env=Production --overwrite=All(我无法让heroku 执行此操作,但改天)。 Yii 文档让你运行 init,然后选择 development。这会从“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 运行到生产环境中,所以我的文件不存在。

    让我使用 Yii Advanced 在 Heroku 上运行的简单修复(包括将提到的 2 个包添加到 composer.json):我删除了所有 gitignore 文件,运行 init 选择生产,更新 git,然后推送到 heroku。它运行:)

    现在我需要弄清楚如何让 init 为我执行此操作,这样我就不必删除 gitignore 文件。

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

    【讨论】:

    • 伙计,你救了我的命。
    • 非常感谢。也拯救了我的一天!
    • 这是在生产服务器上使用 Yii2 调试模块的方法(虽然不推荐):在你的 composer.json 中,将 yiisoft/yii2-debug 包移动到 require。另外,也许你需要移动yiisoft/yii2-gii
    猜你喜欢
    • 1970-01-01
    • 2017-02-16
    • 1970-01-01
    • 2017-06-12
    • 2015-11-10
    • 2015-08-06
    • 2016-06-04
    • 2017-08-19
    相关资源
    最近更新 更多