php毫秒定时器,基于event扩展

由于evnet扩展,在windows上也可以安装,所以此定时器也可以在win上进行演示,生产环境还是要基于workerman,在linux实现。
为了学习workerman,又抄了一个event出来, 毫秒定时器,workerman就是检测php环境上是否有php扩展,如果有就优先,然后才是Select类。
<?php
class Timer
{

const EV_TIMER = 1;

const EV_TIMER_ONCE = 2;

/**
* Event base.
* @var object
*/
protected $_eventBase = null;

/**
* All listeners for read/write event.
* @var array
*/
protected $_allEvents = array();

/**
* Event listeners of signal.
* @var array
*/
protected $_eventSignal = array();

/**
* All timer event listeners.
* [func, args, event, flag, time_interval]
* @var array
*/
protected $_eventTimer = array();

/**
* Timer id.
* @var int
*/
protected static $_timerId = 1;

/**
* construct
* @return void
*/

public function __construct()
{

if (class_exists('\\\\EventBase', false)) {
$class_name = '\\\\EventBase';
} else {
$class_name = '\EventBase';
}
$this->_eventBase = new $class_name();
}

/**
* @see EventInterface::add()
*/
public function add($fd, $flag, $func, $args = array())
{
if (class_exists('\\\\Event', false)) {
$class_name = '\\\\Event';
} else {
$class_name = '\Event';
}

$param = array($func, (array) $args, $flag, $fd, self::$_timerId);
$event = new $class_name($this->_eventBase, -1, $class_name::TIMEOUT | $class_name::PERSIST, array($this, "timerCallback"), $param);
if (!$event || !$event->addTimer($fd)) {
return false;
}
$this->_eventTimer[self::$_timerId] = $event;
return self::$_timerId++;
}

/**
* @see Events\EventInterface::del()
*/
public function del($fd, $flag)
{
if (isset($this->_eventTimer[$fd])) {
$this->_eventTimer[$fd]->del();
unset($this->_eventTimer[$fd]);
}
return true;
}

/**
* Timer callback.
* @param null $fd
* @param int $what
* @param int $timer_id
*/
public function timerCallback($fd, $what, $param)
{
$timer_id = $param[4];

if ($param[2] === self::EV_TIMER_ONCE) {
$this->_eventTimer[$timer_id]->del();
unset($this->_eventTimer[$timer_id]);
}

try {
call_user_func_array($param[0], $param[1]);
} catch (\Exception $e) {
exit(250);
} catch (\Error $e) {
exit(250);
}
}

/**
* @see Events\EventInterface::clearAllTimer()
* @return void
*/
public function clearAllTimer()
{
foreach ($this->_eventTimer as $event) {
$event->del();
}
$this->_eventTimer = array();
}

/**
* @see EventInterface::loop()
*/
public function loop()
{
$this->_eventBase->loop();
}

/**
* Destroy loop.
*
* @return void
*/
public function destroy()
{
foreach ($this->_eventSignal as $event) {
$event->del();
}
}

/**
* Get timer count.
*
* @return integer
*/
public function getTimerCount()
{
return count($this->_eventTimer);
}
}

function microtime_float()
{
list($usec, $sec) = explode(" ", microtime());
return bcadd($usec, $sec, 3);
}

$timer = new Timer();

$timer->add(0.5, Timer::EV_TIMER, function () {
echo microtime_float() . "\n";
});

$timer->add(1, Timer::EV_TIMER_ONCE, function () {
echo microtime_float() . "once \n";
});

//待删除的id
$id = $timer->add(5, Timer::EV_TIMER, function () {
echo "clean up after running once\n";
});

//删除定时器
$timer->add(6, Timer::EV_TIMER_ONCE, function () use ($id, $timer) {
$timer->del($id, Timer::EV_TIMER);
});

$timer->loop();

已邀请:

six

赞同来自:

强悍,可以拿出来放到自己小项目中用了

要回复问题请先登录注册