pierre@0
|
1 <?php |
sly@2
|
2 // $Id: adserve.inc,v 1.1.2.31.2.8.2.7 2009/04/09 14:06:27 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') { |
pierre@0
|
143 $include = $variables->ad_dir ."/cache/$variables->adcache/ad_cache_$variables->adcache.inc"; |
pierre@0
|
144 if (file_exists($include)) { |
pierre@0
|
145 if ($variables->debug) { |
pierre@0
|
146 echo "Attempting to include cache include file '$include'.<br />\n"; |
pierre@0
|
147 } |
pierre@0
|
148 require_once($include); |
pierre@0
|
149 } |
pierre@0
|
150 else if ($variables->debug) { |
pierre@0
|
151 echo "Failed to find cache include file '$include'.<br />\n"; |
pierre@0
|
152 } |
pierre@0
|
153 $function = 'ad_cache_'. $variables->adcache .'_variables'; |
pierre@0
|
154 if (function_exists($function)) { |
pierre@0
|
155 $external_variables = $function(); |
pierre@0
|
156 foreach ($external_variables as $key => $val) { |
pierre@0
|
157 if (!isset($variables->$key)) { |
pierre@0
|
158 $variables->$key = $val; |
pierre@0
|
159 } |
pierre@0
|
160 } |
pierre@0
|
161 } |
pierre@0
|
162 } |
pierre@0
|
163 $cache_loaded[$variables->adcache] = TRUE; |
pierre@0
|
164 } |
pierre@0
|
165 |
pierre@0
|
166 if ($variable == 'variable_dump') { |
pierre@0
|
167 echo "Dumping \$variables:<br />\n"; |
pierre@0
|
168 echo '<pre>'; |
pierre@0
|
169 foreach ($variables as $var => $val) { |
pierre@0
|
170 echo " $var($val)<br />\n"; |
pierre@0
|
171 } |
pierre@0
|
172 echo '</pre>'; |
pierre@0
|
173 } |
pierre@0
|
174 |
pierre@0
|
175 if (isset($variables->$variable)) { |
pierre@0
|
176 return $variables->$variable; |
pierre@0
|
177 } |
pierre@0
|
178 else { |
pierre@0
|
179 return NULL; |
pierre@0
|
180 } |
pierre@0
|
181 } |
pierre@0
|
182 |
pierre@0
|
183 /** |
pierre@0
|
184 * Invoke a function in the specified file. |
pierre@0
|
185 */ |
pierre@0
|
186 function adserve_invoke_file($function, $arg1 = NULL, $arg2 = NULL) { |
pierre@0
|
187 $output = ''; |
pierre@0
|
188 if (function_exists($function)) { |
pierre@0
|
189 $output = $function($arg1, $arg2); |
pierre@0
|
190 } |
pierre@0
|
191 else if (adserve_variable('debug')) { |
pierre@0
|
192 echo "Function '$function' does not exist.<br />\n"; |
pierre@0
|
193 } |
pierre@0
|
194 return $output; |
pierre@0
|
195 } |
pierre@0
|
196 |
pierre@1
|
197 /* |
pierre@1
|
198 * When debugging, strip away distracting header errors. Dump all other errors. |
pierre@0
|
199 */ |
pierre@1
|
200 function _debug_error_handler($errno, $errstr, $errfile = NULL, $errline = 0, $errcontext = NULL) { |
pierre@1
|
201 if (!preg_match('/Cannot modify header information/', $errstr) && |
pierre@1
|
202 !preg_match('/Cannot send session cache limiter/', $errstr)) { |
pierre@1
|
203 echo "PHP: errno($errno): $errstr "; |
pierre@1
|
204 if ($errfile && $errline) { |
pierre@1
|
205 echo "; Line $errline in [$errfile]"; |
pierre@1
|
206 } |
pierre@1
|
207 echo "<br />\n"; |
pierre@1
|
208 if (!empty($errcontext) && adserve_variable('debug') >= 5) { |
pierre@1
|
209 echo 'Error context:<pre>'; |
pierre@1
|
210 print_r($errcontext); |
pierre@1
|
211 echo '</pre>'; |
pierre@1
|
212 } |
pierre@0
|
213 } |
pierre@0
|
214 } |
pierre@0
|
215 |
pierre@1
|
216 /** |
pierre@1
|
217 * Dump debug message to screen; set custom error handler. |
pierre@1
|
218 */ |
pierre@0
|
219 function _debug_echo($text) { |
pierre@1
|
220 static $error_handler = FALSE; |
pierre@1
|
221 static $time = 0; |
pierre@1
|
222 |
pierre@0
|
223 if (adserve_variable('debug')) { |
pierre@1
|
224 if ($time < time()) { |
pierre@1
|
225 $time = time(); |
pierre@1
|
226 echo '--> Time mark: '. date('H:i:s', $time) ."<br />\n"; |
pierre@1
|
227 _debug_memory(); |
pierre@1
|
228 } |
pierre@1
|
229 if (!$error_handler) { |
pierre@1
|
230 set_error_handler('_debug_error_handler'); |
pierre@1
|
231 $error_handler = TRUE; |
pierre@1
|
232 } |
pierre@0
|
233 echo "$text<br />\n"; |
pierre@0
|
234 } |
pierre@0
|
235 } |
pierre@0
|
236 |
pierre@1
|
237 function _debug_memory() { |
pierre@1
|
238 $memory = ''; |
pierre@1
|
239 if (adserve_variable('debug') && function_exists('memory_get_usage')) { |
pierre@1
|
240 $memory = number_format(round(memory_get_usage() / 1024, 3), 3); |
pierre@1
|
241 echo "Memory usage: $memory K<br />\n"; |
pierre@0
|
242 } |
pierre@0
|
243 } |
pierre@0
|
244 |
pierre@0
|
245 /** |
pierre@0
|
246 * Include Drupal's bootstrap.inc. |
pierre@0
|
247 */ |
pierre@0
|
248 function adserve_include_drupal() { |
pierre@0
|
249 // For optimal performance set DRUPAL_ROOT at the top of this file. |
pierre@0
|
250 if (defined('DRUPAL_ROOT')) { |
pierre@0
|
251 if (is_dir(DRUPAL_ROOT) && file_exists(DRUPAL_ROOT .'/includes/bootstrap.inc')) { |
pierre@0
|
252 chdir(DRUPAL_ROOT); |
pierre@0
|
253 adserve_variable('root_dir', DRUPAL_ROOT); |
pierre@0
|
254 } |
pierre@0
|
255 else { |
pierre@0
|
256 echo 'Invalid DRUPAL_ROOT ('. DRUPAL_ROOT .') defined in adserve.inc'; |
pierre@0
|
257 } |
pierre@0
|
258 } |
pierre@0
|
259 else { |
pierre@0
|
260 $path = explode('/', adserve_variable('ad_dir')); |
pierre@0
|
261 while (!empty($path)) { |
pierre@0
|
262 // Search for top level Drupal directory to perform bootstrap. |
pierre@0
|
263 chdir(implode('/', $path)); |
pierre@0
|
264 if (file_exists('./includes/bootstrap.inc')) { |
pierre@0
|
265 adserve_variable('root_dir', getcwd()); |
pierre@0
|
266 break; |
pierre@0
|
267 } |
pierre@0
|
268 array_pop($path); |
pierre@0
|
269 } |
pierre@0
|
270 } |
pierre@0
|
271 require_once adserve_variable('root_dir') .'/includes/bootstrap.inc'; |
pierre@0
|
272 } |
pierre@0
|
273 |
pierre@0
|
274 /** |
pierre@0
|
275 * Include the necessary files and call the Drupal bootstrap. |
pierre@0
|
276 */ |
pierre@0
|
277 function adserve_bootstrap($bootstrap = NULL) { |
pierre@0
|
278 adserve_include_drupal(); |
pierre@0
|
279 |
pierre@0
|
280 // If no specific bootstrap is specified, do a full bootstrap. |
pierre@0
|
281 if (!isset($bootstrap)) { |
pierre@0
|
282 $bootstrap = DRUPAL_BOOTSTRAP_FULL; |
pierre@0
|
283 } |
pierre@0
|
284 |
pierre@1
|
285 echo _debug_echo("Drupal bootstrap '$bootstrap'."); |
pierre@0
|
286 |
pierre@0
|
287 drupal_bootstrap($bootstrap); |
pierre@1
|
288 echo _debug_echo("Drupal bootstrap complete."); |
pierre@0
|
289 } |
pierre@0
|
290 |
pierre@0
|
291 /** |
pierre@0
|
292 * Display additional debug information. |
pierre@0
|
293 */ |
pierre@0
|
294 function adserve_debug() { |
pierre@0
|
295 if (adserve_variable('debug')) { |
pierre@0
|
296 echo "Root drupal directory detected as '". adserve_variable('root_dir') ."'.<br />\n<br />\n"; |
pierre@0
|
297 |
pierre@0
|
298 $ad_dir = adserve_variable('ad_dir'); |
pierre@1
|
299 $files = array("$ad_dir/serve.php", "$ad_dir/adserve.inc", "$ad_dir/adcache.inc", "$ad_dir/ad.module"); |
pierre@1
|
300 if (adserve_variable('debug') >= 2) { |
pierre@0
|
301 $files = array_merge($files, array("$ad_dir/ad.install")); |
pierre@0
|
302 } |
pierre@1
|
303 if (adserve_variable('debug') >= 3) { |
pierre@1
|
304 $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
|
305 } |
pierre@0
|
306 foreach ($files as $file) { |
pierre@0
|
307 if (!file_exists($file)) { |
pierre@0
|
308 echo "Error: '$file' does not exist!<br />\n"; |
pierre@0
|
309 } |
pierre@0
|
310 else if (!is_readable($file)) { |
pierre@0
|
311 echo "Error: '$file' is not readable!<br />\n"; |
pierre@0
|
312 } |
pierre@0
|
313 else { |
pierre@0
|
314 $fd = fopen($file, 'r'); |
pierre@0
|
315 while (!feof($fd)) { |
pierre@0
|
316 $line = fgets($fd); |
pierre@0
|
317 if (substr($line, 0, 5) == "<?php") { |
pierre@0
|
318 continue; |
pierre@0
|
319 } |
pierre@0
|
320 else { |
pierre@0
|
321 echo "$file: $line<br />"; |
pierre@0
|
322 break; |
pierre@0
|
323 } |
pierre@0
|
324 } |
pierre@0
|
325 } |
pierre@0
|
326 } |
pierre@0
|
327 echo "<br />\n"; |
pierre@0
|
328 } |
pierre@0
|
329 } |
pierre@0
|
330 |