首页 文章

多个环境和CRON与PHP

提问于
浏览
1

在我的CodeIgniter站点上,我使用类似的东西来区分live和dev环境 .

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

然后,基于环境我的代码设置适当的数据库配置 .

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

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

3 回答

  • 1

    在cronjobs中没有定义 $_SERVER ,这就是您的检查失败的原因 .

    根据您的配置,有多种方法可以识别环境:

    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 ...
    }
    
  • 0

    这对我有用:

    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 以查看您可以使用的服务器上可用的变量 . 我喜欢默认使用我的开发环境,因为不同的开发人员可以设置不同的虚拟主机或路径到他们的工作目录 .

  • 0

    以命令方式设置Var:

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

    创建Bootstrap方式

    您可以为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
    

相关问题