php中有没有什么方法可以实现实时监听数据库中的某张表的变化

php中有没有什么方法可以实现实时监听数据库中的某张表的变化,第1张

最好的办法是,应用程序生命周期内,对于数据库设置有事件钩子,用于监听程序对于数据库的 *** 作。这样非常方便处理逻辑流程。

1 - 表的数据变化

表数据发生了变化,毫无疑问是写 *** 作,包括以下几种情形:

新建条目 create

更新条目 update

删除条目 delete

以上三种都是写 *** 作,会对表数据写入。

2 - 事件钩子

既然需要实时监控,那么每个数据库的 *** 作,都需要考虑在内,这是全局的监听

以laravel的Eloquent ORM 模型触发事件,允许你挂接到模型生命周期的如下节点: retrieved、creating、created、updating、updated、saving、saved、deleting、deleted、restoring 和 restored。事件允许你每当特定模型保存或更新数据库时执行代码。每个事件通过其构造器接受模型实例。

模型内添加事件监听钩子

如果重用率很高,那么使用观察者 Observer 方式进行监听更为高效。

Laravel Observer

结语

上面的方法要求读者有laravel框架的使用基础,对于构建中大型应用非常有利。

如何实现事件监听,参考了jQuery的事件绑定思路,简单的实现了一下。

主要功能:

1.绑定事件 支持一个事件绑定多个动作,支持绑定一次性事件

2.触发事件

3.注销事件

复制代码 代码如下:

class Event

{

protected static $listens = array()

public static function listen($event, $callback, $once=false){

if(!is_callable($callback)) return false

self::$listens[$event][]= array('callback'=>$callback, 'once'=>$once)

return true

}

public static function one($event, $callback){

return self::listen($event, $callback, true)

}

public static function remove($event, $index=null){

if(is_null($index))

unset(self::$listens[$event])

else

unset(self::$listens[$event][$index])

}

public static function trigger(){

if(!func_num_args()) return

$args = func_get_args()

$event = array_shift($args)

if(!isset(self::$listens[$event])) return false

foreach((array) self::$listens[$event] as $index=>$listen){

$callback = $listen['callback']

$listen['once'] &&self::remove($event, $index)

call_user_func_array($callback, $args)

}

}

}

以下是一些调用的例子:

复制代码 代码如下:

// 增加监听walk事件

Event::listen('walk', function(){

echo "I am walking...n"

})

// 增加监听walk一次性事件

Event::listen('walk', function(){

echo "I am listening...n"

}, true)

// 触发walk事件

Event::trigger('walk')

/*

I am walking...

I am listening...

*/

Event::trigger('walk')

/*

I am walking...

*/

Event::one('say', function($name=''){

echo "I am {$name}n"

})

Event::trigger('say', 'deeka')// 输出 I am deeka

Event::trigger('say', 'deeka')// not run

class Foo

{

public function bar(){

echo "Foo::bar() is calledn"

}

public function test(){

echo "Foo::foo() is called, agrs:".json_encode(func_get_args())."n"

}

}

$foo= new Foo

Event::listen('bar', array($foo, 'bar'))

Event::trigger('bar')

Event::listen('test', array($foo, 'test'))

Event::trigger('test', 1, 2, 3)

class Bar

{

public static function foo(){

echo "Bar::foo() is calledn"

}

}

Event::listen('bar1', array('Bar', 'foo'))

Event::trigger('bar1')

Event::listen('bar2', 'Bar::foo')

Event::trigger('bar2')

function bar(){

echo "bar() is calledn"

}

Event::listen('bar3', 'bar')

Event::trigger('bar3')


欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/bake/11365581.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-15
下一篇 2023-05-15

发表评论

登录后才能评论

评论列表(0条)

保存