逛公众号文章看到文章"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);监听普通事件,可多次触发事件,如果监听我一次性事件,只能单次调用
php调用Webservice基本语法如下:$url ='xxxxxxx.cn' //链接服务器端 $client = new SoapClient($url);通过以上语法已经连接到webservice,也可将wsdl在本地使用,...
md5/sha1+salt方式是目前各大cms常用的加密方式,虽然salt安全,但是各大md5网站也在研究这个方向,那么我们应该选择password_hash动态hash来助力,一种密码有多种hash结果.看代码模拟登陆.<?php //01.注册 $user ='zhang...
ThinkPHP中有一个debug调试功能,能输出报错文件的信息,并能看到这个函数被哪些函数调用,从框架的启动开始记录,特别方便调试。于是研究了下它的底层给予了实现。<?php //--框架核心--Start //框架内置错误处理 function errDealWith($er...
当我想在一个进程中监听kill 和 kill -9命令报了这个错误。//监听kill pcntl_signal(SIGTERM, function () { posix_kill(0, SIGTERM); });...
自己的composer已经发布到packagist,但是无法使用composer require easy-task/easy-task来安装,只能在配置文件使用如下方式安装:"require": { "easy...
断点下载的原理:http请求头添加Range参数告诉文件服务器端需要的字节范围例如1个文本文件的字节为1000,第一次请求Range: bytes=0-500第二次请求Range: bytes=501-1000通过每次的请求将返回的流追加写入到文件。注意的项目:断点下载服务器端的每次只返回字节传输的...