逛公众号文章看到文章"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的session文件夹默认保存在同一个文件,随着访客的增多,访问的速度会非常慢,例如部分管理系统后台每天登陆1000次,1个月就创建了30000个session文件,一年后是多少?假设这个系统的用户是上万人呢?方法1:每个网站使用自己的session文件夹,代码如下:<?php $pat...
<?php //php7+ define('CONFIG', [ 'MYSQL' => '127.0.0.1',  ...
最近在编写windows php多线程的东西,从官网下载了PHP的线程安全版,尝试开启curl扩展extension=php_curl.dllphp -m 却提示 PHP Startup: Unable to load dynamic library 'C:\php\ext\php_curl...
有时候我们需要爬一个接口,但是这个接口需要很多参数,包括header和cookie要去编写,使用php curl模拟实在太慢。我们可以通过浏览器的network来复制请求为curl命令。例如我需要模拟请求接口地址:https://www.xkmz.cc/Ajax/Debug/delly,我们只需要在...
最近在项目中处理一个关于商品数据重复需要删除多余的商品记录,但是删除一条商品必然要把关联的其他表商品的id和其他商品信息更换为正确的,删除一个商品记录,同时要去修改100多张表的关联商品数据,在项目中引用了tp orm 1.2版本,由于项目是php5.6版本,没法使用最新orm,在代码中每处理1个商...
(1).管道是干嘛的?管道是用于进程之间通信的,传播或交换信息(2).管道有几种?(2.1).匿名管道(pipe):管道是一种半双工的通信方式,数据只能单向流动,而且只能在具有亲缘关系的进程间使用。通常是指父子进程关系。(2.2).高级管道(popen):将另一个程序当做一个新的进程在当前程序进程中...