con*_*uxe 4 php zend-framework apc cloudcontrol
通常,在将ZF1应用程序从内置自动加载迁移到基于作曲家的自动加载时(强烈建议在CloudControls Pinky堆栈上进行部署),您只需执行一些简单的步骤:
创建一个composer.json文件并要求Zend Framework(例如1.12版的最新版本):
{
"require" : {
"zendframework/zendframework1" : "1.12.*"
}
}
Run Code Online (Sandbox Code Playgroud)
通过CLI安装composer依赖项:
composer install
Run Code Online (Sandbox Code Playgroud)
更新.gitignore文件并添加:
vendor/*
Run Code Online (Sandbox Code Playgroud)
从库路径中递归删除当前的ZF文件夹(例如./library):
rm -r library/Zend
Run Code Online (Sandbox Code Playgroud)
通过添加以下内容,index.php 在任何Zend_类使用之前包括作曲家自动加载器:
$loader = include 'vendor/autoload.php';
Run Code Online (Sandbox Code Playgroud)
删除您现在已经过时的所有ZF相关require或require_once声明index.php- 例如,这不再需要了:
require_once 'Zend/Application.php';
Run Code Online (Sandbox Code Playgroud)
完成上述更改后,您可以正常提交并通过git推送,然后通过CLI在CloudControl上部署新版本(此处APP_NAME和DEP_NAME此处引用您的应用和部署名称):
cctrlapp APP_NAME/DEP_NAME deploy
Run Code Online (Sandbox Code Playgroud)
您会注意到cctrlapp打印出有关解决作曲家依赖关系的一些信息,并最终启动新版本的部署.要检查是否已完成,您可以运行:
cctrlapp APP_NAME/DEP_NAME log deploy
Run Code Online (Sandbox Code Playgroud)
好的,部署日志看起来很好 - 很好 - 让我们打开浏览器吧!
什么f***!内部服务器错误?为什么??一切都很好地与当地的LA(M)P堆栈!
幸运的是,CloudControl还允许我们访问错误日志......
cctrlapp APP_NAME/DEP_NAME log error
Run Code Online (Sandbox Code Playgroud)
不应该太难找出这里有什么问题.
但是......错了......
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
Run Code Online (Sandbox Code Playgroud)
由于上述错误消息根本没有帮助,我们首先需要追踪这个错误.这确实很棘手!我们可以谷歌一点.我们可以尝试一下.然后我们可以重新部署.我们可以谷歌多一点.我们可以尝试另一件事.然后我们可以再次重新部署.我们可以再次google.我们可以尝试其他所有事情.我们可以...但我们想要吗?
幸运的是,Pinky堆栈提供了另一种加快速度的方法(Luigi并不是全部).虽然它仍然包含繁琐的手动调试,但至少我们可以节省一些时间 - 转到CLI并执行:
cctrlapp APP_NAME/DEP_NAME run bash
Run Code Online (Sandbox Code Playgroud)
CloudControl现在为我们实例化一个新容器,并为我们提供基于SSH的shell访问.正如文档所说,一切都应该在我们的部署框中:
cloudControl平台的分布式特性意味着无法通过SSH连接到实际的服务器.相反,我们提供run命令,允许您启动新容器并通过SSH连接到该容器.
容器与Web容器或工作容器相同,但启动SSH守护程序而不是其中一个Procfile命令.它基于相同的堆栈映像和部署映像,并且还提供了附加凭据.
让我们看看我们是否可以找到更多(从容器内部):
cd code/public
php index.php
Run Code Online (Sandbox Code Playgroud)
嗯......这里没有报道......而且......日志上没有任何报道?!我勒个去?!!
所以,网络和运行容器之间似乎存在差异 - 而且有!为了找到这个,我开始编辑index.php:
vi index.php
Run Code Online (Sandbox Code Playgroud)
过了一会儿我终于重现了至少另一个错误:
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/ ...
Run Code Online (Sandbox Code Playgroud)
看起来有些文件丢失 - 可能与自动加载有关 - 不应该太难修复它.
但等等,那是什么: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设置为0(关闭)Web容器和1(打开)运行容器.
从GitHub克隆CloudControl Pinky PHP buildpack:
git clone https://github.com/cloudControl/buildpack-php.git
Run Code Online (Sandbox Code Playgroud)
从此存储库复制所有文件,并将它们添加到项目根文件夹中:
.buildpack/php
Run Code Online (Sandbox Code Playgroud)
编辑.buildpack/php/conf/php.ini和设置:
apc.stat = 1
Run Code Online (Sandbox Code Playgroud)
提交,推送,部署和享受!
请记住,这只是一种解决方法,因为APC stat不需要在这样的环境中激活(在部署时重新创建堆栈)并且它会降低执行速度.请参阅PHP文档:
在脚本文件很少更改的生产服务器上,禁用统计信息可以显着提高性能.
最后,我要感谢CloudControl的Dimitris和Mateusz提供的一般建议 - 尽管我需要自己了解这里发生了什么.此外,我要感谢Stack Overflow的@BullfrogBlues和@Thierry_Marianne,他们试图回答去年11月的另一个提问线程,最终指出我要寻找与APC相关的问题.
| 归档时间: |
|
| 查看次数: |
527 次 |
| 最近记录: |