出于性能原因,我想使用mysql的INSERT DELAYED查询来持久保存日志对象。
您是否有任何想法如何使用原则来执行?
答案 0 :(得分:5)
自MySQL 5.6.6起,INSERT DELAYED已弃用,将被删除 在将来的版本中。请改用INSERT(不带DELAYED)。
使用symfony2,您可以通过为kernel.terminate
事件创建侦听器/订阅者并在其中执行来执行非阻塞数据库操作。
在响应发送后触发此事件。例如,它被生产环境中的monolog使用。
首先创建一个监听器类:
namespace Acme\Your;
use Doctrine\Common\Persistence\ObjectManager;
use Symfony\Component\HttpKernel\Event\KernelEvent;
class LongOperationLogger
{
protected $om;
protected $data;
public function __construct(ObjectManager $om)
{
$this->om = $om;
}
public function setData($data)
{
$this->data = $data;
}
public function onKernelTerminate(KernelEvent $event)
{
// don't do anything if there is not data
if ( null !== $this->data ) {
return;
}
$logEntry = new LogEntry('I will not block the response.', $this->data);
$this->om->persist($logEntry);
$this->om->flush();
}
}
然后将其定义为服务并注入对象管理器:
# app/config/config.yml
services:
long_operation.logger:
class: Acme\Your\LongOperationLogger
tags:
- { name: kernel.event_listener, event: kernel.terminate }
arguments: [ "@doctrine.orm.entity_manager" ]
最后,您可以从控制器或某个服务内部向记录器添加数据,然后在发送响应后,以非阻塞方式激活并执行数据库操作。< / p>
public function someAction()
{
// some condition
// if (...) {
// ...
// }
$this->get('long_operation.logger')->setData($whatever)
}