逛公众号文章看到文章"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).学习的目标:学会创建父子进程,并且能够区分当前进程是父还是子;了解父进程执行过程,子进程执行过程;能够用多进程执行任务(2).相关函数学习: (2.1)pcntl_fork()执行时: &nbs...
当我们使用php爬虫采集网站时经常会遇到内容使用ajax异步加载。一般采取的方案是PHP模拟再请求api接口获取数据,但是有时候前端js加密非常麻烦,我们需要将js的加密方法转换为php方法方便curl请求。当然通过了解我们可以通过3种方案解决。第一种:使用phpv8js扩展执行js代码。(pecl...
PHP简单定时器可以通过pcntl_signal创建闹钟信号来实现。但是缺点很明显,性能一般,要自己实现守护进程,不支持毫秒级定时器,单进程不支持多个闹钟信号,不能跨平台运行event扩展支持的事件多,性能高。<?php //创建event配置.[空配置] $eventConfig ...
(1).管道是干嘛的?管道是用于进程之间通信的,传播或交换信息(2).管道有几种?(2.1).匿名管道(pipe):管道是一种半双工的通信方式,数据只能单向流动,而且只能在具有亲缘关系的进程间使用。通常是指父子进程关系。(2.2).高级管道(popen):将另一个程序当做一个新的进程在当前程序进程中...
本文基于Laravel Framework 6.17.1版本(1).创建项目(依赖真多,如此臃肿)composer create-project --prefer-dist laravel/laravel blog(2).安装定时任务composer包&nbs...
pear config-set http_proxy 47.94.200.124:3128 pecl config-set http_proxy 60.216.101.46:32868家里的长城宽带什么都上不去,安装php扩展真麻烦,使用网...