Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/279.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何正确部署PHP应用程序?_Php_Svn_Shell_Scripting_Phing - Fatal编程技术网

如何正确部署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只

如何从开发到生产正确部署应用程序,以及如何处理多个站点配置。 我的所有开发都通过位于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, 取决于我们部署到的位置。这样一切都是自动化的。 但这也是一条跛脚路

最后一条路是

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通常适合操作,请尝试:)

您能解释一下符号链接资产目录的作用吗?