Web应用程序部署最佳实践:如何管理本地和直播文件?

时间:2009-02-15 18:31:03

标签: php version-control deployment ftp web-deployment-project

我正在编写php web应用程序,只需通过FTP部署它们。 为了使它工作,我经常做一些调整/调试,因为我无法控制托管我的(免费)Web服务器,所以在我的本地环境中工作的东西可能无法正常工作。

例如,我保留一个单独的php文件,其中包含class_db_myapp.php,该文件扩展了一个带有特定数据库参数的class_db.php:db name,username,password,它们在本地和实时不同。 (有关信息:最近我开始使用git进行版本控制)

随着我的应用程序的发展,一些文件被重命名/删除/创建。 什么时候上传新版本,我必须依靠我的记忆来知道我要上传/删除的内容,或者只是删除所有/全部上传。但在第二种情况下,我需要避免删除class_db_myapp.php文件......

我还没有找到适当的解决办法。

此域名中的最佳做法是什么?

我可能错过了有关此主题的现有讨论,如果是,请指出我。

谢谢。

7 个答案:

答案 0 :(得分:6)

如果ftp服务器支持符号链接,您可以使用以下技术:

  1. 使public_html文件夹成为包含当前版本的文件夹的符号链接。 (例如“version1”)
  2. 将新版本上传到新文件夹中。
  3. 上传完成后,修改符号链接以使新版本变为活动状态。
  4. 如果出现问题,您可以通过再次修改符号链接轻松恢复到以前的版本。

    对于实时环境中不同的数据库和其他设置,有几个选项:

    • 创建一个包含环境的文件:“live”或“local”,并根据环境设置在代码中添加“if语句”。
    • 如果您能够在php中检测环境,请使用该环境而不是文件。
    • 将所有设置放在“versionX”文件夹之外的文件中。

答案 1 :(得分:2)

1)为了解决“开发和实时服务器上的不同配置”问题,我使用:

// Change 'localhost' to your dev server's address
define('IS_LIVE', 'localhost' != $_SERVER['HTTP_HOST']);

// Database configuration
$db_cfg = IS_LIVE?
  array(...): // Live server config
  array(...); // Dev server config

2)为了保持dev和live文件同步,我使用了Beyond Compare,这是一个可视化差异工具,可以让我通过(S)FTP比较整个目录,包括远程目录。

我设置了一个配置文件,左侧窗口显示dev服务器上的文件,右侧显示实时服务器上的文件。通过这种方式,我可以看到服务器之间存在的差异(更改,丢失或添加的文件),并允许我轻松地复制它们之间的文件中的整个目录,文件或特定行。非常有用。

它还允许您“忽略”您不想同步的特定目录,例如具有用户生成的文件或日志的目录。

答案 2 :(得分:2)

移动文件

您正在寻找rsync或类似rsync的内容。 Rsync是一个程序/系统,可以让您将一组文件与另一组文件同步。在过度简化的术语中,它可以查看您的源代码和您的生产代码,并且只会上传不同的文件。

rsync -av --cvs-exclude /soure/dir user@example.com:./source/dir    

--cvs-exclude标志的名称有点误导。它将使rsync忽略rcs程序cvs忽略的文件,而不是只是 .cvs目录。您可以通过运行

获取有关标志的更多信息
rsync --help

您托管应用程序的服务器需要运行一个rsync守护程序,但这些日子的目标是相同的。

如果您想变得非常聪明,可以使用SSH密钥配置rsync,甚至不需要输入密码。但是,这绝不是必要的。

不同的配置信息

将本地和实时服务器之间不同的配置信息分隔为单个文件或单个文件集。您可以通过FTP将这些文件传输到实时服务器,并使用--exclude选项告诉rsync忽略这些文件。

答案 3 :(得分:1)

不确定它是否理想,但是例如在我的数据库登录配置中我检测到运行代码的主机(下面只是部分剪辑):

$active_group = "default";
if($_SERVER['SERVER_NAME'] == 'argent.local' || 
   $_SERVER['SERVER_NAME'] == 'beta.website.com') 
   $active_group = "development";

$db['default']['hostname'] = "localhost";
$db['default']['username'] = "username";
$db['default']['password'] = "password";
$db['default']['database'] = "dbname";
$db['default']['dbdriver'] = "mysql";

$db['development']['hostname'] = "localhost";
$db['development']['username'] = "username_dev";
$db['development']['password'] = "password_dev";
$db['development']['database'] = "dbname_dev";
$db['development']['dbdriver'] = "mysql";

(argent.local在这里是我的本地开发盒)我也在其他一些地方这样做,就像在主类中我启用/禁用PHP错误输出,具体取决于服务器是生产还是本地开发(因为错误输出是在dev期间非常有用,但我从不想要在生产中输出):

if($_SERVER['SERVER_NAME'] == 'argent.local' || 
   $_SERVER['SERVER_NAME'] == 'beta.website.com') 
    error_reporting(E_ALL);
    else error_reporting(0);

这样,我检查到SVN的代码将在live和dev框中工作,而不必跟踪在哪里部署。通过这种方式,我可以擦除所有现有文件,只需重新部署新文件,而无需担心移动任何文件。

答案 4 :(得分:1)

因为您没有ssh访问权限,所以在本地计算机上测试并提交所有内容。那么您可以使用ftp客户端filezilla的目录比较功能,它可以让您查看已修改的文件。你不需要记住任何东西。

最佳做法是使用git push推送到您的服务器。但由于您的选择有限,上述解决方案会做得很好。

答案 5 :(得分:1)

phingant等构建工具应该可以执行您要执行的操作。使用一点脚本,您应该能够自动执行当前用于获取应用程序配置的步骤并使用单个命令上载应用程序。

答案 6 :(得分:0)

我推荐Capistrano,它是Rails世界的一个通用部署工具。它基本上是从头开始设计的,用于管理部署。这是Capistrano主页:

http://capify.org/

这里有几个网站展示了其他人如何使用Capistrano进行PHP部署:

http://www.simplisticcomplexity.com/2006/08/16/automated-php-deployment-with-capistrano/

http://donc.wordpress.com/2006/10/29/deploying-php-with-capistrano/

注意:您必须编写/自定义部署脚本,但Capistrano应该允许您执行所需的操作。

相关问题