annotate adserve.inc @ 7:6aeff3329e01 ad

maj module ad 2.1rc1
author piotre
date Mon, 20 Jul 2009 13:54:40 +0000
parents e5584a19768b
children
rev   line source
pierre@0 1 <?php
piotre@7 2 // $Id: adserve.inc,v 1.1.2.31.2.8.2.8 2009/05/07 13:52:13 jeremy Exp $
pierre@0 3
pierre@0 4 /**
pierre@0 5 * @file
pierre@0 6 * Configuration.
pierre@0 7 *
pierre@0 8 * Copyright (c) 2005-2009.
pierre@0 9 * Jeremy Andrews <jeremy@tag1consulting.com>.
pierre@0 10 *
pierre@0 11 * By default, adserve configuration happens dynamically as ads are served.
pierre@0 12 * However, it is possible to override dynamic settings with static defaults.
pierre@0 13 * Refer to the documentation/ADSERVE_CONFIGURATION.txt for details on adding
pierre@0 14 * adserve overrides to settings.php.
pierre@0 15 *
pierre@0 16 * Note that the path to Drupal's root directory can not be overriden in
pierre@0 17 * settings.php as adserve needs this path to find settings.php in the first
pierre@0 18 * place. To hard code the path to Drupal's root directory, uncomment the
pierre@0 19 * following define statement, and set the correct path. This is not generally
pierre@0 20 * required. On a Unix server this path will be something like '/path/to/web'.
pierre@0 21 * On a Windows server this path will be something like 'D:\path\to\web'.
pierre@0 22 */
pierre@0 23 //define('DRUPAL_ROOT', '/var/www/html');
pierre@0 24
pierre@0 25 /**
pierre@0 26 * The main adserve logic.
pierre@0 27 */
pierre@0 28 function adserve_ad($options = array()) {
pierre@0 29 static $displayed_count = 0;
pierre@0 30
pierre@1 31 // if no $options are passed in, assume we're using JavaScript
pierre@0 32 if (!empty($options)) {
pierre@0 33 adserve_variable('variable_load', $options);
pierre@0 34 }
pierre@0 35 else {
pierre@0 36 adserve_variable('variable_load');
pierre@0 37 }
pierre@1 38
pierre@1 39 // include Drupal's settings.php
pierre@0 40 adserve_bootstrap(0);
pierre@0 41
pierre@1 42 // if debug enabled, dump current state
pierre@0 43 adserve_debug();
pierre@0 44
pierre@1 45 // start with 'error' set to false
pierre@0 46 adserve_variable('error', FALSE);
pierre@0 47
pierre@1 48 // invoke cache function (file already included in adserve_variable)
pierre@1 49 $ids = adserve_cache('get_ad_ids');
pierre@0 50
pierre@1 51 // display the advertisement(s)
sly@2 52 return adserve_cache('display', $ids);
pierre@0 53 }
pierre@0 54
pierre@0 55 /**
pierre@0 56 * Retrieve variables from $_GET array or from passed in $value array.
pierre@0 57 */
pierre@0 58 function adserve_variable($variable, $value = NULL) {
pierre@0 59 global $conf;
pierre@0 60 static $variables = NULL, $overridden = NULL, $cache_loaded = array();
pierre@0 61
pierre@1 62 // Declare variables if not already declared.
pierre@1 63 if ($variables === NULL) {
pierre@1 64 $variables = new stdClass();
pierre@1 65 }
pierre@1 66
pierre@0 67 // Update the value, if set.
pierre@0 68 if (isset($value)) {
pierre@0 69 $variables->$variable = $value;
pierre@0 70 }
pierre@0 71
pierre@0 72 if (!isset($variables->loaded) || $variable == 'variable_load') {
pierre@0 73 if ($variable == 'variable_load' && isset($value)) {
pierre@0 74 $values['debug'] = isset($value['debug']) ? $value['debug'] : '';
pierre@0 75 $values['c'] = isset($value['adcache']) ? $value['adcache'] : '';
pierre@0 76 $values['n'] = isset($value['nids']) ? $value['nids'] : '';
pierre@0 77 $values['t'] = isset($value['tids']) ? $value['tids'] : '';
pierre@0 78 $values['k'] = isset($value['hostid']) ? $value['hostid'] : '';
pierre@0 79 $values['q'] = isset($value['quantity']) ? $value['quantity'] : 1;
pierre@0 80 $values['m'] = isset($value['ad_display']) ? $value['ad_display'] : 0;
pierre@0 81 unset($value);
pierre@0 82 }
pierre@0 83 else {
pierre@0 84 $values = $_GET;
pierre@0 85 }
pierre@0 86
pierre@0 87 // Don't use getcwd as path may involve symbolic links
pierre@0 88 $variables->ad_dir = dirname($_SERVER['SCRIPT_FILENAME']);
pierre@0 89 // 'debug' is an integer.
pierre@0 90 $variables->debug = isset($values['debug']) ? (int)$values['debug'] : 0;
pierre@0 91 // Cache types are comprised of only letters.
pierre@0 92 $variables->adcache = isset($values['c']) ? preg_replace('/[^a-zA-Z]/', '', $values['c']) : 'none';
pierre@0 93 // Nids is an integer or a ",".
pierre@0 94 $variables->nids = isset($values['n']) ? preg_replace('/[^0-9,]/', '', $values['n']) : '';
pierre@0 95 // Tids is an integer or a ",".
pierre@0 96 $variables->tids = isset($values['t']) ? preg_replace('/[^0-9,]/', '', $values['t']) : '';
pierre@0 97 // Hostid is an md5() which is comprised of numbers and letters a-f.
pierre@0 98 $variables->hostid = isset($values['k']) ? preg_replace('/[^0-9a-f]/', '', $values['k']) : '';
pierre@0 99 // Click url
pierre@0 100 $variables->url = isset($values['u']) ? $values['u'] : '';
pierre@1 101 if (!$variables->url) {
pierre@1 102 $variables->url = isset($_SERVER['HTTP_REFERER']) ? $_SERVER['HTTP_REFERER'] : '';
pierre@1 103 }
pierre@0 104 // Quantity is an integer.
pierre@0 105 $variables->quantity = isset($values['q']) ? (int)$values['q'] : 0;
pierre@0 106 // Ad ID is an integer.
pierre@0 107 $variables->aid = isset($values['a']) ? (int)$values['a'] : 0;
pierre@0 108 // Method is compriese of only letters.
pierre@0 109 $variables->ad_display = isset($values['m']) ? preg_replace('/[^a-zA-Z]/', '', $values['m']) : 'javascript';
pierre@0 110
pierre@0 111 // Set defaults.
pierre@0 112 $variables->quantity = $variables->quantity ? $variables->quantity : 1;
pierre@0 113
pierre@0 114 if ($variables->debug) {
pierre@0 115 foreach ($variables as $variable => $val) {
pierre@0 116 echo "$variable: '$val'<br />\n";
pierre@0 117 }
pierre@0 118 if ($variables->debug == 1) exit;
pierre@0 119 }
pierre@0 120 $variables->loaded = TRUE;
pierre@0 121
pierre@0 122 // Override the value, if set during initialization.
pierre@0 123 if (isset($value)) {
pierre@0 124 $variables->$variable = $value;
pierre@0 125 }
pierre@0 126 }
pierre@0 127
pierre@0 128 if (!$overridden) {
pierre@0 129 if (isset($conf)) {
pierre@0 130 foreach ($conf as $var => $val) {
pierre@0 131 $variables->$var = $val;
pierre@0 132 if ($variables->debug) {
pierre@0 133 echo "Override $var: '$val'<br />\n";
pierre@0 134 }
pierre@0 135 }
pierre@0 136 $overridden = TRUE;
pierre@0 137 }
pierre@0 138 }
pierre@0 139
pierre@0 140 if (!isset($cache_loaded[$variables->adcache])) {
pierre@0 141 // Retrieve variables defined by cache plugin, if enabled.
pierre@0 142 if ($variables->adcache != 'none') {
piotre@7 143 $includes = array($variables->ad_dir ."/cache/$variables->adcache/ad_cache_$variables->adcache.inc", $variables->ad_dir ."/../ad_$variables->adcache/ad_cache_$variables->adcache.inc");
piotre@7 144 foreach ($includes as $include) {
piotre@7 145 if (file_exists($include)) {
piotre@7 146 if ($variables->debug) {
piotre@7 147 echo "Attempting to include cache include file '$include'.<br />\n";
piotre@7 148 }
piotre@7 149 require_once($include);
pierre@0 150 }
piotre@7 151 else if ($variables->debug) {
piotre@7 152 echo "Failed to find cache include file '$include'.<br />\n";
pierre@0 153 }
piotre@7 154 $function = 'ad_cache_'. $variables->adcache .'_variables';
piotre@7 155 if (function_exists($function)) {
piotre@7 156 $external_variables = $function();
piotre@7 157 foreach ($external_variables as $key => $val) {
piotre@7 158 if (!isset($variables->$key)) {
piotre@7 159 $variables->$key = $val;
piotre@7 160 }
piotre@7 161 }
piotre@7 162 }
pierre@0 163 }
pierre@0 164 }
pierre@0 165 $cache_loaded[$variables->adcache] = TRUE;
pierre@0 166 }
pierre@0 167
pierre@0 168 if ($variable == 'variable_dump') {
pierre@0 169 echo "Dumping \$variables:<br />\n";
pierre@0 170 echo '<pre>';
pierre@0 171 foreach ($variables as $var => $val) {
pierre@0 172 echo " $var($val)<br />\n";
pierre@0 173 }
pierre@0 174 echo '</pre>';
pierre@0 175 }
pierre@0 176
pierre@0 177 if (isset($variables->$variable)) {
pierre@0 178 return $variables->$variable;
pierre@0 179 }
pierre@0 180 else {
pierre@0 181 return NULL;
pierre@0 182 }
pierre@0 183 }
pierre@0 184
pierre@0 185 /**
pierre@0 186 * Invoke a function in the specified file.
pierre@0 187 */
pierre@0 188 function adserve_invoke_file($function, $arg1 = NULL, $arg2 = NULL) {
pierre@0 189 $output = '';
pierre@0 190 if (function_exists($function)) {
pierre@0 191 $output = $function($arg1, $arg2);
pierre@0 192 }
pierre@0 193 else if (adserve_variable('debug')) {
pierre@0 194 echo "Function '$function' does not exist.<br />\n";
pierre@0 195 }
pierre@0 196 return $output;
pierre@0 197 }
pierre@0 198
pierre@1 199 /*
pierre@1 200 * When debugging, strip away distracting header errors. Dump all other errors.
pierre@0 201 */
pierre@1 202 function _debug_error_handler($errno, $errstr, $errfile = NULL, $errline = 0, $errcontext = NULL) {
pierre@1 203 if (!preg_match('/Cannot modify header information/', $errstr) &&
pierre@1 204 !preg_match('/Cannot send session cache limiter/', $errstr)) {
pierre@1 205 echo "PHP: errno($errno): $errstr ";
pierre@1 206 if ($errfile && $errline) {
pierre@1 207 echo "; Line $errline in [$errfile]";
pierre@1 208 }
pierre@1 209 echo "<br />\n";
pierre@1 210 if (!empty($errcontext) && adserve_variable('debug') >= 5) {
pierre@1 211 echo 'Error context:<pre>';
pierre@1 212 print_r($errcontext);
pierre@1 213 echo '</pre>';
pierre@1 214 }
pierre@0 215 }
pierre@0 216 }
pierre@0 217
pierre@1 218 /**
pierre@1 219 * Dump debug message to screen; set custom error handler.
pierre@1 220 */
pierre@0 221 function _debug_echo($text) {
pierre@1 222 static $error_handler = FALSE;
pierre@1 223 static $time = 0;
pierre@1 224
pierre@0 225 if (adserve_variable('debug')) {
pierre@1 226 if ($time < time()) {
pierre@1 227 $time = time();
pierre@1 228 echo '--> Time mark: '. date('H:i:s', $time) ."<br />\n";
pierre@1 229 _debug_memory();
pierre@1 230 }
pierre@1 231 if (!$error_handler) {
pierre@1 232 set_error_handler('_debug_error_handler');
pierre@1 233 $error_handler = TRUE;
pierre@1 234 }
pierre@0 235 echo "$text<br />\n";
pierre@0 236 }
pierre@0 237 }
pierre@0 238
pierre@1 239 function _debug_memory() {
pierre@1 240 $memory = '';
pierre@1 241 if (adserve_variable('debug') && function_exists('memory_get_usage')) {
pierre@1 242 $memory = number_format(round(memory_get_usage() / 1024, 3), 3);
pierre@1 243 echo "Memory usage: $memory K<br />\n";
pierre@0 244 }
pierre@0 245 }
pierre@0 246
pierre@0 247 /**
pierre@0 248 * Include Drupal's bootstrap.inc.
pierre@0 249 */
pierre@0 250 function adserve_include_drupal() {
pierre@0 251 // For optimal performance set DRUPAL_ROOT at the top of this file.
pierre@0 252 if (defined('DRUPAL_ROOT')) {
pierre@0 253 if (is_dir(DRUPAL_ROOT) && file_exists(DRUPAL_ROOT .'/includes/bootstrap.inc')) {
pierre@0 254 chdir(DRUPAL_ROOT);
pierre@0 255 adserve_variable('root_dir', DRUPAL_ROOT);
pierre@0 256 }
pierre@0 257 else {
pierre@0 258 echo 'Invalid DRUPAL_ROOT ('. DRUPAL_ROOT .') defined in adserve.inc';
pierre@0 259 }
pierre@0 260 }
pierre@0 261 else {
pierre@0 262 $path = explode('/', adserve_variable('ad_dir'));
pierre@0 263 while (!empty($path)) {
pierre@0 264 // Search for top level Drupal directory to perform bootstrap.
pierre@0 265 chdir(implode('/', $path));
pierre@0 266 if (file_exists('./includes/bootstrap.inc')) {
pierre@0 267 adserve_variable('root_dir', getcwd());
pierre@0 268 break;
pierre@0 269 }
pierre@0 270 array_pop($path);
pierre@0 271 }
pierre@0 272 }
pierre@0 273 require_once adserve_variable('root_dir') .'/includes/bootstrap.inc';
pierre@0 274 }
pierre@0 275
pierre@0 276 /**
pierre@0 277 * Include the necessary files and call the Drupal bootstrap.
pierre@0 278 */
pierre@0 279 function adserve_bootstrap($bootstrap = NULL) {
pierre@0 280 adserve_include_drupal();
pierre@0 281
pierre@0 282 // If no specific bootstrap is specified, do a full bootstrap.
pierre@0 283 if (!isset($bootstrap)) {
pierre@0 284 $bootstrap = DRUPAL_BOOTSTRAP_FULL;
pierre@0 285 }
pierre@0 286
pierre@1 287 echo _debug_echo("Drupal bootstrap '$bootstrap'.");
pierre@0 288
pierre@0 289 drupal_bootstrap($bootstrap);
pierre@1 290 echo _debug_echo("Drupal bootstrap complete.");
pierre@0 291 }
pierre@0 292
pierre@0 293 /**
pierre@0 294 * Display additional debug information.
pierre@0 295 */
pierre@0 296 function adserve_debug() {
pierre@0 297 if (adserve_variable('debug')) {
pierre@0 298 echo "Root drupal directory detected as '". adserve_variable('root_dir') ."'.<br />\n<br />\n";
pierre@0 299
pierre@0 300 $ad_dir = adserve_variable('ad_dir');
pierre@1 301 $files = array("$ad_dir/serve.php", "$ad_dir/adserve.inc", "$ad_dir/adcache.inc", "$ad_dir/ad.module");
pierre@1 302 if (adserve_variable('debug') >= 2) {
pierre@0 303 $files = array_merge($files, array("$ad_dir/ad.install"));
pierre@0 304 }
pierre@1 305 if (adserve_variable('debug') >= 3) {
pierre@1 306 $files = array_merge($files, array("$ad_dir/image/ad_image.module", "$ad_dir/image/ad_image.install", "$ad_dir/text/ad_text.module", "$ad_dir/text/ad_text.install", "$ad_dir/embed/ad_embed.module", "$ad_dir/report/ad_report.module", "$ad_dir/notify/ad_notify.module", "$ad_dir/notify/ad_notify.install", "$ad_dir/cache/file/ad_cache_file.inc", "$ad_dir/cache/file/ad_cache_file.module", "$ad_dir/permission/ad_permission.module", "$ad_dir/weight/probability/ad_weight_probability.module", "$ad_dir/weight/probability/ad_weight_probability.inc"));
pierre@0 307 }
pierre@0 308 foreach ($files as $file) {
pierre@0 309 if (!file_exists($file)) {
pierre@0 310 echo "Error: '$file' does not exist!<br />\n";
pierre@0 311 }
pierre@0 312 else if (!is_readable($file)) {
pierre@0 313 echo "Error: '$file' is not readable!<br />\n";
pierre@0 314 }
pierre@0 315 else {
pierre@0 316 $fd = fopen($file, 'r');
pierre@0 317 while (!feof($fd)) {
pierre@0 318 $line = fgets($fd);
pierre@0 319 if (substr($line, 0, 5) == "<?php") {
pierre@0 320 continue;
pierre@0 321 }
pierre@0 322 else {
pierre@0 323 echo "$file: $line<br />";
pierre@0 324 break;
pierre@0 325 }
pierre@0 326 }
pierre@0 327 }
pierre@0 328 }
pierre@0 329 echo "<br />\n";
pierre@0 330 }
pierre@0 331 }
pierre@0 332