如何将Zend Framework 1应用程序从CloudControl Luigi成功迁移到Pinky堆栈?

时间:2014-08-05 04:19:55

标签: php zend-framework apc cloudcontrol

简单的部分......

通常在将ZF1应用程序从内置自动加载迁移到基于作曲家的自动加载时(强烈建议在CloudControls Pinky 堆栈上部署),您只需采取一些简单的步骤:

创建一个composer.json文件并要求Zend Framework(例如1.12版的最新版本):

{
    "require" : {
        "zendframework/zendframework1" : "1.12.*"
    }
}

通过CLI安装作曲家依赖关系:

composer install

更新.gitignore文件并添加:

vendor/*

从库路径中递归删除当前的ZF文件夹(例如./library):

rm -r library/Zend

通过添加以下内容,在index.php 任意使用Zend_类之前,将编辑器自动加载器包括在内:

$loader = include 'vendor/autoload.php';

从您的require中删除所有现已过时的与ZF相关的require_onceindex.php语句 - 例如这不再需要了:

require_once 'Zend/Application.php';

完成上述更改后,您可以正常提交并通过git推送,然后通过CLI在CloudControl上部署新版本(其中APP_NAMEDEP_NAME在此处引用您的应用和部署名称):

cctrlapp APP_NAME/DEP_NAME deploy

您会注意到cctrlapp打印出有关解决作曲家依赖关系的一些信息,并最终启动新版本的部署。要检查是否完成,您可以运行:

cctrlapp APP_NAME/DEP_NAME log deploy

好的,部署日志看起来很好 - 很好 - 让我们打开浏览器!

f ***!内部服务器错误?为什么??所有东西都适用于当地的LA(M)P堆栈!!!

1 个答案:

答案 0 :(得分:5)

棘手的部分......

幸运的是,CloudControl还允许我们访问错误日志......

cctrlapp APP_NAME/DEP_NAME log error

不应该太难找出这里的错误。

但......错误......

8/1/14 5:23 AM  error [error] [client ] FastCGI: incomplete headers (0 bytes) received from server "/app/php/box/php-fpm"
8/1/14 5:23 AM  error [error] [client ] (104)Connection reset by peer: FastCGI: comm with server "/app/php/box/php-fpm" aborted: read failed

由于上述错误消息根本没有帮助,我们首先需要追踪这个错误。这确实很棘手!我们可以谷歌一点。我们可以尝试一下。然后我们可以重新部署。我们可以谷歌多一点。我们可以尝试另一件事。然后我们可以再次重新部署。我们可以再次google。我们可以尝试其他所有事情。我们可以...但我们想要吗?

幸运的是, Pinky 堆栈提供了另一种加快速度的方法( Luigi 并非全部)。虽然它仍然包含繁琐的手动调试,但至少我们可以节省一些时间 - 转到CLI并执行:

cctrlapp APP_NAME/DEP_NAME run bash

CloudControl现在为我们实例化一个新容器,并为我们提供基于SSH的shell访问。正如文档所说,一切都应该在我们的部署框中:

  

cloudControl平台的分布式特性意味着它不是   可以SSH到实际的服务器。相反,我们提供运行   命令,允许您启动新容器并连接到该容器   通过SSH。

     

容器与Web或工作容器相同但是启动   SSH守护程序而不是Procfile命令之一。它基于   相同的堆栈映像和部署映像,并提供了   附加凭证。

让我们看看我们是否可以找到更多信息(来自容器内部):

cd code/public
php index.php

嗯...这里没有任何报道......而且......日志上没有任何报道?!怎么了?!!

因此,网络和运行容器之间似乎存在差异 - 而且有! 为了找到这个,我开始立即编辑index.php

vi index.php

过了一会儿,我终于重现了至少另一个错误:

8/1/14 8:55 AM  error [error] [client ] FastCGI: server "/app/php/box/php-fpm" stderr: PHP message: PHP Fatal error:  require_once(): Failed opening required '' (include_path='/srv/www/code/vendor/zendframework/zendframework1/library:/srv/www/code/library:.:/usr/share/php') in /srv/www/code/vendor/zendframework/zendframework1/library/Zend/ ...
8/1/14 8:55 AM  error [error] [client ] FastCGI: server "/app/php/box/php-fpm" stderr: PHP message: PHP Warning: require_once(/srv/www/code/vendor/zendframework/zendframework1/library): failed to open stream: No such file or directory in /srv/www/code/vendor/zendframework/zendframework1/library/Zend/ ...

看起来某些文件丢失了 - 可能与自动加载有关 - 不应该太难修复它。

但等等,那是什么:Failed opening required ''?当然你没有要求你愚蠢的代码!

嗯......在查看相应的ZF库文件时,您不会发现任何错误。包含路径似乎也是正确的 - 是的,文件存在 - 作曲家正确管理两件事。


这是一个PHP错误!

更确切地说,它是PECL APC的一个错误,它影响 Pinky的当前版本的 PHP 5.4.30 / APC 3.1.13 - 见:

https://bugs.php.net/bug.php?id=62398

这正是运行和Web容器之间的区别,因为php.ini选项apc.stat对于Web容器和0设置为1(关闭)(在)用于运行容器。


TL;博士

从GitHub克隆CloudControl Pinky PHP buildpack:

git clone https://github.com/cloudControl/buildpack-php.git

从此存储库中复制所有文件,并将它们添加到项目根文件夹中:

.buildpack/php

修改.buildpack/php/conf/php.ini并设置:

apc.stat = 1

提交,推送,部署和享受!


说明:

请记住,这只是一种解决方法,因为不需要在这样的环境中激活APC stat(在部署时重新创建堆栈)并且它会降低执行速度。请参阅PHP文档:

  

在脚本文件很少更改的生产服务器上,a   禁用统计数据可以显着提升性能。


感谢:

最后,我要感谢CloudControl的Dimitris和Mateusz提供的一般建议 - 尽管我需要自己了解这里发生了什么。此外,我要感谢Stack Overflow的@BullfrogBlues和@Thierry_Marianne,他们试图回答去年11月的另一个提问线程,最终指出我要寻找与APC相关的问题。