【发布时间】:2016-01-20 11:20:37
【问题描述】:
我用 CakePHP 2.x 创建了一个 Shell 任务,我想通过一个控制器来执行它。因此,我创建了一个在 cli 上执行命令以运行 Shell 任务的函数。这是我的文件:
// I want to launch it in background task
$pid = exec(APP . 'Console/cake {myCommand} {myTask} {argument} >/dev/null 2>&1 & echo $!', $output, $return_var);
debug($pid);
debug($output);
debug($return_var);
它呈现:
// line xx
''
// line xx
array()
// line xx
(int) 127
我尝试像这样只启动 cake 命令:
$pid = exec(APP . 'Console/cake', $output, $return_var);
我得到了同样的结果。似乎 shell 没有找到完整的路径,但这很奇怪,因为它是正确的路径。我在我的机器上测试了它,它运行良好。
你知道它是从哪里来的吗?
谢谢
【问题讨论】:
-
为什么要从控制器调用 Cake shell 任务?这听起来完全错误。如果浏览器和命令行都使用了共享代码,那么这个功能最好放在一个可以被任务和控制器调用的模型中。
-
因为我们想从浏览器中的 URL 启动这个 shell 脚本。这是一个长期运行的后台任务,我们不想在此过程中“阻止”用户。
-
这不能通过 cronjob 来自动化吗?
exec()真的应该避免。如果您需要能够从浏览器触发它,也许您应该考虑使用类似队列插件 (github.com/dereuromark/cakephp-queue) 来触发任务。 -
感谢您的回复。这似乎是个好主意。我会研究一下这个插件。
标签: php shell cakephp server sysadmin