php - 在 Heroku 上设置 Yii2 Advanced

标签 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')
);

如果必须使用'../../'来更改目录,那么我认为第一个 require 会出错(对于 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 似乎无法正常运行。我已经搜索了,搜索了,搜索了,我找不到任何关于这个的东西。我不可能是唯一一个尝试将 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 不会在这些服务中的任何一个上运行。有一些东西没有提到,我错过了。

最佳答案

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

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

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

Composer Assets 插件是绝对必需的。联系我们页面需要 GD 扩展名(我假设是验证码)。我还在 web/index.php 中为 YII_DEBUG 定义注释掉了前两行。一旦我这样做了,更新了 composer,更新了 git,并推送了,魔法就发生了 :)

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

至于高级模板.. 前端和后端 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 运行到生产环境中,所以我的文件不存在。

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

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

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

关于php - 在 Heroku 上设置 Yii2 Advanced,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28259504/

相关文章:

ruby-on-rails - 如何修复 heroku 上的 ActionDispatch::Cookies::CookieOverflow 错误?

javascript - yii2 中的 Yii2 Ajax 请求

php - 如何用php制作照片效果,倾斜图像等?

php - 迁移后,时间戳 < 1 上的 MySQL 查询停止工作

php - CakePHP Unfilled 单选按钮在提交时更改为不需要的值

ruby-on-rails - 在 Rails 中解码 Base64 编码的文件需要很长时间

PHP 和 MySQL 访问级别

java - 使用 Heroku eclipse 插件时,源文件夹不是 Java 项目

php - Yii2 覆盖通用扩展/小部件 View

php - 如何在 yii2 中的每个 $model->save() 函数之后运行自定义代码