链接将项添加到队列的方法

时间:2014-04-23 20:11:06

标签: php design-patterns laravel-4

我正在编写一个日志类,它有几个方法,如infoerrorwarning,可以将日志条目插入数据库。

到目前为止,这些方法中的每一个都直接进行了db插入。在批量处理方面,这不是一个好的性能。我现在想要通过创建队列来解决这个问题,并且只在任务结束时生成并触发一个插入语句。

我现在不确定以下内容是否有意义或是好的做法。我现在这样做的方法是链接方法来启动和提交一个队列,如:

Log::queue()->info('Just somehting')->warning('Strange stuff')->submit();

或者如果我不想直接插入它:

Log::info('Just something');

类结构例如如下所示:

class Log {
    protected $queue = array();
    protected $isQueued = false;

    public function queue() {
        $this->isQueued = true;

        return $this;
    }

    public function info() {
        if($this->isQueued) {
            //Add to queue
        } else {
            //Insert in db
        }

        return $this;
    }

    //All the other log types following...

    public function submit() {
        //Generate single insert statement from queue and insert it
    }
}

我正在使用Laravel外观,因此静态调用。

这个设计有什么问题吗?我不确定,因为例如Log::submit()本身就没有任何意义,但是有可能。它甚至重要吗?

1 个答案:

答案 0 :(得分:1)

您应该做的是删除队列/提交方法,而是接收传入的日志并将它们存储在对象的数组中,然后您可以使用类似App::shutdown(function() {...})的回调来告诉它提交-memory在应用程序完成为请求提供服务后将字符串记录到数据库中。

另外值得一提的是 - 如果您不限于使用SQL数据库,则Redis,Mongo等已有几个现有的数据库Monolog处理程序。基础Monolog实例可通过Log::getMonolog()获得。