php – Symfony2:如何使用INSERT DELAYED与doctrine或创建非阻塞数据库操作?
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了php – Symfony2:如何使用INSERT DELAYED与doctrine或创建非阻塞数据库操作?,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含1506字,纯文字阅读大概需要3分钟。
内容图文
出于性能原因,我想使用mysql的INSERT DELAYED查询来持久保存日志对象.
你有什么想法可以使用学说来执行吗?
解决方法:
为什么你可能不应该使用INSERT DELAYED:
As of MySQL 5.6.6, INSERT DELAYED is deprecated, and will be removed
in a future release. Use INSERT (without DELAYED) instead.
symfony2解决方案:
使用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" ]
最后,您可以从控制器或某个服务内部向记录器添加数据,然后在响应发送后以非阻塞方式激活并执行数据库操作.
public function someAction()
{
// some condition
// if (...) {
// ...
// }
$this->get('long_operation.logger')->setData($whatever)
}
内容总结
以上是互联网集市为您收集整理的php – Symfony2:如何使用INSERT DELAYED与doctrine或创建非阻塞数据库操作?全部内容,希望文章能够帮你解决php – Symfony2:如何使用INSERT DELAYED与doctrine或创建非阻塞数据库操作?所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。