逛公众号文章看到文章"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);监听普通事件,可多次触发事件,如果监听我一次性事件,只能单次调用
(1).config.php 配置文件<?php /** * RabbitMQ_Config */ $config = [ 'host' => ...
使用openssl扩展对应替换mcrypt的函数,(比较麻烦,但是openssl是未来趋势)在新版php中编译mcrypt扩展使用一个纯php代码实现的mcrypt扩展库,git地址为https://github.com/phpseclib/mcrypt_compat,每个mcrypt的方法都已经实...
概念请参考w3school文章: redis watch ,redis exec (看完基本秒懂)(1)基本事务://连接本地的 Redis 服务 $redis = new Redis(); $redis->con...
第一次听说端口复用是在mixphp最新版本中发现的,mixphp启动监听9501端口,现在作者说可以多开几个进程来执行mixphp,我心里想了下再启动不是会端口冲突嘛,但是却没有问题,于是下载mixphp的源码解读,原来是启动http服务器使用new Co\Http\Server('0.0....
php生成器的方法getReturn获取生成器迭代完成后的返回值,当生成器迭代完成会将生成器的返回值返回,因此如果迭代器未进行迭代是获取不到值的,如果你没有return值则返回null,参考代码:<?php function G1() { &nbs...