Yii控制台与不同的配置

时间:2013-12-12 07:07:10

标签: php yii console

在Web应用程序中,我们使用相同的代码和模块,具有不同的配置,如:

index.php文件app中的

将决定,wchin config转为:

switch($_SERVER['HTTP_HOST']){
    default:
        $yii=$webRoot.'/framework/yiilite.php';
        $config = $webRoot.'/protected/config/main.php';
    break;
        case 'someurl.com':
              ...
        break;
        ...
}

但是,我怎么能用控制台应用程序呢? 我之所以使用不同的数据库等等。

可以做这样的事情:

$ ./protected/yiic --application=myappname [all defined commands as default]
代码中的

--application

将设置使用哪个控制台配置

更多解释

我对@Joe Miller的回答 但问题是,如何选择主题? 我在文件中执行了以下操作:

in protectes / yiic

$__appId = null;
for( $__i=1,$__max=count($argv); $__i<$__max; ++$__i ) {
    if ( strpos($argv[$__i],'--appid',0) === 0 ) {
        $__appId = substr($argv[$__i], 8);
        unset($argv[$__i]);
    }
}

require_once(dirname(__FILE__).'/yiic.php');

和protected / yiic.php

$__appIdsList = array(
    'my_site_1',
    'my_site_2',
    'my_site_3',
    'my_site_4',
);

$yiic=dirname(__FILE__).'/../framework/yiic.php';
$config=dirname(__FILE__).'/config/console_'.$__appId.'.php';

require_once($yiic);

并且它可以工作,并且它捕获了我需要的配置文件

./protected/yiic --appid=my_site_1

当我试图迁移时

./protected/yiic --appid=my_site_1 migrate

应用程序无法识别comman并向我提供迁移帮助列表

最后的结论(我解决了)

我想添加transperent控制台命令,而不会影响内置控制台命令和自定义控制台命令的其他执行。

另一个要求是,在低级方法上解决此问题,而不继承或重载其他类或方法。

所以,我的解决方案是:

in protected / yiic

#!/usr/bin/env php
<?php

$__appId = null;
for( $__i=1,$__max=count($argv); $__i<$__max; ++$__i ) {
    if ( strpos($argv[$__i],'--appid',0) === 0 ) {
        $__appId = substr($argv[$__i], 8);
        unset($argv[$__i]);
        unset($_SERVER['argv'][$__i]);
        $argv = $_SERVER['argv'] = array_values($argv);
    }
}

require_once(dirname(__FILE__).'/yiic.php');

和/protected/yiic.php

<?php

// change the following paths if necessary
$__appIdsList = array(
    'app_1',
    'app_2',
);

$yiic=dirname(__FILE__).'/../framework/yiic.php';
$config=dirname(__FILE__).'/config/console_'.$__appId.'.php';

if ( !is_file($config) ) {
    die("Error: There is no or wrong parametr appid. Please set parametr or correct. Example -appid={application_name}\n\tThe list of available appid:\n\t\t - ".implode("\n\t\t - ", $__appIdsList));
}

require_once($yiic);

现在可以在命令行的任何位置设置param“appid”,例如

./protected/yiic  migrate --appid=app_1

它只在我们需要的应用程序中起作用

PS:无论如何,谢谢@Joe Miller

3 个答案:

答案 0 :(得分:1)

将yiic.php复制到cron.php并修改cron.php中的配置文件

然后使用,好像它是yiic,例如:

  cd ~/protected;php ~/protected/cron.php app command --param=value >> ~/runtime/crontab.log

答案 1 :(得分:0)

如果我已经理解你正在尝试做什么,我想你可能需要这样的东西。我已经提到过这篇文章http://www.yiiframework.com/doc/guide/1.1/en/topics.console#creating-commands。我没试过这个,所以我只是在解释这篇文章。

创建一个基本命令类,您将从中扩展所有其他命令。基类run()方法选择要加载的配置文件。

在protected&gt;命令中,您需要一个文件migrate.php。这必须包含类MigrateCommand,并且必须扩展CConsoleCommand。然后,您可以覆盖此类的run()方法,以允许将参数传递给方法。 e.g。

在protected&gt;命令&gt; baseCommand.php

class MyBaseCommand extends CConsoleCommand{
        public function run($args){
            //Code here to select the config file to load
            //$args are any arguments you have passed in the command line
        }
    }

在protected&gt;命令&gt; migrate.php

class Migrate extends MyBaseCommand{
    public function run($args){
        parent::run($args);
        //Do your own stuff here
    }
}

然后您应该能够将命令调用为;

./protected/yiic migrate --appid=my_site_1

请注意,命令的名称首先显示,我不确定这是否重要,但这是指南所说的!我希望这次我能理解你的问题!

答案 2 :(得分:0)

我想,我创立了更加舒适的解决方案! 它更容易,并解决了我的所有要求。

文件中的

protected/yiic.php

我写道:

...
$yiic=dirname(__FILE__).'/../lib/framework/yiic.php';

if ( strpos(__FILE__,{first/place}) !== false ) {
    $config=dirname(__FILE__).'/config/first_config.php';
} elseif ( strpos(__FILE__,{second/place}) !== false ) {
    $config=dirname(__FILE__).'/config/second_plase.php';
} else {
    // by default
    $config=dirname(__FILE__).'/config/console.php'; 
}
require_once($yiic);
...

其中 {first / place} {second / place} - 项目路径的一部分。例如:

您的第一个项目位于:

/var/www/aproject/first_one

上的第二个
/var/www/aproject/second_one

比你检查的要好:

// for first porject
strpos(__FILE__,'aproject/first_one') !== false

等等。