-3

我正在开发 CakePHP 3.4 项目。

我必须执行一些命令来扫描特定目录的文件和目录。这可能需要很长时间,具体取决于目录的大小,因此我想在后台运行它并在视图中标记正在运行的标签,直到它成功执行。

如何从 Controller 在后台运行 Shell 任务并在执行时更新数据库?

我是壳牌任务的新手。

4

2 回答 2

3

如果这是一项耗时的任务,您对在后台运行它的想法很好。您将需要使用某种形式的排队系统,该系统允许您将作业添加到队列中,然后可以通过从 cronjob 运行队列在后台运行。看看Queue 插件可以做到这一点。

您基本上需要创建一个队列任务,其中包含您需要在后台运行的功能,然后将作业添加到将在后台运行该任务的队列中。队列插件的文档展示了如何执行此操作,并且插件中包含大量示例队列任务。

如果您需要指示排队作业的状态,您可以将作业的 ID 保存在会话中,并在加载页面时检查它是否已完成。

于 2017-03-30T10:10:28.860 回答
-1

您可以从控制器调度 Shell 任务。例如,如果你想在后台运行它,你可以通过 JavaScript/Ajax 运行这个控制器动作。

// maybe this task runs looooong
set_time_limit(0);

$shell = new ShellDispatcher();
$output = $shell->run(['cake', 'bake', 'model', 'Products']);

if ($output === 0) {
    $this->Flash->success('Yep!');
} else {
    $this->Flash->error('Nope!');
}

但至少你确实可以用谷歌搜索这个。;-)

编辑忘记这个,去找drmonkeyninja的答案。

于 2017-03-30T09:20:48.847 回答