PHPackages                             jgswift/detectr - PHPackages - PHPackages  [Skip to content](#main-content)[PHPackages](/)[Directory](/)[Categories](/categories)[Trending](/trending)[Leaderboard](/leaderboard)[Changelog](/changelog)[Analyze](/analyze)[Collections](/collections)[Log in](/login)[Sign up](/register)

1. [Directory](/)
2. /
3. [Utility &amp; Helpers](/categories/utility)
4. /
5. jgswift/detectr

ActiveLibrary[Utility &amp; Helpers](/categories/utility)

jgswift/detectr
===============

PHP 5.5+ complex event processor

0.1.1(11y ago)319MITPHPPHP &gt;=5.4

Since Sep 11Pushed 11y ago1 watchersCompare

[ Source](https://github.com/jgswift/detectr)[ Packagist](https://packagist.org/packages/jgswift/detectr)[ RSS](/packages/jgswift-detectr/feed)WikiDiscussions master Synced 6d ago

READMEChangelog (1)Dependencies (2)Versions (2)Used By (0)

detectr
=======

[](#detectr)

PHP 5.5+ complex event processor

[![Build Status](https://camo.githubusercontent.com/3576f7b3b308819b5897c29fc3523e625bf046a6d7cc3fadae59c096faab1c7f/68747470733a2f2f7472617669732d63692e6f72672f6a6773776966742f646574656374722e706e673f6272616e63683d6d6173746572)](https://travis-ci.org/jgswift/detectr)[![Scrutinizer Code Quality](https://camo.githubusercontent.com/9312f1495938b8e1a225cbed35de462be4602bec44832717846103dc19b9df98/68747470733a2f2f7363727574696e697a65722d63692e636f6d2f672f6a6773776966742f646574656374722f6261646765732f7175616c6974792d73636f72652e706e673f733d34633134333363643436383634343065306138613265623261306433616163396432613632333337)](https://scrutinizer-ci.com/g/jgswift/detectr/)[![Latest Stable Version](https://camo.githubusercontent.com/b9dece4b0a66c93e83b4e8f9a9d6d4ce35e2b05b75a6c96a17060b006af31d7a/68747470733a2f2f706f7365722e707567782e6f72672f6a6773776966742f646574656374722f762f737461626c652e737667)](https://packagist.org/packages/jgswift/detectr)[![License](https://camo.githubusercontent.com/9c2f2635caa4935ab248c255695f8b52afd796ed195a7f5bae0286a2e998852a/68747470733a2f2f706f7365722e707567782e6f72672f6a6773776966742f646574656374722f6c6963656e73652e737667)](https://packagist.org/packages/jgswift/detectr)[![Coverage Status](https://camo.githubusercontent.com/2521140e6b6dd984fcc12f6442c69e0f16a9721d0868454014c022d6ea5b6b6d/68747470733a2f2f636f766572616c6c732e696f2f7265706f732f6a6773776966742f646574656374722f62616467652e706e673f6272616e63683d6d6173746572)](https://coveralls.io/r/jgswift/detectr?branch=master)

Description
-----------

[](#description)

Detectr is a lightweight event processing package built on top of [jgswift/observr](http://github.com/jgswift/observr) to detect event sequences or aggregate event data in a domain-agnostic non-intrusive way.

Installation
------------

[](#installation)

Install via cli using [composer](https://getcomposer.org/):

```
php composer.phar require jgswift/detectr:0.1.*
```

Install via composer.json using [composer](https://getcomposer.org/):

```
{
    "require": {
        "jgswift/detectr": "0.1.*"
    }
}
```

Dependency
----------

[](#dependency)

- php 5.5+
- [jgswift/observr](http://github.com/jgswift/observr) - observer pattern using traits

Usage
-----

[](#usage)

### After

[](#after)

Called after a certain event is detected a certain number of times

```
class User {
    use observr\Subject;
}

$user = new User;

$detector = new detectr\Aggregate\After(3,'login', function($sender,$e) {
    // called after the login event is triggered 3 times
});

$detector->watch($user); // instruct detector to watch specific user events

$detector->open(); // open event stream

// trigger 'login' event 3 times
$user->setState('login',new observr\Event($user));
$user->setState('login',new observr\Event($user));
$user->setState('login',new observr\Event($user));

$detector->close(); // close event stream
```

### Any

[](#any)

Called after a certain event is detected

```
class Price {
    use observr\Subject;

    public $value = 0;
}

$price = new Price;

$detector = new detectr\Aggregate\Any(
    'receive',
    new detectr\Stats('value',detectr\Stats::SUM)
);

$detector->watch($price);

$e = new observr\Event($price);

$detector->open();

// change prices and notify listener
$price->value = 1;
$price->setState('receive',$e);

$price->value = 2;
$price->setState('receive',$e);

$price->value = 4;
$price->setState('receive',$e);

$price->value = 8;
$price->setState('receive',$e);

$detector->close();

// the observr\Event holds the final value
var_dump($e['sum']); // 15
```

### Every

[](#every)

Called at a given time interval

```
class Price {
    use observr\Subject;

    public $value = 0;
}

$price = new detectr\Tests\Mock\Price;

$c=0;
$detector = new detectr\Aggregate\Every(
    5,
    function() {
        // triggered every 5 seconds
    }
);

$detector->addStream('receive'); // stream is subordinate to timer and must be added separately

$detector->watch($price);

$detector->open();

$e = new observr\Event($price);

for($i=0;$isetState('receive',$e);
}

$detector->close();
```

### Sequence

[](#sequence)

Called if a sequence of events is detected

```
class User {
    use observr\Subject;
}

$user = new User;

$c = 0;

$detector = new detectr\Stream(
    ['login','logout'],
    function($sender,$e)use(&$c) {
        $c++; // called twice
    }
);

$detector->watch($user);

$detector->open();

// FIRST SEQUENCE
$user->setState('login',new observr\Event($user));
$user->setState('logout',new observr\Event($user));

// SECOND SEQUENCE
$user->setState('login',new observr\Event($user));
$user->setState('logout',new observr\Event($user));

$detector->close();

var_dump($c); // 2
```

### Within

[](#within)

Limits detection to a certain time-span. This limiter may be applied to any aggregator.

```
class User {
    use observr\Subject;
}

$user = new User;

$c = 0;

$detector = new detectr\Stream(
    ['login','logout'],
    function($sender,$e)use(&$c) {
        $c++; // called once
    }
);

$detector->within(1,'s'); // only called if sequences occur within timespan

$detector->watch($user);

$detector->open();

// FIRST SEQUENCE
$user->setState('login',new observr\Event($user));
$user->setState('logout',new observr\Event($user));

// block processing for a second
// this block prevent the detection sequence from emitting for the second sequence
// because it doesn't occur within enough time
sleep(1);

// SECOND SEQUENCE
$user->setState('login',new observr\Event($user));
$user->setState('logout',new observr\Event($user));

$detector->close();

var_dump($c); // 1
```

### Statistics

[](#statistics)

Helper methods to accumulate statistics on subjects

- COUNT
- SUM
- MIN
- MAX
- MEAN
- VARIANCE
- STDEV
- ALL

```
class Price {
    use observr\Subject;

    public $value = 0;
}

$price = new Price;

$detector = new detectr\Aggregate\Any(
    'receive',
    new detectr\Stats('value',detectr\Stats::ALL)
);

$detector->watch($price);

$detector->open();

$e = new observr\Event($price);

$price->value = 1;
$price->setState('receive',$e);

$price->value = 4;
$price->setState('receive',$e);

$detector->close();

var_dump($e['count']);      // 2
var_dump($e['sum']);        // 5
var_dump($e['min']);        // 1
var_dump($e['max']);        // 4
var_dump($e['mean']);       // 3
var_dump($e['variance']);   // 8
var_dump($e['stdev']);      // -1.5
```

###  Health Score

23

—

LowBetter than 27% of packages

Maintenance20

Infrequent updates — may be unmaintained

Popularity10

Limited adoption so far

Community7

Small or concentrated contributor base

Maturity48

Maturing project, gaining track record

 Bus Factor1

Top contributor holds 100% of commits — single point of failure

How is this calculated?**Maintenance (25%)** — Last commit recency, latest release date, and issue-to-star ratio. Uses a 2-year decay window.

**Popularity (30%)** — Total and monthly downloads, GitHub stars, and forks. Logarithmic scaling prevents top-heavy scores.

**Community (15%)** — Contributors, dependents, forks, watchers, and maintainers. Measures real ecosystem engagement.

**Maturity (30%)** — Project age, version count, PHP version support, and release stability.

###  Release Activity

Cadence

Unknown

Total

1

Last Release

4265d ago

### Community

Maintainers

![](https://www.gravatar.com/avatar/e60e96f18d8a9dc2aff1363eedbaf210acc96666e7497d2a83d5a416ef397295?d=identicon)[jgswift](/maintainers/jgswift)

---

Top Contributors

[![jgswift](https://avatars.githubusercontent.com/u/661738?v=4)](https://github.com/jgswift "jgswift (15 commits)")

---

Tags

phpcepevent processor

###  Code Quality

TestsPHPUnit

### Embed Badge

![Health badge](/badges/jgswift-detectr/health.svg)

```
[![Health](https://phpackages.com/badges/jgswift-detectr/health.svg)](https://phpackages.com/packages/jgswift-detectr)
```

###  Alternatives

[jansenfelipe/cep-gratis

Com esse pacote você poderá realizar consultas de CEP gratuitamente.

689.4k](/packages/jansenfelipe-cep-gratis)[imanghafoori/laravel-anypass

A minimal yet powerful package to help you in development.

21421.6k](/packages/imanghafoori-laravel-anypass)[minime/brasil-endereco

Brasil/Endereco é um componente de consulta que facilita a obtenção de endereços a partir do site dos correios

153.1k](/packages/minime-brasil-endereco)

PHPackages © 2026

[Directory](/)[Categories](/categories)[Trending](/trending)[Changelog](/changelog)[Analyze](/analyze)
