一个简单php异步事件引擎,以便解耦项目中的各模块
①.使用compser装载
composer require iry/php-event
compoer update
②.传统/手动装载:在你的公共代码中加入如下代码 示例
require_once('... php-event 路径/start.php');
在公共文件*(单入口文件的项目建议在入口文件 )
*中加入如下代码. 示例
// MyNamespace\event\Setting为示例名称请修改自己的Class名称
iry\e\App::setCfg('\\MyNamespace\\event\\Setting');//参数为 Class带命名空间的全名称
//iry\e\App::setCfg(\MyNamespace\event\Setting::class);//如果php版本>= 5.5 也可以这样
<?php
namespace \MyNamespace\event;
class Setting implements \iry\e\interfaces\Setting {
public function name(){return 'my_name'
9657
span>}
public function getPoolDriver(){}
public function getSubscribers(){} //return array [class1,class2,....]
public function getEventRules(){return 'className';}
public function getTempPath(){return sys_get_temp_dir();}
}
Setting: ./src/interfaces/Setting.php
接口实现示例请参考: ./example/event/Setting.php
public function getPoolDriver()
该应用中内置了 Db (Sql DB),Sqlite,Redis,DbForLaravel ,DbForTp等驱动。
内置驱动使用方法:'store_driver'=>'@DbForLaravel?table=event_store', 表示使用内置的驱动(DbForLaravel)参数(表)为event_store
更多内置驱动请参考./src/drivers/RADME.md
public function getSubscribers()
返回类型 array(推荐) class列表: ['class1','class2'];
或者返回string
如: files:subscriber目录/*.php (会自动从这些文件的代码中分析出来Class全名)
public function getEventRules()
返回类型:"string", 返回一个 事件规则的Class名称,请参考./example/event/Event.php
返回类型:"string"
public function getTempPath()
返回类型:"string",返回一个目录路径的,结尾不要加“/”。 如:/tmp
//启动守护进程
//argv: 'ls' / 'help' / 'show' / 'daemon' / '', default:''
iry\e\Service::start($argv);
use iry\e\Fire; //引用类
Fire::event('事件名',['参数1','更多参数...'],'延时广播 秒','依赖事件ID');
Fire::event('complete',[]);//常用方法
Fire::event('complete',[],10);//延时用法,10秒后广播事件消息
Fire::event('complete',[],0,5000);//消息ID为5000的广播确认完之后才会广播当前事件
会自动形成一条事件依赖链,用于保证事件成功广播出去的顺序
use iry\e\Fire; //引用类
$fire = new Fire();
$fire ->start('beforeRequest',['参数1','...']);
//... 你的业务代码
$fire ->then('afterRequest',['参数1','...']);
//... 你的业务代码
$fire ->then('complete',['参数1','...']);
//执行顺序 beforeRequest > afterRequest > complete
$fire->getLastEventId();//获取最后一次事件的ID
这种用法自动形成一条事件依赖链,用于保证事件成功广播出去的顺序 complete 依赖 afterRequest complete会自动等待afterRequest被所有监听者确认之后 才会真正广播出去。 afterRequest 依赖 beforeRequest afterRequest会自动等待 beforeRequest 被所有监听者确认之后 才会真正广播出去。
- 事件订阅模式
- 事件绑定模式
- 代码注入模式
事件订阅模式 通过订阅者自主监听事件 (推荐) 请参考 /example/subscribers/README.md;
事件绑定模式 通过事件绑定动作,绑定方法:查看事件配置的 actions=>[''] 请参考 /example/event/event.php; 和 /example/event/actions/README.md;
代码注入模式 同步注入代码到事件触发处。 查看事件配置的 exec=>[''] 请参考 example/event/event.php; 和 /example/event/scripts/README.md;