多个环境和CRON与PHP

时间:2014-01-02 11:53:20

标签: php codeigniter cron

在我的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上运行,以便它将连接到相应的数据库。

3 个答案:

答案 0 :(得分: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 ...
}

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

答案 2 :(得分:0)

以命令方式设置Var:

use Jenssegers\Blade\Blade;

$blade = new Blade('views', 'cache');
echo $blade->make('homepage', ['name' => 'John Doe']);

创建Bootstrap方式

您可以为具有生产环境问题的CLI创建引导程序:

在Codeigniter webroot中:$ CI_ENV="production" php index.php welcome/index

./cli-prod.php

之后,运行命令赞:

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

    die('Access Denied');
}

define('ENVIRONMENT', 'production');

require __DIR__ . '/index.php';