Events

Phormium emits a series of events.

You can subscribe to an event by invoking Event::on() with the event name as the first parameter, and the callback function as the second. The parameters of the callback function depend on the event and are documented below.

Event::on('query.executing' function($query, $arguments, $connection) {
    // Do something
})

Query events

The following events are emitted when running a database query.

Event Callback arguments Description
query.started $query, $arguments, $connection Before contacting the database.
query.preparing $query, $arguments, $connection Before preparing the query.
query.prepared $query, $arguments, $connection After preparing the query.
query.executing $query, $arguments, $connection Before executing the query.
query.executed $query, $arguments, $connection After executing the query.
query.fetching $query, $arguments, $connection Before fetching resulting data.
query.fetched $query, $arguments, $connection, $data After fetching resulting data.
query.completed $query, $arguments, $connection, $data On successful completion.
query.error $query, $arguments, $connection, $exception On error.

Note that not all events are triggered for each query. Only prepared queries will trigger preparing and prepared events. Only queries which return data will trigger fetching and fetched events.

Event callback functions use the following arguments:

Name Type Description
$query string Query SQL code
$arguments array Query arguments
$connection Phormium\Connection Connection on which the query is run
$data array The data fetched from the database.
$exception Exception Exception thrown on query failure

Transaction events

The following events are triggered when starting or ending a database transaction.

Event name Description
transaction.begin When starting a transaction.
transaction.commit When committing a transaction.
transaction.rollback When rolling back a transaction.

Callbacks for these events have a single argument: the PhormiumConnection on which the action is executed.

Examples

Logging

A simple logging example using Apache log4php.

use Logger;
use Phormium\Events;

$log = Logger::getLogger('query');

Event::on('query.started', function($query, $arguments) use ($log) {
    $log->info("Running query: $query");
});

Event::on('query.error', function ($query, $arguments, $connection, $ex) use ($log) {
    $log->error("Query failed: $ex");
});

Collecting query statistics

Timing query execution for locating slow queries.

use Phormium\Event;

class Stats
{
    private $active;

    private $stats = array();

    /** Hooks onto relevant events. */
    public function register()
    {
        Event::on('query.started', array($this, 'started'));
        Event::on('query.completed', array($this, 'completed'));
    }

    /** Called when a query has started. */
    public function started($query, $arguments)
    {
        $this->active = array(
            'query' => $query,
            'arguments' => $arguments,
            'start' => microtime(true)
        );
    }

    /** Called when a query has completed. */
    public function completed($query)
    {
        $active = $this->active;

        $active['end'] = microtime(true);
        $active['duration'] = $active['end'] - $active['start'];

        $this->stats[] = $active;
        $this->active = null;
    }

    /** Returns the collected statistics. */
    public function getStats()
    {
        return $this->stats;
    }
}

And to start collecting stats:

$stats = new Stats();
$stats->register();

Note that this example misses failed queries, which will never emit query.completed, but query.error instead.