4

The easy part...

Usually when migrating a ZF1 application from built-in auto-loading to composer based auto-loading (which is strongly recommended for deploying on CloudControls Pinky stack) you just need to take some simple steps:

Create a composer.json file and require Zend Framework (e.g. latest release from version 1.12) with:

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

Install composer dependencies via CLI with:

composer install

Update your .gitignore file and add:

vendor/*

Recursively delete current ZF folder from your library path (e.g. ./library):

rm -r library/Zend

Include composer autoloader in your index.php before any usage of Zend_ classes by adding:

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

Remove every now obsolete ZF related require or require_once statements from your index.php - e.g. this is not needed anymore:

require_once 'Zend/Application.php';

Once you are done with the above changes you commit and push via git as normal and then you deploy the new version on CloudControl via CLI (where APP_NAME and DEP_NAME here refer to your app and deployment names):

cctrlapp APP_NAME/DEP_NAME deploy

You will notice that cctrlapp prints out some information about resolving composer dependencies and finally initiates the deployment of the new version. To check whether it is done you can run:

cctrlapp APP_NAME/DEP_NAME log deploy

Ok, deployment log looks fine – nice – let's open the browser!

What the f***! Internal server error? Why?? Everything worked well with the local LA(M)P stack!!!

4

1 回答 1

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 连接到实际服务器。相反,我们提供了 run 命令,它允许您启动一个新容器并通过 SSH 连接到该容器。

该容器与 web 或 worker 容器相同,但启动 SSH 守护程序而不是 Procfile 命令之一。它基于相同的堆栈映像和部署映像,并且还提供附加凭据。

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

cd code/public
php index.php

嗯......这里没有任何报道......而且......日志上没有任何报道?!我勒个去?!!

因此,Web 容器和运行容器之间似乎存在差异——而且确实存在!为了找出这一点,我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错误!

更准确地说,这是一个影响Pinky当前版本的PHP 5.4.30 / APC 3.1.13的 PECL APC 错误- 请参阅:

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

这正是 run 容器和 web 容器之间的区别,因为 web 容器的php.ini选项apc.stat设置为0(off),而run 容器的选项设置为1(on)。


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 文档:

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


谢谢:

最后,我要感谢来自 CloudControl 的 Dimitris 和 Mateusz 的一般建议——尽管我需要自己找出这里发生的事情。此外,我要感谢 Stack Overflow 的 @BullfrogBlues 和 @Thierry_Marianne,他们试图回答可追溯到去年 11 月的另一个提问者线程,这最终让我寻找与 APC 相关的问题。

于 2014-08-05T04:19:54.720 回答