9

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

例如,我保留了一个单独的 php 文件,其中包含 class_db_myapp.php,该文件扩展了带有特定 DB 参数的 class_db.php:db 名称、用户名、密码,它们不会是相同的本地和实时的。(有关信息:最近我开始使用 git 进行版本控制)

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

我还没有想出一个合适的解决方案。

该领域的最佳实践是什么?

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

谢谢你。

4

7 回答 7

6

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

  1. 使 public_html 文件夹成为包含当前版本的文件夹的符号链接。(例如“版本 1”)
  2. 将新版本上传到新文件夹中。
  3. 上传完成后,修改符号链接以激活新版本。

如果出现问题,您可以通过再次修改符号链接轻松恢复到以前的版本。

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

  • 创建一个包含环境的文件:“live”或“local”,并根据环境设置将“if语句”放入代码中。
  • 如果您能够在 php 中检测环境,请使用它而不是文件。
  • 将所有设置放在“versionX”文件夹之外的文件中。
于 2009-02-15T18:59:47.923 回答
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) 为了使开发文件和实时文件保持同步,我使用Beyond Compare,这是一个可视化差异工具,可让我比较整个目录,包括通过 (S)FTP 进行的远程目录。

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

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

于 2009-02-15T19:11:26.710 回答
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 忽略这些文件。

于 2009-02-15T22:19:31.313 回答
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 box 上运行,而无需跟踪将哪个部署在哪里。这样我就可以擦除所有现有文件并重新部署,而不必担心移动任何文件。

于 2009-02-15T19:11:11.063 回答
1

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

最佳实践是使用git push. 但由于您的选择有限,上述解决方案就可以了。

于 2009-02-15T19:39:44.020 回答
1

诸如phingant之类的构建工具应该能够完成您想做的事情。通过一些脚本,您应该能够自动执行当前执行的步骤,以获取应用程序配置并使用单个命令上传应用程序。

于 2009-12-24T18:10:01.703 回答
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 应该让您做您需要的。

于 2009-02-18T05:29:23.570 回答