如何正确部署PHP应用程序?
如何从开发到生产正确部署应用程序,以及如何处理多个站点配置。 我的所有开发都通过位于var/svn/myapp/trunk的svn完成,并且 实际生产代码位于/var/www/myapp中 我将最新的代码签出到本地机器的一个名为“myapp\u latest\u svn”的目录中。 我在main settings.php中有特定于站点和位置的代码,它的H_PATH=“” &db_主机、db_用户名和db_密码的db配置设置,如您所知,在 本地机器设置(其中localhost/myapp.com只是一个Apache别名)&在生产(live site在myapp.com上运行)服务器上 此外,.htaccess文件与生产服务器上的文件不同。简言之,开发和生产之间存在许多差异 我把所有的工作都保存在SVN中。每天早上我都会使用SVN Update,它会将最新的代码更新到我的本地SVN存储库中。 当我准备上线时,我会使用svn Commit构建一个发布 然后在发行版中,我必须记住将所有适当的dev文件更改为它们的生产对应文件。 现在我必须手动编辑production settings.php和.htaccess以反映特定于站点的更改 我正在寻找一种从开发到生产的自动化方法,包括版本控制和 没有手动编辑文件,这是容易出错和不良做法 一种方法是使文件的生产版本为只读(0444)。这样,当我进行svn导出时, 它们不会被开发版本的文件覆盖,我也不必担心在服务器上编辑文件 从开发到生产的每一步。但这是一种糟糕的方式,比如持续集成 还可以制作settings.php的多个副本(一个用于localhost、beta和prod)。然后使用shell脚本 从svn导出,然后一旦导出完成,它就会用正确的settings.php替换settings.php, 取决于我们部署到的位置。这样一切都是自动化的。 但这也是一条跛脚路 最后一条路是如何正确部署PHP应用程序?,php,svn,shell,scripting,phing,Php,Svn,Shell,Scripting,Phing,如何从开发到生产正确部署应用程序,以及如何处理多个站点配置。 我的所有开发都通过位于var/svn/myapp/trunk的svn完成,并且 实际生产代码位于/var/www/myapp中 我将最新的代码签出到本地机器的一个名为“myapp\u latest\u svn”的目录中。 我在main settings.php中有特定于站点和位置的代码,它的H_PATH=“” &db_主机、db_用户名和db_密码的db配置设置,如您所知,在 本地机器设置(其中localhost/myapp.com只
if( eregi ("myapp.com$", $_SERVER['HTTP_HOST']) ){
define('H_PATH', 'myapp.com');
} else {
define('H_PATH', 'localmyapp.com');
}
就settings.php而言,这很好。
但是对于.htaccess,您不能像上面在.htaccess中那样进行检查
每次我部署我的站点时,我不想做的就是更改设置
我的DB模式不在版本控制中,所以DB不是我的问题,只有settings.php和.htaccess
另外,我如何告诉svn不要更新某些目录,因为这也是特定于站点的(/log、/cache、/assets、/downloads)。
此外,我还需要为上述文件保留完整的apache(www_数据)写访问权限
最后,我不想在导出时将空主干目录和.svn文件复制到生产服务器
在从svn构建到生产服务器时,如何使用Phing甚至shell脚本进行集成而不引起任何这些问题
这对许多想要开发应用程序的开发者来说是非常有用的
提前感谢,
有时我建议您查看部署问题。我用它来部署PHP系统,它将完成您描述的所有工作(在您的部署配方中使用一些脚本)
我在远程repo中不保留任何配置文件-当我在dev中签出时,我可以添加它们一次,然后忽略它们,这样我就不会意外地检查它们。当涉及到部署时,我的cap部署配方被设置为将设置文件写入部署版本。这样,我就不必担心部署和丢失任何关键的东西
Cap还负责所有上传的资产(对目录进行符号链接,以便它们在每次部署时都保持在原位),它还自动将部署到AmazonS3上的所有资产文件和数据库备份。非常漂亮,嗯?我用重命名的文件名,例如settings.php.example和.htaccess.example,将我的设置文件和.haccess存储在SVN中。这样,当我创建一个新版本时,我就不需要担心覆盖内容了 我有一个名为config的Phing任务,它询问我要为哪个环境配置代码。任务接受几个可能的值:本地、开发、暂存、生产等 一旦我告诉它环境,它就会读入相应的.properties文件(即local.properties、production.properties等) 下一步将是关键:存储配置和htaccess文件的模板,然后对它们运行filterChain replaceTokens任务,以便用属性文件中的值替换它们的令牌 创建以下文件: 通用/build/templates/settings.tpl
define('H_PATH','##H_PATH##');
define('ENVIRONMENT', '##ENVIRONMENT##');
build/templates/htaccess.tpl
http://##H_PATH##
build/properties/local.properties
site.H_PATH = localmyapp.com
site.ENVIRONMENT = local
site.H_PATH = myapp.com
site.ENVIRONMENT = production
build/properties/production.properties
site.H_PATH = localmyapp.com
site.ENVIRONMENT = local
site.H_PATH = myapp.com
site.ENVIRONMENT = production
common/build/build.xml
<target name="config">
<input propertyname="env" validargs="local,production">Enter environment name:</input>
<property file="build/properties/${environment}.properties" />
<copy file="build/templates/settings.tpl"
tofile="config/settings.php" overwrite="true">
<filterchain>
<replacetokens begintoken="##" endtoken="##">
<token key="H_PATH" value="${site.H_PATH}" />
<token key="ENVIRONMENT" value="${site.ENVIRONMENT}" />
</replacetokens>
</filterchain>
</copy>
<copy file="build/templates/htaccess.tpl"
tofile="public/.htaccess" overwrite="true">
<filterchain>
<replacetokens begintoken="##" endtoken="##">
<token key="H_PATH" value="${site.H_PATH}" />
</replacetokens>
</filterchain>
</copy>
<echo msg="Configured settings.php and .htaccess for ${environment}" />
</target>
然后键入:
local
然后按回车键。就这样!
这样做的一个巨大好处是,代码中不再需要任何if/else语句。另外,它不依赖于$\u服务器变量,因此在命令行上可以正常工作。您可以考虑Capistrano、Magallanes、Deployer,但它们也是脚本。我可能会建议您尝试一下,这是一个用PHP编写的部署工具,带有现成的yii2。我已经在我们公司主持了几个月,它在部署测试、模拟和生产环境时工作顺利 它支持您配置预部署、后部署和发布后任务,然后您可以更改环境配置,例如
cp db_test.php db.php
它取决于bash工具组、rsync、git、link,但web ui通常适合操作,请尝试:)您能解释一下符号链接资产目录的作用吗?