* @author Brennen Bearnes */ 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; } }