通常在将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_once
或index.php
语句 - 例如这不再需要了:
require_once 'Zend/Application.php';
完成上述更改后,您可以正常提交并通过git推送,然后通过CLI在CloudControl上部署新版本(其中APP_NAME
和DEP_NAME
在此处引用您的应用和部署名称):
cctrlapp APP_NAME/DEP_NAME deploy
您会注意到cctrlapp
打印出有关解决作曲家依赖关系的一些信息,并最终启动新版本的部署。要检查是否完成,您可以运行:
cctrlapp APP_NAME/DEP_NAME log deploy
好的,部署日志看起来很好 - 很好 - 让我们打开浏览器!
f ***!内部服务器错误?为什么??所有东西都适用于当地的LA(M)P堆栈!!!
答案 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库文件时,您不会发现任何错误。包含路径似乎也是正确的 - 是的,文件存在 - 作曲家正确管理两件事。
更确切地说,它是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
(关闭)(在)用于运行容器。
从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相关的问题。