【问题标题】:Pushing PHP from Development to Production将 PHP 从开发推向生产
【发布时间】:2012-10-17 21:01:36
【问题描述】:

我已经开发 PHP 页面几个星期了,并且对我的代码越来越有信心。我已经通过 Bluehost 获得了一个托管帐户,并准备开始制作一些实时页面。以前我一直在 Windows 上使用 XAMPP,并在本地计算机上开发我的所有页面。我正在尝试确定在本地创建我的页面然后轻松将其移动到我的托管服务器的最佳实践。我使用 Filezilla 传输文件。以下是我的主要问题:

1.) 如何确保本地和实时 MySQL 数据库保持同步?我一直在本地手动创建数据库,然后采用相同的代码并将其应用于我的实时服务器。 (我在本地和实时服务器上都有 phpmyadmin,但不知道如何使用它来简化此过程)

2.) 在将所有文件从本地服务器移动到实时服务器之前,我必须更改所有文件的 mysql 密码和连接凭据。有没有解决的办法?

【问题讨论】:

    标签: php mysql xampp filezilla bluehost


    【解决方案1】:

    对于问题 1,您可以在每次上传时转储数据库并在生产端导入它,或者您可以使用 mysql 复制。

    对于问题 2,将数据库连接详细信息放在单独的 php 文件中,然后在需要连接到数据库的每个页面的顶部 include 该文件是很常见的

    然后您可以只更改那个文件,或者只上传包含生产数据库详细信息的文件。

    db.php

    <?php
    $dbuser="";
    $dbpass="";
    $dbname="";
    $dbserver="";
    ?>
    

    我的文件.php

    <?php
    include("db.php");
    $conn = mysql_connect($dbserver, $dbuser, $dbpass);
    mysql_select_db($dbname);
    //....
    ?>
    

    【讨论】:

    • 如果您在开发中转储数据库并导入到生产中,您将丢失所有生产数据。我不认为你会想要它。我永远不会用生产数据库复制开发数据库。原因很明显。
    • 是的,这是有道理的。但是“可能”存在开发数据是真实数据的情况。一个罕见的场景肯定,但不完全在幻想领域。
    • 不要上传db.php。还将服务器上的db.php 设为只读,这样如果您错误地上传文件,它就不会被覆盖。
    【解决方案2】:

    您可以将 mysql_connect() 主机指向新服务器的 IP 地址。因此,无论您的代码在哪里,它都会连接到套接字。

    $link = mysql_connect('<your ip here>', 'mysql_user', 'mysql_password');
    

    【讨论】:

      【解决方案3】:

      我总是制作我的项目,因此我必须更改 1 行代码才能在开发和生产之间波动。

      我有一个基本文件,我在其中指定我的环境,如下所示:

      $env = 'dev'
      

      然后在我的数据库设置变量中我有这样的东西:

      if($env == 'dev') {
          specify dev variables
      } else if($env == 'prod') {
          specify prod variables
      }
      

      这样做的好处是,当我想在 dev 和 prod 之间移动时,我只需要更改 1 个变量。

      【讨论】:

      • 常量是另一种选择。
      • 我喜欢这种方法。感谢分享
      • 这比比较主机名和其他选项更有效。我希望将此文件包含在我的全局文件(例如 config.php)中,我在所有脚本文件的头部调用并更改将 var 转换为常量,以便在类和函数中全局访问。
      【解决方案4】:

      使用版本控制系统,例如 svn 或 git;查看用于数据库管理的 phpmig,查看 capistrano 等部署工具,确保在生产服务器的副本上进行测试(即使您只是使用虚拟主机)

      【讨论】:

      • capistrano 不只适用于轨道吗?
      • @Catfish - capistrano 是用 Ruby 编写的,但它的使用不仅限于 Ruby 应用程序......我将它用于 PHP 应用程序没有任何困难,因为它不在乎代码是什么语言它从 VCS 复制或拉取是用编写的
      【解决方案5】:

      我的情况和你差不多,这就是我的计划。

      1. 我不打算将本地数据库与实时数据库同步,而是在完成后将本地数据库一次移动到在线数据库。我这样做的方法是,在 PHPMyAdmin 中选择我想要的数据库并将其导出为 .sql 文件。然后在在线服务器上,我只需导入该文件。

      2. 我知道的最好的方法是有一个单独的文件,其中有一个看起来像这样的函数:

        function connectToDB(){ $mysqli = new mysqli("localhost", "root", "123", "myDatabase"); return $mysqli; }

        然后当你想使用它时,你只需将文件导入其他 PHP 文件的顶部并像这样使用它:

        $mysqli = connectToDB();

      这是我的做法。如果有人知道更好的方法,我会很高兴知道。

      【讨论】:

        【解决方案6】:

        从开发到生产的部署不是一项简单的任务,而且可能非常复杂。公司投入大量资源以使部署成为一个合乎逻辑且稳定的过程。我建议将您的问题分解为更具体的问题。

        作为对您的问题的回答,我会做什么:

        1) 当部署需要更改数据库结构时,将这些更改写入 sql 脚本。部署时,您需要运行这些脚本并更新代码(如您所见,中间的时间会使应用程序不稳定或损坏)。在任何事情之前,将生产数据库的副本带到开发中,并首先在开发中尝试脚本。每次部署时,您都会使数据库同步。

        2) 如何保存密码取决于您是否使用框架。遵循框架,定义环境变量并根据环境(开发或生产)设置密码是一种很好的方法。

        关于代码部署,即使您是一个独特的开发人员,我也会使用 svn 或 git 将您的项目保存在版本控制之下。如果您为每个部署创建标签,它将使代码更新更加简单,并帮助您在需要时回滚。

        【讨论】:

          【解决方案7】:

          最佳实践是编写数据库迁移脚本,对其进行版本控制。然后每次上传到生产环境时,将这些版本的值存储在数据库中。只运行你以前没有运行过的版本。

          在您的存储库之外有不同的本地配置文件。这允许您使用主配置文件在 repo 中维护必要的应用程序配置,然后本地配置文件覆盖数据库和环境设置。

          【讨论】:

            猜你喜欢
            • 2011-04-29
            • 1970-01-01
            • 1970-01-01
            • 2012-12-13
            • 1970-01-01
            • 1970-01-01
            • 2018-11-09
            • 2010-09-29
            • 2013-04-17
            相关资源
            最近更新 更多