在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答案 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
等等。