为什么我遇到一个奇怪的执行情况与我的CakePHP Shell


Why am I experiencing a weird execution case with my CakePHP Shell?

我使用CakePHP (v2) Shell在我的在线应用程序后面执行一个进程。这个Shell是插件的一部分,所以保存在:

app/Plugins/MyPlugin/Console/Command/MyScriptShell.php

我使用了2个不同的开发服务器,在这个Shell的执行中一切都很顺利。

不幸的是,在我的生产环境中执行失败。

在Unix终端上,如果我尝试手动执行下面的命令,它会失败:

# app/Console/cake MyPlugin.MyScript helloworldfunction [params1, paramsN] -app app
PHP Fatal error:  Class 'Controller' not found in /var/www/app/Controller/AppController.php on line 6

在另一边,如果我用"sudo -u {a-unix-user} {command}"执行相同的命令行,执行工作!

# sudo -u www-data app/Console/cake MyPlugin.MyScript helloworldfunction [params1, paramsN] -app app
# sudo -u root app/Console/cake MyPlugin.MyScript helloworldfunction [params1, paramsN] -app app

注意到这种行为,我想到了unix的权利问题或类似的东西。作为一个新的测试,我决定在我的终端中授予www-data的unix会话来执行相同的命令,但不使用"sudo -u {a-unix-user} {command}"指令。不幸的是,这也失败了:

# sudo su www-data
www-data# whoami
www-data
www-data# app/Console/cake MyPlugin.MyScript helloworldfunction [params1, paramsN] -app app
PHP Fatal error:  Class 'Controller' not found in /var/www/app/Controller/AppController.php on line 6
www-data#

所以这是我现在遇到的问题的总结…知道怎么解决这种奇怪的行为吗?

谢谢。

好吧,所以没有人发现如何帮助,但我自己做了;)

对于那些遇到这种行为的人,我建议您验证系统路径设置为代码中的变量。在我的例子中,在bootstrap.php中,我有一个WWW_PATH定义,其中包含到达代码目录基的本地路径。

define('WWW_PATH', '/home/foo/www-prod/www/');

实际上,我的代码目录位于/var/www-prod/www/下,而/home/foo/www-prod只是一个unix符号链接。

似乎CakePhp Shell不能使用符号链接使用BASE_DIR加载正确的资源,因为在改变我的代码没有这个符号链接到路径后,它工作了!