逛公众号文章看到文章"php实现事件监听与触发的方法,你用过吗?",我就好奇了,php又不是asp.net的webform,哪里来的服务端事件监听。于是学习了一波。
先看下监听类:
class Event
{
/**
* 监听列表
* @var array
*/
protected static $listens = [];
/**
* 事件监听
* @param $event
* @param $callback
* @param bool $once
* @return bool
*/
public static function listen($event, $callback, $once = false)
{
//检查是否可以调用
if (is_callable($callback) == false)
{
return false;
}
self::$listens[$event][] = [
'once' => $once,
'callback' => $callback
];
return true;
}
/**
* 事件移除
* @param $event
* @param null $index
*/
public static function remove($event, $index = null)
{
if ($index == null)
{
unset(self::$listens[$event]);
}
else
{
unset(self::$listens[$event][$index]);
}
}
/**
* 事件触发
*/
public static function trigger()
{
//提取参数和事件
$args = func_get_args();
if ($args == false)
{
return;
}
//获取事件
$event = array_shift($args);
$events = self::$listens;
if (isset($events[$event]) == false || $events == false)
{
return;
}
//循环调用
foreach ($events[$event] as $key => $item)
{
$callback = $item['callback'];
$item['once'] && self::remove($event, $key);
call_user_func_array($callback, $args);
}
}
}再看下使用代码:
/**
* 监听select事件
*/
Event::listen('select', function ($sql) {
echo "DB:select():" . $sql . PHP_EOL;
});
/**
* 监听update
*/
Event::listen('update', function ($sql) {
echo "DB:update():" . $sql . PHP_EOL;
}, true);
/**
* 触发select事件
*/
$sql = 'select * from member';
Event::trigger('select', $sql);
Event::trigger('select', $sql);
Event::trigger('select', $sql);
/**
* 触发update事件
*/
$sql = 'update member set age=16';
Event::trigger('update', $sql);
Event::trigger('update', $sql);监听普通事件,可多次触发事件,如果监听我一次性事件,只能单次调用
Session在默认情况下是使用客户端的Cookie来保存Session ID的,所以当客户端的cookie出现问题的时候就会影响Session了,如果你单纯的认为SESSION和COOKIE没有联系的话请迅速百度补脑。 &nbs...
<!doctype html> <html> <head> <meta charset="utf-8"> <title>demo</title> </head> <bod...
在PHP中,大部分变量类型,如字符串,整型,浮点,数组等都是值类型的,而类和对象是引用类型.和其他语言有点差距.(1).在值类型中我们直接使用&符号表示指向对应变量的内存地址,当前变量和被指向的变量只要有1个的值被修改都会直接影响另外一个变量的值发生变化。(ps:还是非常节省内存的,可以使用...
Redis提供了发布订阅功能,可以用于消息的传输,Redis的发布订阅机制包括三个部分,发布者(publisher),订阅者(subscriber)和频道(channel)。 发布者和订阅者都是Redis客户端,Channel则为Redis服务器端,发布者将消息发送到某个的频道,订阅了这个...
有时候我们需要爬一个接口,但是这个接口需要很多参数,包括header和cookie要去编写,使用php curl模拟实在太慢。我们可以通过浏览器的network来复制请求为curl命令。例如我需要模拟请求接口地址:https://www.xkmz.cc/Ajax/Debug/delly,我们只需要在...
断点下载的原理:http请求头添加Range参数告诉文件服务器端需要的字节范围例如1个文本文件的字节为1000,第一次请求Range: bytes=0-500第二次请求Range: bytes=501-1000通过每次的请求将返回的流追加写入到文件。注意的项目:断点下载服务器端的每次只返回字节传输的...