Symfony 1.4最佳实践生产&开发配置

时间:2011-10-05 12:06:33

标签: git deployment symfony1 doctrine

我刚刚开始使用Symfony。

我正在使用Git / github来管理我的项目。我为log和cache设置了两个忽略,这很好。

我现在需要建立一个生产网站。在这个小项目中,我在同一台服务器上开发和生产,但具有不同的文件位置和数据库。

e.g。

www.example.com/mysymfonyproject_dev/  < development area
&
www.example.com/mysymfonyproject/      < Live / Production site

在服务器上/homes/sites/example.com/www/mysymfonyproject_dev&amp; /home/sites/example.com/www/mysymfonyproject

所以现在我已将我的项目克隆到新的生产文件夹 它当然会忽略日志和缓存文件夹,但现在我需要更改database.yml文件以及更多可能使生产区域正常工作。

处理此问题的最佳方法是什么?
是否有一些我应该添加到.gitignore的其他文件可以说明此网站的版本,例如开发或生产。

OR还有其他方法可以使用git吗?

哪种是最佳做法?

你可以想象我每次操作git push到我的生产网站时都不想更新database.yml文件。

更新:

我有一个开发环境。我正在寻找的是部署到生产的分步指南。我可以使用git来做这件事,但是例如我如何设置环境,以便在部署时所有设置都是正确的。我确实看到database.yml可以有不同的登台和制作设置,但我在哪里告诉symfony什么网站是什么?就像symfony如何知道www.example.com/kickboxing是生产和www.example.com/kickboxing_dev正在进行分段一样?

更新2:

最后,根据我的具体要求,这似乎运作良好。

1 <?php                                                                                                                          
2 
3 
4 require_once(dirname(__FILE__).'/../config/ProjectConfiguration.class.php');
5 
6 $theurl = explode('/', $_SERVER['PHP_SELF']);
7 $mydir = $theurl[1];
8 
9 
10 if ($mydir == "mysymfonyproject")  //live
11 {
12     $configuration = ProjectConfiguration::getApplicationConfiguration('frontend', 'prod', false);
13     sfContext::createInstance($configuration)->dispatch();
14 }
15 else // dev 
16 {
17     $configuration = ProjectConfiguration::getApplicationConfiguration('frontend', 'dev', true);
18     sfContext::createInstance($configuration)->dispatch();
19 }

我认为在您可能配置主机文件的本地计算机上使用$ _SERVER ['SERVER_NAME']会更好,例如mysymfonyproject.local只是添加到索引文件,然后git存储库是ffine,所有文件都是可移植的。

2 个答案:

答案 0 :(得分:6)

由于您更新了问题,我可以向您提供一些相关信息。

如您所知,您在symfony中有一个级联配置系统,它允许您的dev和prod环境使用不同的参数,例如您的数据库连接(以及许多其他内容)。

至于部署,symfony附带了一个利用rsync进行部署的任务。一般来说,你不需要调整它,它默认不会部署任何“dev”前端控制器,因此它适合大多数基本需求。请注意,即使部署脚本应排除dev前端控制器完全部署,e 如果您要部署它们,默认情况下它们只有一个小的安全检查,只允许从localhost访问。如果需要从部署中排除其他文件,可以编辑config / rsync_exclude.txt

此处部署的详细信息: http://www.symfony-project.org/gentle-introduction/1_4/en/16-Application-Management-Tools#chapter_16_deploying_applications

但值得注意的是,此部署脚本不处理数据库部署。你应该手动完成。如果您需要将数据库更改部署到现有数据库,您也可以执行该手册,或查看Doctrine Migrations(假设您使用Doctrine)。

更新:您可以为不同的应用和/或环境设置一个前端控制器(index.php)。您可以检查主机名或其他内容,但我找到并使用的最简洁的解决方案是设置Apache环境变量。在我的Vhost配置中,我会这样做:

<VirtualHost *:80>
  Servername www.myproject.dev
  ...
  SetEnv SYMFONY_APP frontend
  SetEnv SYMFONY_ENV dev
  SetEnv SYMFONY_DEBUG 1
</VirtualHost>

请注意,对于每个app / env组合,我都会有一个单独的Vhost。您不应该部署vhost配置,因此通常您只需要在每台主机上设置一次。我修改后的index.php如下所示:

<?php

require_once dirname(__FILE__) . '/../config/ProjectConfiguration.class.php';

$app = isset($_SERVER['SYMFONY_APP']) ? $_SERVER['SYMFONY_APP'] : 'frontend';
$env = isset($_SERVER['SYMFONY_ENV']) ? $_SERVER['SYMFONY_ENV'] : 'prod';
$debug = isset($_SERVER['SYMFONY_DEBUG']) ? $_SERVER['SYMFONY_DEBUG'] : false;

$configuration = ProjectConfiguration::getApplicationConfiguration($app, $env, $debug);
sfContext::createInstance($configuration)->dispatch();

通过这个设置,我可以从我的存储库中删除frontend_dev.php和除index.php之外的任何其他前端控制器。

答案 1 :(得分:0)

在生产服务器上,最佳做法是:

  • 除了在prod中运行应用程序所需的工具之外,没有任何其他工具
  • 在预生产环境中准备已部署的产品,其访问权限比prod环境更多。

但是在你的情况下,很可能没有预生产环境,并且访问权限不是问题,Git可能有意义。

在这种情况下,我建议通过将实际值保留在VCS存储库之外来处理配置文件

content filter

然后,您可以利用内容过滤器,在结帐时构建actual database.yml values “污迹”脚本(在您的仓库的.gitattributes文件部分中声明)可以检测它在哪个环境中执行,并选择适当的源以获得构建文件的正确值。
有关详细信息,请参阅“Git Config excludesfile for just a branch”。