在Heroku上设置Yii2 Advanced

时间:2015-02-01 04:33:49

标签: php heroku yii2

我需要一些帮助在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上运行。必须在文档中遗漏某些东西......使用作曲家来安装Yii2 basic,将它放在git下,将其推送到新的heroku堆栈。去看看我的应用程序在heroku上,将/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 个答案:

答案 0 :(得分:11)

经过几个小时的乱七八糟的努力,我想通了。好吧,我还有一个问题需要测试(并再试一次)。但是,我设法在Heroku上运行yii basic和yii高级应用程序。但是仍然在CloundControl上出现错误,但那是另一天。

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

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

绝对需要编辑器资产插件。联系我们页面需要GD扩展(我假设验证码)。我还在web / index.php中注释了YII_DEBUG定义的前两行。一旦我这样做了,更新了作曲家,更新了git,并推动了,魔术发生了:)

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

对于高级模板..前端和后端index.php文件已经具有正确的开发和生产的调试常量。你只需要在服务器上运行php init --env=Production --overwrite=All(我无法让heroku这样做,但是另一天)。 Yii文档让你运行init,然后选择开发。这将从“environment / dev”文件夹中获取所有内容,并在应用中的位置覆盖它们。这在开发时会失败。因此,您必须将其切换到生产环境,从而将生产文件移至使用状态。我理解为什么你会有这些,所以我明白了......就像我说的那样,我尝试heroku run bash,然后从apps目录运行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需要那些包......