|
|
- <?php
-
- /**
- * Event
- *
- * Send events to a blode daemon. See also:
- *
- * https://github.com/benlemasurier/blode
- *
- * @author Ben LeMasurier <ben@sparkfun.com>
- * @author Brennen Bearnes <brennen@sparkfun.com>
- */
-
- namespace SparkLib\Blode;
-
- class Event {
- private static $_instance;
-
- // for PHP metadata about the current process
- public static $injectmeta = false;
-
- private static $_ip = null;
- private static $_host = null;
- private static $_path = null;
-
- private $_url;
- private $_curl;
- private $_socket;
- private $_active = false;
-
- public function __construct() {
- $this->_active = (defined('BLODE_EVENTS') && (BLODE_EVENTS === true));
- $this->_url = 'http://' . BLODE_SERVER . ':' . BLODE_HTTP_PORT;
-
- static::$_ip = isset($_SERVER['REMOTE_ADDR']) ? $_SERVER['REMOTE_ADDR'] : null;
- static::$_path = isset($_SERVER['PATH_INFO']) ? $_SERVER['PATH_INFO'] : null;
- static::$_host = gethostname();
-
- if(BLODE_USE_UDP)
- $this->_init_socket();
- else
- $this->_init_curl();
- }
-
- public function __destruct() {
- if(!$this->_active)
- return;
-
- if(BLODE_USE_UDP)
- socket_close($this->_socket);
- else
- curl_close($this->_curl);
- }
-
- public static function getInstance() {
- if(!isset(self::$_instance))
- self::$_instance = new self();
-
- return self::$_instance;
- }
-
- public static function __callStatic($method, array $args) {
- $loglevel = $method;
-
- if (static::$injectmeta && is_array($args[0])) {
- // inject some useful metadata into the message, provided
- // it's already an id.
- if (isset(static::$_ip)) $args[0]['ip'] = static::$_ip;
- if (isset(static::$_path)) $args[0]['path'] = static::$_path;
- if (isset(static::$_host)) $args[0]['host'] = static::$_host;
- }
-
- static::getInstance()->write($args[0], $loglevel);
- }
-
- /**
- * Send a message to blode, optionally with a syslog-style severity.
- * The message should be a valid JSON string. You might want to
- * use writeJSON() for that and just hand it an array.
- *
- * @param $message string
- * @param $severity string name of syslog-style severity
- */
- public function write($message, $severity = 'debug') {
- if(!$this->_active)
- return;
-
- if(BLODE_USE_UDP)
- return $this->_write_udp($message, $severity);
-
- return $this->_write_http($message, $severity);
- }
-
- private function _write_udp($message, $severity) {
- $message = json_encode(Array('severity' => $severity, 'message' => $message));
-
- // write to the socket whether it's connected or not.
- socket_sendto($this->_socket, $message, strlen($message), 0, BLODE_SERVER, BLODE_UDP_PORT);
-
- return true;
- }
-
- private function _write_http($message, $severity) {
- // Handle structured messages by turning them into JSON:
- if(is_array($message))
- $message = json_encode($message);
-
- $message = urlencode($message);
- $get = "?severity=$severity&message=$message";
- curl_setopt($this->_curl, CURLOPT_URL, $this->_url . $get);
- return curl_exec($this->_curl);
- }
-
- private function _init_socket() {
- if(!$this->_active)
- return;
-
- $this->_socket = socket_create(AF_INET, SOCK_DGRAM, SOL_UDP);
- socket_set_nonblock($this->_socket);
- }
-
- private function _init_curl() {
- if(!$this->_active)
- return;
-
- $this->_curl = curl_init();
- curl_setopt($this->_curl, CURLOPT_HEADER, 0);
- curl_setopt($this->_curl, CURLOPT_RETURNTRANSFER, 0);
- curl_setopt($this->_curl, CURLOPT_FOLLOWLOCATION, 1);
-
- return;
- }
- }
|