目前我的Cakephp应用程序中没有任何排队功能。我将在不久的将来需要这一点。上传将导致使用外部API的批处理作业具有使用限制,因此如果它受到单独的队列威胁的威胁,那么这将是最好的。 我对此没有任何经验,所以我会尝试一个不同的,但更容易的例子。蛋糕事件是异步处理的吗?
用户操作导致发送电子邮件。目前,页面的加载延迟了服务器发送电子邮件所花费的时间(相当长)。我想用Event系统来解决这个问题。 (我知道我也可以做到这一点使用这个功能AfterRender阶段,或将其派遣到shellTask,但这种方式我不学习任何东西)
从示例页面:http://book.cakephp.org/2.0/en/core-libraries/events.html 我发现这个例子:
// Cart/Model/Order.php
App::uses('CakeEvent', 'Event');
class Order extends AppModel {
public function place($order) {
if ($this->save($order)) {
$this->Cart->remove($order);
$this->getEventManager()->dispatch(new CakeEvent('Model.Order.afterPlace', $this, array(
'order' => $order
)));
return true;
}
return false;
}
}
假设的功能是由一个控制器动作叫:
public function place_order() {
$result = $this->Order->place($this->request->data);
$this->set('result', $result);
}
现在我的问题...将相应的视图中的所有调度的事件后呈现完成?或者模型功能是否会触发事件并忘记它? 最后的选择似乎更符合逻辑的我(这也类似于提到的jQuery功能的文章)
的问题是,如果这是真的,我不知道以后的例子:
在这个例子中有关使用结果:
// Using the event result
public function place($order) {
$event = new CakeEvent('Model.Order.beforePlace', $this, array('order' => $order));
$this->getEventManager()->dispatch($event);
if (!empty($event->result['order'])) {
$order = $event->result['order'];
}
if ($this->Order->save($order)) {
// ...
}
// ...
}
如果只是触发事件(然后忘了),有没有办法可以asume它已经修改了通过事件对象的下一行代码!
我想尽可能地使用蛋糕,但我不确定是否可以在没有shellTasks和外部队列的情况下获得所需的背景行为。关于这些蛋糕活动的任何提示?
THX。你说“如果你想要”......但这正是我不想要的。我可以同时使用它们吗?我怎么做? – Jeroen 2013-03-05 12:16:33
对不起,我的意思是字面意思。你不能异步使用它们。您可以创建自定义事件系统,也可以将它们发送到shell。 – Calin 2013-03-05 12:32:48
Thx。我将用这个排队系统来解决它:CakePHP的https://github.com/dereuromark/cakephp_queue – Jeroen 2013-03-06 14:18:24