: str_replace(): Passing null to parameter #2 ($replace) of type array|string is deprecated in
require_once(dirname(__FILE__) . "/MixpanelBaseProducer.php");
require_once(dirname(__FILE__) . "/MixpanelPeople.php");
require_once(dirname(__FILE__) . "/../ConsumerStrategies/CurlConsumer.php");
* Provides an API to track events on Mixpanel
class Producers_MixpanelEvents extends Producers_MixpanelBaseProducer {
* An array of properties to attach to every tracked event
private $_super_properties = array("mp_lib" => "php");
* Track an event defined by $event associated with metadata defined by $properties
* @param array $properties
public function track($event, $properties = array()) {
// if no token is passed in, use current token
if (!isset($properties["token"])) $properties['token'] = $this->_token;
// if no time is passed in, use the current time
if (!isset($properties["time"])) $properties['time'] = microtime(true);
$params['event'] = $event;
$params['properties'] = array_merge($this->_super_properties, $properties);
* Register a property to be sent with every event. If the property has already been registered, it will be
* @param string $property
public function register($property, $value) {
$this->_super_properties[$property] = $value;
* Register multiple properties to be sent with every event. If any of the properties have already been registered,
* they will be overwritten.
* @param array $props_and_vals
public function registerAll($props_and_vals = array()) {
foreach($props_and_vals as $property => $value) {
$this->register($property, $value);
* Register a property to be sent with every event. If the property has already been registered, it will NOT be
public function registerOnce($property, $value) {
if (!isset($this->_super_properties[$property])) {
$this->register($property, $value);
* Register multiple properties to be sent with every event. If any of the properties have already been registered,
* they will NOT be overwritten.
* @param array $props_and_vals
public function registerAllOnce($props_and_vals = array()) {
foreach($props_and_vals as $property => $value) {
if (!isset($this->_super_properties[$property])) {
$this->register($property, $value);
* Un-register an property to be sent with every event.
* @param string $property
public function unregister($property) {
unset($this->_super_properties[$property]);
* Un-register a list of properties to be sent with every event.
* @param array $properties
public function unregisterAll($properties) {
foreach($properties as $property) {
$this->unregister($property);
* Get a property that is set to be sent with every event
* @param string $property
public function getProperty($property) {
return $this->_super_properties[$property];
* Identify the user you want to associate to tracked events. The $anon_id must be UUID v4 format (optionally with the
* prefix '$device:') and not already merged to an $identified_id. All identify calls with a new and valid $anon_id will
* trigger a track $identify event, and merge to the $identified_id.
* @param string|int $user_id
* @param string|int $anon_id [optional]
public function identify($user_id, $anon_id = null) {
$this->register("distinct_id", $user_id);
$UUIDv4 = '/^(\$device:)?[a-zA-Z0-9]*-[a-zA-Z0-9]*-[a-zA-Z0-9]*-[a-zA-Z0-9]*-[a-zA-Z0-9]*$/i';
if (preg_match($UUIDv4, $anon_id) !== 1) {
error_log("Running Identify method (identified_id: $user_id, anon_id: $anon_id) failed, anon_id not in UUID v4 format");
$this->track('$identify', array(
'$identified_id' => $user_id,
* An alias to be merged with the distinct_id. Each alias can only map to one distinct_id.
* This is helpful when you want to associate a generated id (such as a session id) to a user id or username.
* Because aliasing can be extremely vulnerable to race conditions and ordering issues, we'll make a synchronous
* call directly to Mixpanel when this method is called. If it fails we'll throw an Exception as subsequent
* events are likely to be incorrectly tracked.
* @param string|int $distinct_id
* @param string|int $alias
public function createAlias($distinct_id, $alias) {
"event" => '$create_alias',
"properties" => array("distinct_id" => $distinct_id, "alias" => $alias, "token" => $this->_token)
// Save the current fork/async options
$old_fork = isset($this->_options['fork']) ? $this->_options['fork'] : false;
$old_async = isset($this->_options['async']) ? $this->_options['async'] : false;
// Override fork/async to make the new consumer synchronous
$this->_options['fork'] = false;
$this->_options['async'] = false;
// The name is ambiguous, but this creates a new consumer with current $this->_options
$consumer = $this->_getConsumer();
$success = $consumer->persist(array($msg));
// Restore the original fork/async settings
$this->_options['fork'] = $old_fork;
$this->_options['async'] = $old_async;
error_log("Creating Mixpanel Alias (distinct id: $distinct_id, alias: $alias) failed");
throw new Exception("Tried to create an alias but the call was not successful");
* Returns the "events" endpoint
function _getEndpoint() {
return $this->_options['events_endpoint'];