Вход Регистрация
Файл: OctobirdClient.php
Строк: 229
<?php

/**
 *
 * @author Vitaly Gridasov <support@octobird.com> 
 */
class OctobirdClient {
  const 
VERSION 'php_2.0';
  const 
HTML_LABEL '<!-- fe34er3 -->';
  const 
SERVER_URI 'http://show.octobird.com/show.php';

  const 
CONNECTION_TIMEOUT_MS 1000;
  const 
TIMEOUT_MS 1000;

  const 
TYPE_BANNER_IMAGE 1;
  const 
TYPE_BANNER_TEXT 2;
  
  const 
DISALLOW 0;
  const 
ALLOW 1;

  
/**
   *
   * @var OctobirdClient 
   */
  
private static $_instance null;
  protected 
$is_initialized false;
  protected 
$site_id,
  
$unique_id,
  
$number null,
  
$type null,
  
$blocks = array(),
  
$timeout self::TIMEOUT_MS,
  
$connection_timeout self::CONNECTION_TIMEOUT_MS,
  
$default_block '';
  protected 
$configuration_params = array('number''type''blocks''timeout''connection_timeout');
  protected 
$ads = array();

  protected function 
__construct() {
    
  }

  
/**
   * Настройка клиента
   * 
   * Пример настроек
   * <code>
   * $configuration = array(
   *         'site_id' => 568,
   *         'unique_id' => 'f54ggghj6pfg',
   *         'alarm' => OctobirdClient::ALLOW,
   *         'number' => 5,
   *         'type' => OctobirdClient::TYPE_BANNER_IMAGE | OctobirdClient::TYPE_BANNER_TEXT,
   *         'blocks' => array(
   *             'top' => array(
   *                 'number' => 1,
   *                 'type' => OctobirdClient::TYPE_BANNER_TEXT
   *             ),
   *             'bottom' => array(
   *                 'number' => 2,
   *                 'type' => OctobirdClient::TYPE_BANNER_IMAGE
   *             )
   *         )
   *     ));
   * </code>
   *
   * @param array $configuration
   * @return OctobirdClient 
   */
  
public function initialize($configuration) {
    if (!
is_array($configuration)) {
      throw new 
OctobirdClientException('Для инициализации нужно передать настройки в массиве');
    }

    if (empty(
$configuration['site_id'])) {
      throw new 
OctobirdClientException('Не указан site_id');
    }
    
$this->site_id $configuration['site_id'];

    if (empty(
$configuration['unique_id'])) {
      throw new 
OctobirdClientException('Не указан unique_id');
    }
    
$this->unique_id $configuration['unique_id'];

    
//необязательные параметры
    
foreach ($this->configuration_params as $param) {
      if (!empty(
$configuration[$param])) {
        
$this->{$param} = $configuration[$param];
      }
    }

    
$this->is_initialized true;
    return 
$this;
  }

  
/**
   *
   * @return OctobirdClient 
   */
  
public static function getInstance() {
    if (!isset(
self::$_instance)) {
      
self::$_instance = new self();
    }
    return 
self::$_instance;
  }

  public function 
sendRequest() {
    
$this->checkInitialized();

    
$url self::SERVER_URI;
    
$data $this->getData();
    
$headers = array(
        
'User-Agent: OctobirdClient/2.1 php',
        
'X-Adsformobi-Id-Site: ' $this->site_id,
        
'Content-Type: application/x-www-form-urlencoded',
        
'Connection: Close'
    
);

    if (
function_exists('curl_init')) {
      
$response $this->curlRequest($url$data$headers);
    } else {
      
$response $this->fsockopenRequest($url$data$headers);
    }

    
$this->parseResponse($response);

    return 
$this;
  }

  public function 
get($block_id null$default null) {
    if(
is_null($default)){
      
$default $this->default_block;
    }
    
    if(
$block $this->_get($block_id)){
      return 
$block;
    }else{
      return 
$default self::HTML_LABEL;
    }
  }
  
  private function 
_get($block_id null){    
    if (!
count($this->ads) || ($block_id && empty($this->ads[$block_id])))
      return 
false;
    
    
$ads '';
    if (
$block_id) {
      
$ads $this->ads[$block_id];
    } else {
      
$ads current($this->ads);
    }
    
    if(
trim($ads) == self::HTML_LABEL){
      return 
false;
    }else{
      return 
$ads;
    }
  }
  
  public function 
has($block_id null){
    if(
$this->_get($block_id)){
      return 
true;
    }else{
      return 
false;
    }
  }


  
/**
   * Устанавливаем рекламный блок по умолчанию, при отсуствии рекламы
   *
   * @param string $html
   * @return OctobirdClient 
   */
  
public function setDefaultBlock($html){
    
$this->default_block $html;
    return 
$this;
  }

  protected function 
checkInitialized() {
    if (!
$this->is_initialized) {
      throw new 
OctobirdClientException('Не указаны настройки');
    }
  }

  protected function 
parseResponse($response) {
    if (empty(
$response))
      return;

    list(
$header$content) = explode("rnrn"$response2);


    if (
false === strpos($contentself::HTML_LABEL))
      return;

    try {
      
$ads = @json_decode($contenttrue);
      if (
is_array($ads)) {
        
$this->ads $ads;
      }
    } catch (
Exception $e) {
      
    }
  }

  private function 
curlRequest($url$data$headers) {
    
$ch curl_init($url);
    
    unset(
$headers[2]);
    
curl_setopt($chCURLOPT_RETURNTRANSFERtrue);
    
curl_setopt($chCURLOPT_HEADERtrue);
    
curl_setopt($chCURLOPT_HTTP_VERSIONCURL_HTTP_VERSION_1_0);
    
curl_setopt($chCURLOPT_TIMEOUT_MS$this->timeout);
    
curl_setopt($chCURLOPT_CONNECTTIMEOUT_MS$this->connection_timeout);
    
curl_setopt($chCURLOPT_HTTPHEADER$headers);
    
curl_setopt($chCURLOPT_POSTFIELDS$data);

    
$response curl_exec($ch);

    return 
$response;
  }

  private function 
fsockopenRequest($url$data$headers) {
    
$content '';
    foreach (
$data as $k => $v) {
      
$content .= $k '=' urlencode($v) . '&';
    }
    
$content substr($content0, -1);

    
$crlf "rn";
    
$request 'POST ' parse_url($urlPHP_URL_PATH) . ' HTTP/1.0' $crlf;
    
$request .= 'Host: ' parse_url($urlPHP_URL_HOST) . $crlf;
    
$request .= join($crlf$headers) . $crlf;
    
$request .= 'Content-Length: ' strlen($content) . $crlf;
    
$request .= $crlf;
    
$request .= $content;

    
$socket = @fsockopen(parse_url($urlPHP_URL_HOST), 80$errno$errstrceil($this->connection_timeout 1000));

    if (
$socket) {
      
stream_set_timeout($socketceil($this->timeout 1000));

      
fwrite($socket$request);
      
$meta stream_get_meta_data($socket);

      
$response '';

      while (!
feof($socket) && !$meta['timed_out']) {
        
$response .= fread($socket256);
        
$meta stream_get_meta_data($socket);
      }

      
fclose($socket);

      if (!
$meta['timed_out']) {
        return 
$response;
      }
    }

    return 
null;
  }

  private function 
getData() {
    
$data = array(
        
'ip' => $_SERVER['REMOTE_ADDR'],
        
'uid' => $this->unique_id,
        
'type' => $this->type,
        
'version' => self::VERSION
    );

    if(!empty(
$this->number)){
      
$data['number'] = $this->number;
    }
    
    if (!empty(
$this->blocks)) {
      
$data['blocks'] = json_encode($this->blocks);
    }

    if (!empty(
$_SERVER['HTTP_USER_AGENT'])) {
      
$data['ua'] = $_SERVER['HTTP_USER_AGENT'];
    }
    if (!empty(
$_SERVER['HTTP_REFERER'])) {
      
$data['referer'] = $_SERVER['HTTP_REFERER'];
    }
    if (!empty(
$_SERVER['HTTP_ACCEPT'])) {
      
$data['accept'] = $_SERVER['HTTP_ACCEPT'];
    }
    if (!empty(
$_SERVER['HTTP_ACCEPT_LANGUAGE'])) {
      
$data['accept-language'] = $_SERVER['HTTP_ACCEPT_LANGUAGE'];
    }

    
$protocol 'http';
    if (!empty(
$_SERVER['HTTPS']) && $_SERVER['HTTPS'] == 'on')
      
$protocol .= 's';

    
$data['request_uri'] = $protocol '://' $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI'];


    
$http_x = array();
    foreach (
$_SERVER as $key => $value) {
      if (
strpos($key'HTTP_X') === 0) {
        
$key str_replace('_''-'strtolower(substr($key5)));
        
$http_x[$key] = $value;
      }
    }
    
$data['http_x'] = serialize($http_x);

    return 
$data;
  }

}

class 
OctobirdClientException extends Exception {
  
}
Онлайн: 1
Реклама