【问题标题】:Multiple Environments and CRON with PHP使用 PHP 的多个环境和 CRON
【发布时间】:2023-03-05 23:34:01
【问题描述】:

在我的 CodeIgniter 网站上,我使用类似的东西来区分实时环境和开发环境。

if (defined('STDIN') || $_SERVER['SERVER_NAME']=='livesite.com') {
    define('ENVIRONMENT', 'production');
} else {
    define('ENVIRONMENT', 'development');
}

然后,根据环境,我的代码设置适当的数据库配置。

我还有几个通过 PHP 运行的 CRON 作业,有效地在站点内运行某些代码。

当我运行使用此代码的 CRON 作业时,它们似乎只是默认为生产环境。所以我在 dev 上运行的所有 CRON 仍然连接到生产数据库。如何修改上面的代码以与 CRON 一起使用?我只需要一种方法来检测 CRON 是否也在生产或开发中运行,以便它连接到相应的数据库。

【问题讨论】:

  • 定义一个 ENV 变量并检查它?您可以在 crontab 文件中设置环境变量,并在 apache 中使用 SetEnv,因此 cli 和 webserver 都检查相同的内容并知道它们在哪里。
  • @Wrikken 您能否详细说明或链接到任何示例?第一次与 CRON 合作。
  • 你可以直接在crontab里做。编辑 crontab 并在您的 crons 顶部添加以下行 #Crons running from the cluster SERVER_NAME="VARIABLE TO MATCH THE CONDITION"
  • 或者你可以有一个类似 SITE_DATA="DEV" 的环境变量并在 if 条件 $_SERVER["SITE_DATA"] 中使用它
  • 我更喜欢使用getenv(),但对于其余的:正如 Abhik 所说。 man 5 crontab 可能会告诉你所有你需要知道的。

标签: php codeigniter cron


【解决方案1】:

$_SERVER 未在 cronjobs 中定义,这就是您的检查失败的原因。

有几种方法可以识别环境,具体取决于您的配置:

php -B "define('ENVIRONMENT', 'test');" /path/to/cronjob.php

然后在代码中检查:

if (!defined('ENVIRONMENT')) {
  .. do your $_SERVER check ..
}

如果您的环境在不同的主机上,您可以使用:

if (php_sapi_name() == 'cli') { // Check if it's running from console/cron
  if (trim(`uname -n`) == 'myserver.dev') { // not portable to windows
    define('ENVIRONMENT', 'test');
  } else {
    define('ENVIRONMENT', 'production');
  }
} else {
  ... do your $_SERVER check ...
}

你可以设置一个cron变量,例如

*/15 * * * * ENVIRONMENT="test" php /path/to/cron

然后签入您的脚本:

if (php_sapi_name() == 'cli') {
  // you should check if it's valid first. Left out as exercise for the reader
  define('ENVIRONMENT', $_ENV['ENVIRONMENT']);
} else {
  ... do your $_SERVER check ...
}

【讨论】:

  • 如果你不介意我问,-B 有什么作用?我稍后会试一试,但它看起来很棒。谢谢。
  • 谢谢,我认为定义后需要一个分号。它抛出了一个错误,我修复了它,但现在什么也没有发生。试图找出原因。
  • 我在这里看到的是你必须在某个地方定义它 - 没有可以通过 index.php 本身访问的 $_SERVER 类型变量,也许这有服务器路径依赖?跨度>
  • $_ENV['PWD']?那安全吗?
  • 这个答案不准确。 $_SERVER 在 cron 作业中定义的。
【解决方案2】:

这对我有用:

if (php_sapi_name() == 'cli') {

    switch ($_SERVER['PWD']) {
        case '/path/to/production':
            define('ENVIRONMENT', 'production');
            break;

        case '/path/to/testing':
            define('ENVIRONMENT', 'testing');
            break;

        default:
            define('ENVIRONMENT', 'development');
            break;
    }

} else {

    // Not via CLI; Check $_SERVER['HTTP_HOST']

}

打开终端并运行php -i 以查看您的服务器上有哪些变量可供您使用。我喜欢默认使用我的开发环境,因为不同的开发人员可以设置不同的虚拟主机或工作目录的路径。

【讨论】:

    【解决方案3】:

    以命令方式设置变量:

    $ CI_ENV="production" php index.php welcome/index
    

    创建引导方式

    您可以针对生产环境创建 CLI 引导程序:

    在 Codeigniter webroot 中:./cli-prod.php

    if (php_sapi_name() !== 'cli') {
    
        die('Access Denied');
    }
    
    define('ENVIRONMENT', 'production');
    
    require __DIR__ . '/index.php';
    

    之后,运行命令喜欢:

    php ./cli-prod.php controller/action
    

    【讨论】:

      猜你喜欢
      • 2019-04-18
      • 2018-09-19
      • 2012-07-01
      • 2018-06-13
      • 2013-02-26
      • 2015-06-28
      • 1970-01-01
      • 2011-11-05
      • 1970-01-01
      相关资源
      最近更新 更多