我想yii
在 shell 中运行控制台命令。我protected/yiic
在控制台中运行,但它失败了,产生了-bash: yiic: command not found
有什么问题?查看我的 shell 命令和响应:
ls -l
...
-rw-r----- 1 srv50213 srv50213 94 Aug 21 09:26 test
-rw-r----- 1 srv50213 srv50213 75 Aug 4 21:05 yiic
-rw-r----- 1 srv50213 srv50213 395 Aug 4 21:05 yiic.bat
-rw-r----- 1 srv50213 srv50213 178 Aug 4 21:05 yiic.php
[srv50213@cl10-m protected]$ test
[srv50213@cl10-m protected]$ test
[srv50213@cl10-m protected]$ yiic
-bash: yiic: command not found
[srv50213@cl10-m protected]$ yiic.php
-bash: yiic.php: command not found
[srv50213@cl10-m protected]$
内容yiic
:
#!/usr/bin/env php
<?php
require_once(dirname(__FILE__).'/yiic.php');
内容yiic.php
:
defined('STDIN') or define('STDIN', fopen('php://stdin', 'r'));
defined('YII_DEBUG') or define('YII_DEBUG',true);
require_once(dirname(__FILE__).'/yii.php');
if(isset($config))
{
$app=Yii::createConsoleApplication($config);
$app->commandRunner->addCommands(YII_PATH.'/cli/commands');
}
else
$app=Yii::createConsoleApplication(array('basePath'=>dirname(__FILE__).'/cli'));
$env=@getenv('YII_CONSOLE_COMMANDS');
if(!empty($env))
$app->commandRunner->addCommands($env);
$app->run();
更新
我已经按照建议更改了权限,但现在当我运行时
./yiic
结果是: 没有这样的文件或目录
有了./test
它,效果很好:
-rwxr----- 1 srv50213 srv50213 94 Aug 21 11:33 test
-rwxr-xr-x 1 srv50213 srv50213 75 Aug 4 21:05 yiic
-rw-r----- 1 srv50213 srv50213 178 Aug 4 21:05 yiic.php
[srv50213@cl10-m protected]$ test
[srv50213@cl10-m protected]$ ./test
test OK
[srv50213@cl10-m protected]$ ./yiic
: No such file or directory
[srv50213@cl10-m protected]$ echo $PATH
/usr/local/bin:/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/sbin:/web/users/srv50213/bin
[srv50213@cl10-m protected]$
怎么了?
更新2
实际上 yiic.php 包含:
<?php
// change the following paths if necessary
$yiic=dirname(__FILE__).'/../../framework/yiic.php';
$config=dirname(__FILE__).'/config/main.php';
require_once($yiic);
/../../framework/yiic.php
问题主要部分中公开的框架 yiic.php 文件的路径在哪里。 Framework 文件夹中也有 yii.php 文件。
[srv50213@cl10-m protected]$ cd ..
[srv50213@cl10-m doc]$ cd ..
[srv50213@cl10-m htdocs]$ cd framework
[srv50213@cl10-m framework]$ ls -l
total 432
drwxr-s--- 2 srv50213 srv50213 4096 Jul 16 23:37 base
drwxr-s--- 3 srv50213 srv50213 4096 Jul 16 23:37 caching
drwxr-s--- 5 srv50213 srv50213 4096 Jul 16 23:37 cli
drwxr-s--- 2 srv50213 srv50213 4096 Jul 16 23:37 collections
drwxr-s--- 2 srv50213 srv50213 4096 Jul 16 23:37 console
drwxr-s--- 4 srv50213 srv50213 4096 Jul 16 23:38 db
drwxr-s--- 9 srv50213 srv50213 4096 Jul 16 23:38 gii
drwxr-s--- 4 srv50213 srv50213 4096 Jul 16 23:41 i18n
drwxr-s--- 2 srv50213 srv50213 4096 Jul 16 23:41 logging
drwxr-s--- 11 srv50213 srv50213 4096 Jul 16 23:45 web
-rw-r----- 1 srv50213 srv50213 37100 Jul 16 23:37 YiiBase.php
-rw-r----- 1 srv50213 srv50213 358 Jul 16 23:37 yiic
-rw-r----- 1 srv50213 srv50213 577 Jul 16 23:37 yiic.bat
-rw-r----- 1 srv50213 srv50213 834 Aug 21 13:05 yiic.php
-rw-r----- 1 srv50213 srv50213 304900 Jul 16 23:37 yiilite.php
-rw-r----- 1 srv50213 srv50213 638 Jul 16 23:37 yii.php
-rw-r----- 1 srv50213 srv50213 175 Jul 16 23:37 yii-powered.png
-rw-r----- 1 srv50213 srv50213 694 Jul 16 23:37 yiit.php
drwxr-s--- 4 srv50213 srv50213 4096 Jul 16 23:45 zii
[srv50213@cl10-m framework]$
我是否也应该更改框架文件夹中 yii.php 和 yiic.php 的模式(chmode)?
更新3
按照建议我运行[srv50213@cl10-m protected]$ php yiic.php
并发出 php 调试信息:
exception 'CException' with message 'Property "CConsoleApplication.defaultController" is not defined.' in /home/srv50213/htdocs/framework/base/CComponent.php:173
Stack trace:
#0 /home/srv50213/htdocs/framework/base/CModule.php(515): CComponent->__set('defaultControll...', 'site')
#1 /home/srv50213/htdocs/framework/base/CApplication.php(161): CModule->configure(Array)
#2 /home/srv50213/htdocs/framework/YiiBase.php(125): CApplication->__construct('/home/srv50213/...')
#3 /home/srv50213/htdocs/framework/YiiBase.php(113): YiiBase::createApplication('CConsoleApplica...', '/home/srv50213/...')
#4 /home/srv50213/htdocs/framework/yiic.php(23): YiiBase::createConsoleApplication('/home/srv50213/...')
#5 /home/srv50213/htdocs/doc/protected/yiic.php(7): require_once('/home/srv50213/...')
完毕
谢谢大家。其中一个问题是(如调试信息中所述) /home/srv50213/htdocs/framework/yiic.php(23)
- 。所以我改变了 $config var$config
$app=Yii::createConsoleApplication($config);
/home/srv50213/htdocs/doc/protected/yiic.php(5)从$config=dirname(__FILE__).'/config/main.php';
到
$config=dirname(__FILE__).'/config/console.php';
,它已经起作用了!
我是否仍然应该运行php yiic.php
而不是./yiic
在 cron 命令中运行?
答案1
有两个问题:
首先是你没有执行权限:
为您添加权限:
$ chmod u+x yiic
它向u
用户(您)授予x
执行权限。
第二个单独的问题是关于如何调用该程序以及如何找到它。
现在你已经有了执行权限,但是
$ yiic
可能仍然会给你一个command not found
错误。
这是因为您运行的命令是在变量列出的目录中搜索的$PATH
- 通常不包括当前目录(并且出于安全原因不应包括它)。
但是您可以通过包含命令文件的目录路径来给出要运行的命令的文件名。最简单的变体就是使用当前目录:
$ ./yiic
那应该终于可以工作了!
如果它也可以在没有前面的情况下工作,那么您将在您的- 中./
看到当前目录,看看它:.
$PATH
$ echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
(哦,然后,有一个著名的问题,即使用文件名test
来测试某些东西......这是一个非常糟糕的陷阱,我想说 - 你不是第一个被这个陷阱咬的人......)
答案2
您应该删除第一行中的 Win (CRLF);
如果您在 mcedit 中打开文件,您将看到:
!/usr/bin/env php^M
将其更改为
!/usr/bin/env php
答案3
yiic
未设置文件的权限,因此无法执行该文件。
-rw-r----- 1 srv50213 srv50213 75 Aug 4 21:05 yiic
你可以这样设置:
$ chmod u+x yiic
它应该看起来像这样:
-rwxr----- 1 srv50213 srv50213 75 Aug 4 21:05 yiic
为什么测试有效?
您可能认为您正在运行,test
但实际上您正在运行test
位于此处的其他命令之一:
$ type -a test
test is a shell builtin
test is /usr/bin/test
test is /bin/test
这是假设您使用 Bash 作为 shell,但原因可能是相同的,即您正在运行另一个版本的test
.
为了确保您运行的命令存在于当前目录中,最好在其前面加上点斜杠,即:./test
。这会强制 shelltest
从当前位置运行,而不是搜索$PATH
要运行的 shell。