逛公众号文章看到文章"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);
监听普通事件,可多次触发事件,如果监听我一次性事件,只能单次调用
开发com组件可以用c++,vc++,net,我比较熟悉net,演示用dnet(1).创建项目:启动vs2017,新建项目,选择Visual C# ->Windows桌面->类库通用windows(2). 修改Com项目:点击 项目->项目属性,再点击应用程序->程序集信息,...
(1).config.php 配置文件<?php /** * RabbitMQ_Config */ $config = [ 'host' => ...
今天帮朋友查询wordpress执行超级慢的原因,特此记录开启fpm的慢日志,记录执行超过30秒的脚本request_slowlog_timeout = 30 slowlog = var/log/slow.log查看日志[23-May-2019 17...
当我想在一个进程中监听kill 和 kill -9命令报了这个错误。//监听kill pcntl_signal(SIGTERM, function () { posix_kill(0, SIGTERM); });...
经常我们下载国外资源容易被墙,可以通过php脚本获取远程文件流然后输出给我们的浏览器来下载。<?php //设置下载文件的url $url = 'https://mirrors.huaweicloud.com/ubuntukylin/ubuntukylin-19....
使用openssl扩展对应替换mcrypt的函数,(比较麻烦,但是openssl是未来趋势)在新版php中编译mcrypt扩展使用一个纯php代码实现的mcrypt扩展库,git地址为https://github.com/phpseclib/mcrypt_compat,每个mcrypt的方法都已经实...