OpenX is one of the best ad servers I’ve used, but if you are tying to use it with large sites it will not work well: the speed of the OpenX servers will be very slow and unstable. The best solution that I have found is to use Amazon S3 + CloudFront CDN. But again, OpenX has its limitations and does not support this. You need to fix OpenX Code. There are some solutions on the web to use S3 rsync with NFS but again NFS not a scalable solution and slow if you have a lot of files.
Eight months ago I was working on very high traffic site that was using OpenX ads servers. To keep it working I amended the OpenX code to support S3 and CloudFront. I have shared the code below.
Create a new S3.php file under OpenX/lib; this is will be the main S3 class
S3.php code:
-
< ?php
-
/**
-
* $Id$
-
*
-
* Copyright (c) 2007, Donovan Schonknecht. All rights reserved.
-
*
-
* Redistribution and use in source and binary forms, with or without
-
* modification, are permitted provided that the following conditions are met:
-
*
-
* – Redistributions of source code must retain the above copyright notice,
-
* this list of conditions and the following disclaimer.
-
* – Redistributions in binary form must reproduce the above copyright
-
* notice, this list of conditions and the following disclaimer in the
-
* documentation and/or other materials provided with the distribution.
-
*
-
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
-
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
-
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
-
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
-
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
-
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
-
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
-
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
-
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
-
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
-
* POSSIBILITY OF SUCH DAMAGE.
-
*/
-
-
/**
-
* Amazon S3 PHP class
-
*
-
* @link http://undesigned.org.za/2007/10/22/amazon-s3-php-class
-
* @version 0.2.3
-
*/
-
class S3 {
-
// ACL flags
-
const ACL_PRIVATE = 'private';
-
const ACL_PUBLIC_READ = 'public-read';
-
const ACL_PUBLIC_READ_WRITE = 'public-read-write';
-
-
private static $__accessKey; // AWS Access key
-
private static $__secretKey; // AWS Secret key
-
-
-
/**
-
* Constructor, used if you're not calling the class statically
-
*
-
* @param string $accessKey Access key
-
* @param string $secretKey Secret key
-
* @return void
-
*/
-
public function __construct($accessKey = null, $secretKey = null) {
-
if ($accessKey !== null && $secretKey !== null)
-
self::setAuth($accessKey, $secretKey);
-
}
-
-
-
/**
-
* Set access information
-
*
-
* @param string $accessKey Access key
-
* @param string $secretKey Secret key
-
* @return void
-
*/
-
public static function setAuth($accessKey, $secretKey) {
-
self::$__accessKey = $accessKey;
-
self::$__secretKey = $secretKey;
-
}
-
-
-
/**
-
* Get a list of buckets
-
*
-
* @param boolean $detailed Returns detailed bucket list when true
-
* @return array | false
-
*/
-
public static function listBuckets($detailed = false) {
-
$rest = new S3Request('GET', '', '');
-
$rest = $rest->getResponse();
-
if ($rest->error === false && $rest->code !== 200)
-
$rest->error = array('code' => $rest->code, 'message' => 'Unexpected HTTP status');
-
if ($rest->error !== false) {
-
trigger_error(sprintf("S3::listBuckets(): [%s] %s", $rest->error['code'], $rest->error['message']), E_USER_WARNING);
-
return false;
-
}
-
$results = array(); //var_dump($rest->body);
-
if (!isset($rest->body->Buckets)) return $results;
-
-
if ($detailed) {
-
if (isset($rest->body->Owner, $rest->body->Owner->ID, $rest->body->Owner->DisplayName))
-
$results['owner'] = array(
-
'id' => (string)$rest->body->Owner->ID, 'name' => (string)$rest->body->Owner->ID
-
);
-
$results['buckets'] = array();
-
foreach ($rest->body->Buckets->Bucket as $b)
-
$results['buckets'][] = array(
-
'name' => (string)$b->Name, 'time' => strtotime((string)$b->CreationDate)
-
);
-
} else
-
foreach ($rest->body->Buckets->Bucket as $b) $results[] = (string)$b->Name;
-
-
return $results;
-
}
-
-
-
/*
-
* Get contents for a bucket
-
*
-
* If maxKeys is null this method will loop through truncated result sets
-
*
-
* @param string $bucket Bucket name
-
* @param string $prefix Prefix
-
* @param string $marker Marker (last file listed)
-
* @param string $maxKeys Max keys (maximum number of keys to return)
-
* @return array | false
-
*/
-
public static function getBucket($bucket, $prefix = null, $marker = null, $maxKeys = null) {
-
$rest = new S3Request('GET', $bucket, '');
-
if ($prefix !== null && $prefix !== '') $rest->setParameter('prefix', $prefix);
-
if ($marker !== null && $prefix !== '') $rest->setParameter('marker', $marker);
-
if ($maxKeys !== null && $prefix !== '') $rest->setParameter('max-keys', $maxKeys);
-
$response = $rest->getResponse();
-
if ($response->error === false && $response->code !== 200)
-
$response->error = array('code' => $response->code, 'message' => 'Unexpected HTTP status');
-
if ($response->error !== false) {
-
trigger_error(sprintf("S3::getBucket(): [%s] %s", $response->error['code'], $response->error['message']), E_USER_WARNING);
-
return false;
-
}
-
-
$results = array();
-
-
$lastMarker = null;
-
if (isset($response->body, $response->body->Contents))
-
foreach ($response->body->Contents as $c) {
-
$results[(string)$c->Key] = array(
-
'name' => (string)$c->Key,
-
'time' => strToTime((string)$c->LastModified),
-
'size' => (int)$c->Size,
-
'hash' => substr((string)$c->ETag, 1, -1)
-
);
-
$lastMarker = (string)$c->Key;
-
//$response->body->IsTruncated = 'true'; break;
-
}
-
-
-
if (isset($response->body->IsTruncated) &&
-
(string)$response->body->IsTruncated == 'false') return $results;
-
-
// Loop through truncated results if maxKeys isn't specified
-
if ($maxKeys == null && $lastMarker !== null && (string)$response->body->IsTruncated == 'true')
-
do {
-
$rest = new S3Request('GET', $bucket, '');
-
if ($prefix !== null) $rest->setParameter('prefix', $prefix);
-
$rest->setParameter('marker', $lastMarker);
-
-
if (($response = $rest->getResponse(true)) == false || $response->code !== 200) break;
-
if (isset($response->body, $response->body->Contents))
-
foreach ($response->body->Contents as $c) {
-
$results[(string)$c->Key] = array(
-
'name' => (string)$c->Key,
-
'time' => strToTime((string)$c->LastModified),
-
'size' => (int)$c->Size,
-
'hash' => substr((string)$c->ETag, 1, -1)
-
);
-
$lastMarker = (string)$c->Key;
-
}
-
} while ($response !== false && (string)$response->body->IsTruncated == 'true');
-
-
return $results;
-
}
-
-
-
/**
-
* Put a bucket
-
*
-
* @param string $bucket Bucket name
-
* @param constant $acl ACL flag
-
* @return boolean
-
*/
-
public function putBucket($bucket, $acl = self::ACL_PRIVATE) {
-
$rest = new S3Request('PUT', $bucket, '');
-
$rest->setAmzHeader('x-amz-acl', $acl);
-
$rest = $rest->getResponse();
-
if ($rest->error === false && $rest->code !== 200)
-
$rest->error = array('code' => $rest->code, 'message' => 'Unexpected HTTP status');
-
if ($rest->error !== false) {
-
trigger_error(sprintf("S3::putBucket({$bucket}): [%s] %s",
-
$rest->error['code'], $rest->error['message']), E_USER_WARNING);
-
return false;
-
}
-
return true;
-
}
-
-
-
/**
-
* Delete an empty bucket
-
*
-
* @param string $bucket Bucket name
-
* @return boolean
-
*/
-
public function deleteBucket($bucket = '') {
-
$rest = new S3Request('DELETE', $bucket);
-
$rest = $rest->getResponse();
-
if ($rest->error === false && $rest->code !== 204)
-
$rest->error = array('code' => $rest->code, 'message' => 'Unexpected HTTP status');
-
if ($rest->error !== false) {
-
trigger_error(sprintf("S3::deleteBucket({$bucket}): [%s] %s",
-
$rest->error['code'], $rest->error['message']), E_USER_WARNING);
-
return false;
-
}
-
return true;
-
}
-
-
-
/**
-
* Create input info array for putObject()
-
*
-
* @param string $file Input file
-
* @param mixed $md5sum Use MD5 hash (supply a string if you want to use your own)
-
* @return array | false
-
*/
-
public static function inputFile($file, $md5sum = true) {
-
if (!file_exists($file) || !is_file($file) || !is_readable($file)) {
-
trigger_error('S3::inputFile(): Unable to open input file: '.$file, E_USER_WARNING);
-
return false;
-
}
-
return array('file' => $file, 'size' => filesize($file),
-
'md5sum' => $md5sum !== false ? (is_string($md5sum) ? $md5sum :
-
base64_encode(md5_file($file, true))) : '');
-
}
-
-
-
/**
-
* Use a resource for input
-
*
-
* @param string $file Input file
-
* @param integer $bufferSize Input byte size
-
* @param string $md5sum MD5 hash to send (optional)
-
* @return array | false
-
*/
-
public static function inputResource(&$resource, $bufferSize, $md5sum = '') {
-
if (!is_resource($resource) || $bufferSize < = 0) {
-
trigger_error('S3::inputResource(): Invalid resource or buffer size', E_USER_WARNING);
-
return false;
-
}
-
$input = array('size' => $bufferSize, 'md5sum' => $md5sum);
-
$input['fp'] =& $resource;
-
return $input;
-
}
-
-
-
/**
-
* Put an object
-
*
-
* @param mixed $input Input data
-
* @param string $bucket Bucket name
-
* @param string $uri Object URI
-
* @param constant $acl ACL constant
-
* @param array $metaHeaders Array of x-amz-meta-* headers
-
* @param string $contentType Content type
-
* @return boolean
-
*/
-
public static function putObject($input, $bucket, $uri, $acl = self::ACL_PRIVATE, $metaHeaders = array(), $contentType = null) {
-
if ($input == false) return false;
-
$rest = new S3Request('PUT', $bucket, $uri);
-
-
if (is_string($input)) $input = array(
-
'data' => $input, 'size' => strlen($input),
-
'md5sum' => base64_encode(md5($input, true))
-
);
-
-
// Data
-
if (isset($input['fp']))
-
$rest->fp =& $input['fp'];
-
elseif (isset($input['file']))
-
$rest->fp = @fopen($input['file'], 'rb');
-
elseif (isset($input['data']))
-
$rest->data = $input['data'];
-
-
// Content-Length (required)
-
if (isset($input['size']) && $input['size'] > 0)
-
$rest->size = $input['size'];
-
else {
-
if (isset($input['file']))
-
$rest->size = filesize($input['file']);
-
elseif (isset($input['data']))
-
$rest->size = strlen($input['data']);
-
}
-
-
// Content-Type
-
if ($contentType !== null)
-
$input['type'] = $contentType;
-
elseif (!isset($input['type']) && isset($input['file']))
-
$input['type'] = self::__getMimeType($input['file']);
-
else
-
$input['type'] = 'application/octet-stream';
-
-
// We need to post with the content-length and content-type, MD5 is optional
-
if ($rest->size > 0 && ($rest->fp !== false || $rest->data !== false)) {
-
$rest->setHeader('Content-Type', $input['type']);
-
if (isset($input['md5sum'])) $rest->setHeader('Content-MD5', $input['md5sum']);
-
-
$rest->setAmzHeader('x-amz-acl', $acl);
-
foreach ($metaHeaders as $h => $v) $rest->setAmzHeader('x-amz-meta-'.$h, $v);
-
$rest->getResponse();
-
} else
-
$rest->response->error = array('code' => 0, 'message' => 'Missing input parameters');
-
-
if ($rest->response->error === false && $rest->response->code !== 200)
-
$rest->response->error = array('code' => $rest->response->code, 'message' => 'Unexpected HTTP status');
-
if ($rest->response->error !== false) {
-
trigger_error(sprintf("S3::putObject(): [%s] %s", $rest->response->error['code'], $rest->response->error['message']), E_USER_WARNING);
-
return false;
-
}
-
return true;
-
}
-
-
-
/**
-
* Puts an object from a file (legacy function)
-
*
-
* @param string $file Input file path
-
* @param string $bucket Bucket name
-
* @param string $uri Object URI
-
* @param constant $acl ACL constant
-
* @param array $metaHeaders Array of x-amz-meta-* headers
-
* @param string $contentType Content type
-
* @return boolean
-
*/
-
public static function putObjectFile($file, $bucket, $uri, $acl = self::ACL_PRIVATE, $metaHeaders = array(), $contentType = null) {
-
return self::putObject(S3::inputFile($file), $bucket, $uri, $acl, $metaHeaders, $contentType);
-
}
-
-
-
/**
-
* Put an object from a string (legacy function)
-
*
-
* @param string $string Input data
-
* @param string $bucket Bucket name
-
* @param string $uri Object URI
-
* @param constant $acl ACL constant
-
* @param array $metaHeaders Array of x-amz-meta-* headers
-
* @param string $contentType Content type
-
* @return boolean
-
*/
-
public function putObjectString($string, $bucket, $uri, $acl = self::ACL_PRIVATE, $metaHeaders = array(), $contentType = 'text/plain') {
-
return self::putObject($string, $bucket, $uri, $acl, $metaHeaders, $contentType);
-
}
-
-
-
/**
-
* Get an object
-
*
-
* @param string $bucket Bucket name
-
* @param string $uri Object URI
-
* @param mixed &$saveTo Filename or resource to write to
-
* @return mixed
-
*/
-
public static function getObject($bucket = '', $uri = '', $saveTo = false) {
-
$rest = new S3Request('GET', $bucket, $uri);
-
if ($saveTo !== false) {
-
if (is_resource($saveTo))
-
$rest->fp =& $saveTo;
-
else
-
if (($rest->fp = @fopen($saveTo, 'wb')) == false)
-
$rest->response->error = array('code' => 0, 'message' => 'Unable to open save file for writing: '.$saveTo);
-
}
-
if ($rest->response->error === false) $rest->getResponse();
-
-
if ($rest->response->error === false && $rest->response->code !== 200)
-
$rest->response->error = array('code' => $rest->response->code, 'message' => 'Unexpected HTTP status');
-
if ($rest->response->error !== false) {
-
trigger_error(sprintf("S3::getObject({$bucket}, {$uri}): [%s] %s",
-
$rest->response->error['code'], $rest->response->error['message']), E_USER_WARNING);
-
return false;
-
}
-
$rest->file = realpath($saveTo);
-
return $rest->response;
-
}
-
-
-
/**
-
* Get object information
-
*
-
* @param string $bucket Bucket name
-
* @param string $uri Object URI
-
* @param boolean $returnInfo Return response information
-
* @return mixed | false
-
*/
-
public static function getObjectInfo($bucket = '', $uri = '', $returnInfo = true) {
-
$rest = new S3Request('HEAD', $bucket, $uri);
-
$rest = $rest->getResponse();
-
if ($rest->error === false && ($rest->code !== 200 && $rest->code !== 404))
-
$rest->error = array('code' => $rest->code, 'message' => 'Unexpected HTTP status');
-
if ($rest->error !== false) {
-
trigger_error(sprintf("S3::getObjectInfo({$bucket}, {$uri}): [%s] %s",
-
$rest->error['code'], $rest->error['message']), E_USER_WARNING);
-
return false;
-
}
-
return $rest->code == 200 ? $returnInfo ? $rest->headers : true : false;
-
}
-
-
-
/**
-
* Set logging for a bucket
-
*
-
* @param string $bucket Bucket name
-
* @param string $targetBucket Target bucket (where logs are stored)
-
* @param string $targetPrefix Log prefix (e,g; domain.com-)
-
* @return boolean
-
*/
-
public static function setBucketLogging($bucket, $targetBucket, $targetPrefix) {
-
$dom = new DOMDocument;
-
$bucketLoggingStatus = $dom->createElement('BucketLoggingStatus');
-
$bucketLoggingStatus->setAttribute('xmlns', 'http://s3.amazonaws.com/doc/2006-03-01/');
-
-
$loggingEnabled = $dom->createElement('LoggingEnabled');
-
-
$loggingEnabled->appendChild($dom->createElement('TargetBucket', $targetBucket));
-
$loggingEnabled->appendChild($dom->createElement('TargetPrefix', $targetPrefix));
-
-
// TODO: Add TargetGrants
-
-
$bucketLoggingStatus->appendChild($loggingEnabled);
-
$dom->appendChild($bucketLoggingStatus);
-
-
$rest = new S3Request('PUT', $bucket, '');
-
$rest->setParameter('logging', null);
-
$rest->data = $dom->saveXML();
-
$rest->size = strlen($rest->data);
-
$rest->setHeader('Content-Type', 'application/xml');
-
$rest = $rest->getResponse();
-
if ($rest->error === false && $rest->code !== 200)
-
$rest->error = array('code' => $rest->code, 'message' => 'Unexpected HTTP status');
-
if ($rest->error !== false) {
-
trigger_error(sprintf("S3::setBucketLogging({$bucket}, {$uri}): [%s] %s",
-
$rest->error['code'], $rest->error['message']), E_USER_WARNING);
-
return false;
-
}
-
return true;
-
}
-
-
-
/**
-
* Get logging status for a bucket
-
*
-
* This will return false if logging is not enabled.
-
* Note: To enable logging, you also need to grant write access to the log group
-
*
-
* @param string $bucket Bucket name
-
* @return array | false
-
*/
-
public static function getBucketLogging($bucket = '') {
-
$rest = new S3Request('GET', $bucket, '');
-
$rest->setParameter('logging', null);
-
$rest = $rest->getResponse();
-
if ($rest->error === false && $rest->code !== 200)
-
$rest->error = array('code' => $rest->code, 'message' => 'Unexpected HTTP status');
-
if ($rest->error !== false) {
-
trigger_error(sprintf("S3::getBucketLogging({$bucket}): [%s] %s",
-
$rest->error['code'], $rest->error['message']), E_USER_WARNING);
-
return false;
-
}
-
if (!isset($rest->body->LoggingEnabled)) return false; // No logging
-
return array(
-
'targetBucket' => (string)$rest->body->LoggingEnabled->TargetBucket,
-
'targetPrefix' => (string)$rest->body->LoggingEnabled->TargetPrefix,
-
);
-
}
-
-
-
/**
-
* Set object or bucket Access Control Policy
-
*
-
* @param string $bucket Bucket name
-
* @param string $uri Object URI
-
* @param array $acp Access Control Policy Data (same as the data returned from getAccessControlPolicy)
-
* @return boolean
-
*/
-
public static function setAccessControlPolicy($bucket, $uri = '', $acp = array()) {
-
$dom = new DOMDocument;
-
$dom->formatOutput = true;
-
$accessControlPolicy = $dom->createElement('AccessControlPolicy');
-
$accessControlList = $dom->createElement('AccessControlList');
-
-
// It seems the owner has to be passed along too
-
$owner = $dom->createElement('Owner');
-
$owner->appendChild($dom->createElement('ID', $acp['owner']['id']));
-
$owner->appendChild($dom->createElement('DisplayName', $acp['owner']['name']));
-
$accessControlPolicy->appendChild($owner);
-
-
foreach ($acp['acl'] as $g) {
-
$grant = $dom->createElement('Grant');
-
$grantee = $dom->createElement('Grantee');
-
$grantee->setAttribute('xmlns:xsi', 'http://www.w3.org/2001/XMLSchema-instance');
-
if (isset($g['id'])) { // CanonicalUser (DisplayName is omitted)
-
$grantee->setAttribute('xsi:type', 'CanonicalUser');
-
$grantee->appendChild($dom->createElement('ID', $g['id']));
-
} elseif (isset($g['email'])) { // AmazonCustomerByEmail
-
$grantee->setAttribute('xsi:type', 'AmazonCustomerByEmail');
-
$grantee->appendChild($dom->createElement('EmailAddress', $g['email']));
-
} elseif ($g['type'] == 'Group') { // Group
-
$grantee->setAttribute('xsi:type', 'Group');
-
$grantee->appendChild($dom->createElement('URI', $g['uri']));
-
}
-
$grant->appendChild($grantee);
-
$grant->appendChild($dom->createElement('Permission', $g['permission']));
-
$accessControlList->appendChild($grant);
-
}
-
-
$accessControlPolicy->appendChild($accessControlList);
-
$dom->appendChild($accessControlPolicy);
-
-
$rest = new S3Request('PUT', $bucket, '');
-
$rest->setParameter('acl', null);
-
$rest->data = $dom->saveXML();
-
$rest->size = strlen($rest->data);
-
$rest->setHeader('Content-Type', 'application/xml');
-
$rest = $rest->getResponse();
-
if ($rest->error === false && $rest->code !== 200)
-
$rest->error = array('code' => $rest->code, 'message' => 'Unexpected HTTP status');
-
if ($rest->error !== false) {
-
trigger_error(sprintf("S3::setAccessControlPolicy({$bucket}, {$uri}): [%s] %s",
-
$rest->error['code'], $rest->error['message']), E_USER_WARNING);
-
return false;
-
}
-
return true;
-
}
-
-
-
/**
-
* Get object or bucket Access Control Policy
-
*
-
* Currently this will trigger an error if there is no ACL on an object (will fix soon)
-
*
-
* @param string $bucket Bucket name
-
* @param string $uri Object URI
-
* @return mixed | false
-
*/
-
public static function getAccessControlPolicy($bucket, $uri = '') {
-
$rest = new S3Request('GET', $bucket, $uri);
-
$rest->setParameter('acl', null);
-
$rest = $rest->getResponse();
-
if ($rest->error === false && $rest->code !== 200)
-
$rest->error = array('code' => $rest->code, 'message' => 'Unexpected HTTP status');
-
if ($rest->error !== false) {
-
trigger_error(sprintf("S3::getAccessControlPolicy({$bucket}, {$uri}): [%s] %s",
-
$rest->error['code'], $rest->error['message']), E_USER_WARNING);
-
return false;
-
}
-
-
$acp = array();
-
if (isset($rest->body->Owner, $rest->body->Owner->ID, $rest->body->Owner->DisplayName)) {
-
$acp['owner'] = array(
-
'id' => (string)$rest->body->Owner->ID, 'name' => (string)$rest->body->Owner->DisplayName
-
);
-
}
-
if (isset($rest->body->AccessControlList)) {
-
$acp['acl'] = array();
-
foreach ($rest->body->AccessControlList->Grant as $grant) {
-
foreach ($grant->Grantee as $grantee) {
-
if (isset($grantee->ID, $grantee->DisplayName)) // CanonicalUser
-
$acp['acl'][] = array(
-
'type' => 'CanonicalUser',
-
'id' => (string)$grantee->ID,
-
'name' => (string)$grantee->DisplayName,
-
'permission' => (string)$grant->Permission
-
);
-
elseif (isset($grantee->EmailAddress)) // AmazonCustomerByEmail
-
$acp['acl'][] = array(
-
'type' => 'AmazonCustomerByEmail',
-
'email' => (string)$grantee->EmailAddress,
-
'permission' => (string)$grant->Permission
-
);
-
elseif (isset($grantee->URI)) // Group
-
$acp['acl'][] = array(
-
'type' => 'Group',
-
'uri' => (string)$grantee->URI,
-
'permission' => (string)$grant->Permission
-
);
-
else continue;
-
}
-
}
-
}
-
return $acp;
-
}
-
-
-
/**
-
* Delete an object
-
*
-
* @param string $bucket Bucket name
-
* @param string $uri Object URI
-
* @return mixed
-
*/
-
public static function deleteObject($bucket = '', $uri = '') {
-
$rest = new S3Request('DELETE', $bucket, $uri);
-
$rest = $rest->getResponse();
-
if ($rest->error === false && $rest->code !== 204)
-
$rest->error = array('code' => $rest->code, 'message' => 'Unexpected HTTP status');
-
if ($rest->error !== false) {
-
trigger_error(sprintf("S3::deleteObject(): [%s] %s", $rest->error['code'], $rest->error['message']), E_USER_WARNING);
-
return false;
-
}
-
return true;
-
}
-
-
-
/**
-
* Get MIME type for file
-
*
-
* @internal Used to get mime types
-
* @param string &$file File path
-
* @return string
-
*/
-
public static function __getMimeType(&$file) {
-
$type = false;
-
// Fileinfo documentation says fileinfo_open() will use the
-
// MAGIC env var for the magic file
-
if (extension_loaded('fileinfo') && isset($_ENV['MAGIC']) &&
-
($finfo = finfo_open(FILEINFO_MIME, $_ENV['MAGIC'])) !== false) {
-
if (($type = finfo_file($finfo, $file)) !== false) {
-
// Remove the charset and grab the last content-type
-
$type = explode(' ', str_replace('; charset=', ';charset=', $type));
-
$type = array_pop($type);
-
$type = explode(';', $type);
-
$type = array_shift($type);
-
}
-
finfo_close($finfo);
-
-
// If anyone is still using mime_content_type()
-
} elseif (function_exists('mime_content_type'))
-
$type = mime_content_type($file);
-
-
if ($type !== false && strlen($type) > 0) return $type;
-
-
// Otherwise do it the old fashioned way
-
static $exts = array(
-
'jpg' => 'image/jpeg', 'gif' => 'image/gif', 'png' => 'image/png',
-
'tif' => 'image/tiff', 'tiff' => 'image/tiff', 'ico' => 'image/x-icon',
-
'swf' => 'application/x-shockwave-flash', 'pdf' => 'application/pdf',
-
'zip' => 'application/zip', 'gz' => 'application/x-gzip',
-
'tar' => 'application/x-tar', 'bz' => 'application/x-bzip',
-
'bz2' => 'application/x-bzip2', 'txt' => 'text/plain',
-
'asc' => 'text/plain', 'htm' => 'text/html', 'html' => 'text/html',
-
'xml' => 'text/xml', 'xsl' => 'application/xsl+xml',
-
'ogg' => 'application/ogg', 'mp3' => 'audio/mpeg', 'wav' => 'audio/x-wav',
-
'avi' => 'video/x-msvideo', 'mpg' => 'video/mpeg', 'mpeg' => 'video/mpeg',
-
'mov' => 'video/quicktime', 'flv' => 'video/x-flv', 'php' => 'text/x-php'
-
);
-
$ext = strToLower(pathInfo($file, PATHINFO_EXTENSION));
-
return isset($exts[$ext]) ? $exts[$ext] : 'application/octet-stream';
-
}
-
-
-
/**
-
* Generate the auth string: "AWS AccessKey:Signature"
-
*
-
* This uses the hash extension if loaded
-
*
-
* @internal Signs the request
-
* @param string $string String to sign
-
* @return string
-
*/
-
public static function __getSignature($string) {
-
return 'AWS '.self::$__accessKey.':'.base64_encode(extension_loaded('hash') ?
-
hash_hmac('sha1', $string, self::$__secretKey, true) : pack('H*', sha1(
-
(str_pad(self::$__secretKey, 64, chr(0×00)) ^ (str_repeat(chr(0x5c), 64))) .
-
pack('H*', sha1((str_pad(self::$__secretKey, 64, chr(0×00)) ^
-
(str_repeat(chr(0×36), 64))) . $string)))));
-
}
-
-
-
}
-
-
final class S3Request {
-
private $verb, $bucket, $uri, $resource = '', $parameters = array(),
-
$amzHeaders = array(), $headers = array(
-
'Host' => '', 'Date' => '', 'Content-MD5' => '', 'Content-Type' => ''
-
);
-
public $fp = false, $size = 0, $data = false, $response;
-
-
-
/**
-
* Constructor
-
*
-
* @param string $verb Verb
-
* @param string $bucket Bucket name
-
* @param string $uri Object URI
-
* @return mixed
-
*/
-
function __construct($verb, $bucket = '', $uri = '') {
-
$this->verb = $verb;
-
$this->bucket = strtolower($bucket);
-
$this->uri = $uri !== '' ? '/'.$uri : '/';
-
-
if ($this->bucket !== '') {
-
$this->bucket = explode('/', $this->bucket);
-
$this->resource = '/'.$this->bucket[0].$this->uri;
-
$this->headers['Host'] = $this->bucket[0].'.s3.amazonaws.com';
-
$this->bucket = implode('/', $this->bucket);
-
} else {
-
$this->headers['Host'] = 's3.amazonaws.com';
-
if (strlen($this->uri) > 1)
-
$this->resource = '/'.$this->bucket.$this->uri;
-
else $this->resource = $this->uri;
-
}
-
$this->headers['Date'] = gmdate('D, d M Y H:i:s T');
-
-
$this->response = new STDClass;
-
$this->response->error = false;
-
}
-
-
-
/**
-
* Set request parameter
-
*
-
* @param string $key Key
-
* @param string $value Value
-
* @return void
-
*/
-
public function setParameter($key, $value) {
-
$this->parameters[$key] = $value;
-
}
-
-
-
/**
-
* Set request header
-
*
-
* @param string $key Key
-
* @param string $value Value
-
* @return void
-
*/
-
public function setHeader($key, $value) {
-
$this->headers[$key] = $value;
-
}
-
-
-
/**
-
* Set x-amz-meta-* header
-
*
-
* @param string $key Key
-
* @param string $value Value
-
* @return void
-
*/
-
public function setAmzHeader($key, $value) {
-
$this->amzHeaders[$key] = $value;
-
}
-
-
-
/**
-
* Get the S3 response
-
*
-
* @return object | false
-
*/
-
public function getResponse() {
-
$query = '';
-
if (sizeof($this->parameters) > 0) {
-
$query = substr($this->uri, -1) !== '?' ? '?' : '&';
-
foreach ($this->parameters as $var => $value)
-
if ($value == null || $value == '') $query .= $var.'&';
-
else $query .= $var.'='.$value.'&';
-
$query = substr($query, 0, -1);
-
$this->uri .= $query;
-
if (isset($this->parameters['acl']) || !isset($this->parameters['logging']))
-
$this->resource .= $query;
-
}
-
$url = (extension_loaded('openssl')?'https://':'http://').$this->headers['Host'].$this->uri;
-
//var_dump($this->bucket, $this->uri, $this->resource, $url);
-
-
// Basic setup
-
$curl = curl_init();
-
curl_setopt($curl, CURLOPT_USERAGENT, 'S3/php');
-
curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, 0);
-
curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, 0);
-
curl_setopt($curl, CURLOPT_URL, $url);
-
-
// Headers
-
$headers = array(); $amz = array();
-
foreach ($this->amzHeaders as $header => $value)
-
if (strlen($value) > 0) $headers[] = $header.': '.$value;
-
foreach ($this->headers as $header => $value)
-
if (strlen($value) > 0) $headers[] = $header.': '.$value;
-
foreach ($this->amzHeaders as $header => $value)
-
if (strlen($value) > 0) $amz[] = strToLower($header).':'.$value;
-
$amz = (sizeof($amz) > 0) ? "\n".implode("\n", $amz) : '';
-
-
// Authorization string
-
$headers[] = 'Authorization: ' . S3::__getSignature(
-
$this->verb."\n".
-
$this->headers['Content-MD5']."\n".
-
$this->headers['Content-Type']."\n".
-
$this->headers['Date'].$amz."\n".$this->resource
-
);
-
-
curl_setopt($curl, CURLOPT_HTTPHEADER, $headers);
-
curl_setopt($curl, CURLOPT_HEADER, false);
-
curl_setopt($curl, CURLOPT_RETURNTRANSFER, false);
-
curl_setopt($curl, CURLOPT_WRITEFUNCTION, array(&$this, '__responseWriteCallback'));
-
curl_setopt($curl, CURLOPT_HEADERFUNCTION, array(&$this, '__responseHeaderCallback'));
-
-
// Request types
-
switch ($this->verb) {
-
case 'GET': break;
-
case 'PUT':
-
if ($this->fp !== false) {
-
curl_setopt($curl, CURLOPT_PUT, true);
-
curl_setopt($curl, CURLOPT_INFILE, $this->fp);
-
if ($this->size > 0)
-
curl_setopt($curl, CURLOPT_INFILESIZE, $this->size);
-
} elseif ($this->data !== false) {
-
curl_setopt($curl, CURLOPT_CUSTOMREQUEST, 'PUT');
-
curl_setopt($curl, CURLOPT_POSTFIELDS, $this->data);
-
if ($this->size > 0)
-
curl_setopt($curl, CURLOPT_BUFFERSIZE, $this->size);
-
} else
-
curl_setopt($curl, CURLOPT_CUSTOMREQUEST, 'PUT');
-
break;
-
case 'HEAD':
-
curl_setopt($curl, CURLOPT_CUSTOMREQUEST, 'HEAD');
-
curl_setopt($curl, CURLOPT_NOBODY, true);
-
break;
-
case 'DELETE':
-
curl_setopt($curl, CURLOPT_CUSTOMREQUEST, 'DELETE');
-
break;
-
default: break;
-
}
-
-
// Execute, grab errors
-
if (curl_exec($curl))
-
$this->response->code = curl_getinfo($curl, CURLINFO_HTTP_CODE);
-
else
-
$this->response->error = array(
-
'code' => curl_errno($curl),
-
'message' => curl_error($curl),
-
'resource' => $this->resource
-
);
-
-
@curl_close($curl);
-
-
// Parse body into XML
-
if ($this->response->error === false && isset($this->response->headers['type']) &&
-
$this->response->headers['type'] == 'application/xml' && isset($this->response->body)) {
-
$this->response->body = simplexml_load_string($this->response->body);
-
-
// Grab S3 errors
-
if (!in_array($this->response->code, array(200, 204)) &&
-
isset($this->response->body->Code, $this->response->body->Message)) {
-
$this->response->error = array(
-
'code' => (string)$this->response->body->Code,
-
'message' => (string)$this->response->body->Message
-
);
-
if (isset($this->response->body->Resource))
-
$this->response->error['resource'] = (string)$this->response->body->Resource;
-
unset($this->response->body);
-
}
-
}
-
-
// Clean up file resources
-
if ($this->fp !== false && is_resource($this->fp)) fclose($this->fp);
-
-
return $this->response;
-
}
-
-
-
/**
-
* CURL write callback
-
*
-
* @param resource &$curl CURL resource
-
* @param string &$data Data
-
* @return integer
-
*/
-
private function __responseWriteCallback(&$curl, &$data) {
-
if ($this->response->code == 200 && $this->fp !== false)
-
return fwrite($this->fp, $data);
-
else
-
$this->response->body .= $data;
-
return strlen($data);
-
}
-
-
-
/**
-
* CURL header callback
-
*
-
* @param resource &$curl CURL resource
-
* @param string &$data Data
-
* @return integer
-
*/
-
private function __responseHeaderCallback(&$curl, &$data) {
-
if (($strlen = strlen($data)) < = 2) return $strlen;
-
if (substr($data, 0, 4) == 'HTTP')
-
$this->response->code = (int)substr($data, 9, 3);
-
else {
-
list($header, $value) = explode(': ', trim($data));
-
if ($header == 'Last-Modified')
-
$this->response->headers['time'] = strtotime($value);
-
elseif ($header == 'Content-Length')
-
$this->response->headers['size'] = (int)$value;
-
elseif ($header == 'Content-Type')
-
$this->response->headers['type'] = $value;
-
elseif ($header == 'ETag')
-
$this->response->headers['hash'] = substr($value, 1, -1);
-
elseif (preg_match('/^x-amz-meta-.*$/', $header))
-
$this->response->headers[$header] = is_numeric($value) ? (int)$value : $value;
-
}
-
return $strlen;
-
}
-
-
}
-
?>
Got to OpenX/www/admin/lib-storage.inc.php
Line 30 add
-
require_once MAX_PATH . '/lib/S3.php';
Replace the phpAds_ImageStore function with below,with this all images will be upload to S3 and don’t forget to setup your awsAccessKey
-
function phpAds_ImageStore($type, $name, $buffer, $overwrite = false)
-
{
-
$aConf = $GLOBALS['_MAX']['CONF'];
-
$pref = $GLOBALS['_MAX']['PREF'];
-
// Make name web friendly
-
$name = basename($name);
-
$name = strtolower($name);
-
$name = str_replace(" ", "_", $name);
-
$name = str_replace("'", "", $name);
-
$extension = substr($name, strrpos($name, "."));
-
if ($type == 'web') {
-
$filename = phpAds_LocalUniqueName($buffer, $extension);
-
// ***********************************************************************************************************************************
-
if (!defined('awsAccessKey')) define('awsAccessKey', 'Your Key');
-
if (!defined('awsSecretKey')) define('awsSecretKey', 'Your Key');
-
$s3 = new S3(awsAccessKey, awsSecretKey);
-
-
//$s3->putBucket("ads.logta.com", S3::ACL_PUBLIC_READ);
-
if ($s3->putObjectFile($buffer, "ads.logta.com", $filename, S3::ACL_PUBLIC_READ)) {
-
$stored_url = $filename;
-
}else{
-
$stored_url = "wrong24";
-
}
-
-
// ************************************************************************************************************************************
-
/*
-
$filename = phpAds_LocalUniqueName($buffer, $extension);
-
if ($aConf['store']['mode'] == 'ftp') {
-
// FTP mode
-
$server = array();
-
$server['host'] = $aConf['store']['ftpHost'];
-
$server['path'] = $aConf['store']['ftpPath'];
-
if (($server['path'] != "") && (substr($server['path'], 0, 1) == "/")) {
-
$server['path'] = substr($server['path'], 1);
-
}
-
$server['user'] = $aConf['store']['ftpUsername'];
-
$server['pass'] = $aConf['store']['ftpPassword'];
-
$server['passiv'] = !empty( $aConf['store']['ftpPassive'] );
-
$stored_url = phpAds_FTPStore($server, $filename, $buffer, true);
-
} else {
-
// Local mode, get the unique filename
-
$filename = phpAds_LocalUniqueName($buffer, $extension);
-
// Doe the file exist already?
-
if (@file_exists($aConf['store']['webDir']."/".$filename) == false) {
-
// Write the file
-
if ($fp = @fopen($aConf['store']['webDir']."/".$filename, 'wb')) {
-
@fwrite($fp, $buffer);
-
@fclose($fp);
-
$stored_url = $filename;
-
}
-
} else {
-
$stored_url = $filename;
-
}
-
}*/
-
}
Now go to your setting file Openx/var/ads.logta.com.conf.php
Find [webpath] and add your CloudFront or CDN domain like in images parameters
-
admin="Your website name/www/admin"
-
delivery="Your website name/www/delivery"
-
deliverySSL="Your website name/www/delivery"
-
images="openx_CDN_1.cloudfront.net,openx_CDN_2.cloudfront.net,openx_CDN__3.cloudfront.net"
-
imagesSSL="openx_CDN_1.cloudfront.net,openx_CDN_2.cloudfront.net,openx_CDN__3.cloudfront.net"
Next step we need to fix the Banners loding path so.. go to Openx/www/admin/account-settings-banner-delivery.php And update the code with below
-
< ?php
-
-
/*
-
+—————————————————————————+
-
| OpenX v2.8 |
-
| ========== |
-
| |
-
| Copyright (c) 2003-2009 OpenX Limited |
-
| For contact details, see: http://www.openx.org/ |
-
| |
-
| This program is free software; you can redistribute it and/or modify |
-
| it under the terms of the GNU General Public License as published by |
-
| the Free Software Foundation; either version 2 of the License, or |
-
| (at your option) any later version. |
-
| |
-
| This program is distributed in the hope that it will be useful, |
-
| but WITHOUT ANY WARRANTY; without even the implied warranty of |
-
| MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
-
| GNU General Public License for more details. |
-
| |
-
| You should have received a copy of the GNU General Public License |
-
| along with this program; if not, write to the Free Software |
-
| Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA |
-
+—————————————————————————+
-
$Id: account-settings-banner-delivery.php 62345 2010-09-14 21:16:38Z chris.nutting $
-
*/
-
-
// Require the initialisation file
-
require_once '../../init.php';
-
-
// Required files
-
require_once MAX_PATH . '/lib/OA/Admin/Option.php';
-
require_once MAX_PATH . '/lib/OA/Admin/Settings.php';
-
-
require_once MAX_PATH . '/lib/max/Plugin/Translation.php';
-
require_once MAX_PATH . '/lib/OX/Plugin/Component.php';
-
require_once MAX_PATH . '/www/admin/config.php';
-
-
-
// Security check
-
OA_Permission::enforceAccount(OA_ACCOUNT_ADMIN);
-
-
// Load translation class
-
$oTranslation = new OX_Translation();
-
-
// Create a new option object for displaying the setting's page's HTML form
-
$oOptions = new OA_Admin_Option('settings');
-
$prefSection = "banner-delivery";
-
-
// This page depends on deliveryCacheStore plugins, so get the required
-
// information about all such plugins installed in this installation
-
$aDeliveryCacheStores = OX_Component::getComponents('deliveryCacheStore', null, false);
-
-
// This page depends on 3rdPartyServers plugins, so get the required
-
// information about all such plugins installed in this installation]
-
$a3rdPartyServers = &OX_Component::getComponents('3rdPartyServers');
-
-
// Prepare an array for storing error messages
-
$aErrormessage = array();
-
-
// If the settings page is a submission, deal with the form data
-
if (isset($_POST['submitok']) && $_POST['submitok'] == 'true') {
-
// Prepare an array of the HTML elements to process, and the
-
// location to save the values in the settings configuration
-
// file
-
$aElements = array();
-
// Banner Delivery Cache Settings
-
$aElements += array(
-
'delivery_cacheExpire' => array('delivery' => 'cacheExpire'),
-
'delivery_cacheStorePlugin' => array('delivery' => 'cacheStorePlugin')
-
);
-
-
// Banner Delivery Settings
-
$aElements += array(
-
'delivery_acls' => array(
-
'delivery' => 'acls',
-
'bool' => true
-
),
-
'delivery_aclsDirectSelection' => array(
-
'delivery' => 'acls',
-
'bool' => true
-
),
-
'delivery_obfuscate' => array(
-
'delivery' => 'obfuscate',
-
'bool' => true
-
),
-
'delivery_execPhp' => array(
-
'delivery' => 'execPhp',
-
'bool' => true
-
),
-
'delivery_ctDelimiter' => array('delivery' => 'ctDelimiter'),
-
'defaultBanner_imageUrl' => array('defaultBanner' => 'imageUrl')
-
);
-
// Invocation Defaults
-
$aElements += array(
-
'delivery_clicktracking' => array('delivery' => 'clicktracking')
-
);
-
// P3P Privacy Policies
-
$aElements += array(
-
'p3p_policies' => array(
-
'p3p' => 'policies',
-
'bool' => true
-
),
-
'p3p_compactPolicy' => array('p3p' => 'compactPolicy'),
-
'p3p_policyLocation' => array('p3p' => 'policyLocation')
-
);
-
// OpenX Server Access Paths
-
$aElements += array(
-
'webpath_admin' => array(
-
'webpath' => 'admin',
-
'preg_match' => '#/$#',
-
'preg_replace' => ''
-
),
-
'webpath_delivery' => array(
-
'webpath' => 'delivery',
-
'preg_match' => '#/$#',
-
'preg_replace' => ''
-
),
-
'webpath_deliverySSL' => array(
-
'webpath' => 'deliverySSL',
-
'preg_match' => '#/$#',
-
'preg_replace' => ''
-
),
-
'webpath_images' => array(
-
'webpath' => 'images',
-
'preg_match' => '#/$#',
-
'preg_replace' => ''
-
),
-
'webpath_imagesSSL' => array(
-
'webpath' => 'imagesSSL',
-
'preg_match' => '#/$#',
-
'preg_replace' => ''
-
)
-
);
-
// Delivery File Names
-
$aElements += array(
-
'file_click' => array('file' => 'click'),
-
'file_conversionvars' => array('file' => 'conversionvars'),
-
'file_content' => array('file' => 'content'),
-
'file_conversion' => array('file' => 'conversion'),
-
'file_conversionjs' => array('file' => 'conversionjs'),
-
'file_frame' => array('file' => 'frame'),
-
'file_image' => array('file' => 'image'),
-
'file_js' => array('file' => 'js'),
-
'file_layer' => array('file' => 'layer'),
-
'file_log' => array('file' => 'log'),
-
'file_popup' => array('file' => 'popup'),
-
'file_view' => array('file' => 'view'),
-
'file_xmlrpc' => array('file' => 'xmlrpc'),
-
'file_local' => array('file' => 'local'),
-
'file_frontcontroller' => array('file' => 'frontcontroller'),
-
'file_flash' => array('file' => 'flash')
-
);
-
// Test the suitability of the cache store type, if required
-
MAX_commonRegisterGlobalsArray(array('delivery_cacheStorePlugin'));
-
if (isset($delivery_cacheStorePlugin)) {
-
// Check for problems in selected delivery store plugin
-
$oDeliveryCacheStore = &OX_Component::factoryByComponentIdentifier($delivery_cacheStorePlugin);
-
$result = $oDeliveryCacheStore->getStatus();
-
if ($result !== true) {
-
$aErrormessage[1][] = $oTranslation->translate(
-
'ErrorInCacheStorePlugin',
-
array($oDeliveryCacheStore->getName())
-
);
-
foreach ($result as $error) {
-
$aErrormessage[1][] = " – ".$error;
-
}
-
}
-
}
-
if (empty($aErrormessage)) {
-
// Create a new settings object, and save the settings!
-
$oSettings = new OA_Admin_Settings();
-
$result = $oSettings->processSettingsFromForm($aElements);
-
if ($result) {
-
// Queue confirmation message
-
$setPref = $oOptions->getSettingsPreferences($prefSection);
-
$title = $setPref[$prefSection]['name'];
-
$translation = new OX_Translation ();
-
$translated_message = $translation->translate($GLOBALS['strXSettingsHaveBeenUpdated'],
-
array(htmlspecialchars($title)));
-
OA_Admin_UI::queueMessage($translated_message, 'local', 'confirm', 0);
-
-
// The settings configuration file was written correctly,
-
// go to the "next" settings page from here
-
OX_Admin_Redirect::redirect(basename($_SERVER['SCRIPT_NAME']));
-
}
-
// Could not write the settings configuration file, store this
-
// error message and continue
-
$aErrormessage[0][] = $strUnableToWriteConfig;
-
-
}
-
}
-
-
// Set the correct section of the settings pages and display the drop-down menu
-
$setPref = $oOptions->getSettingsPreferences($prefSection);
-
$title = $setPref[$prefSection]['name'];
-
-
// Display the settings page's header and sections
-
$oHeaderModel = new OA_Admin_UI_Model_PageHeaderModel($title);
-
phpAds_PageHeader('account-settings-index', $oHeaderModel);
-
-
// This page depends on deliveryCacheStore plugins, so use the plugin
-
// information from earlier to generate the elements for the plugins
-
// which is required in the next section
-
-
$aCacheStoresSelect = array();
-
foreach ($aDeliveryCacheStores as $pluginKey => $oCacheStore) {
-
$aCacheStoresSelect[$oCacheStore->getComponentIdentifier()] = $oCacheStore->getName();
-
}
-
-
$aDeliveryCacheSettings = array (
-
array (
-
'type' => 'text',
-
'name' => 'delivery_cacheExpire',
-
'text' => $strDeliveryCacheLimit,
-
'check' => 'wholeNumber'
-
),
-
array (
-
'type' => 'break'
-
),
-
array (
-
'type' => 'select',
-
'name' => 'delivery_cacheStorePlugin',
-
'text' => $strDeliveryCacheStore,
-
'items' => $aCacheStoresSelect
-
)
-
);
-
-
// This page depends on 3rdPartyServers plugins, so use the plugin
-
// information from earlier to generate the elements for the plugins
-
// which is required in the next section
-
$availableOutputAdServerNames = array();
-
foreach ($a3rdPartyServers as $pluginKey => $outputAdServer) {
-
if ($outputAdServer->hasOutputMacros) {
-
$availableOutputAdServers[$pluginKey] = $outputAdServer;
-
$availableOutputAdServerNames[$pluginKey] = $outputAdServer->getName();
-
}
-
}
-
asort($availableOutputAdServerNames);
-
$availableOutputAdServerNames = $availableOutputAdServerNames = array(
-
0 => $GLOBALS['strNo'],
-
'generic' => $GLOBALS['strGenericOutputAdServer']
-
) + $availableOutputAdServerNames;
-
-
// Prepare an array of HTML elements to display for the form, and
-
// output using the $oOption object
-
$aSettings = array(
-
array (
-
'text' => $strDeliveryCaching,
-
'items' => $aDeliveryCacheSettings
-
),
-
array (
-
'text' => $strBannerDelivery,
-
'items' => array (
-
array (
-
'type' => 'checkbox',
-
'name' => 'delivery_acls',
-
'text' => $strDeliveryAcls
-
),
-
array (
-
'type' => 'checkbox',
-
'name' => 'delivery_aclsDirectSelection',
-
'text' => $strDeliveryAclsDirectSelection
-
),
-
array (
-
'type' => 'break'
-
),
-
array (
-
'type' => 'checkbox',
-
'name' => 'delivery_obfuscate',
-
'text' => $strDeliveryObfuscate
-
),
-
array (
-
'type' => 'break'
-
),
-
array (
-
'type' => 'checkbox',
-
'name' => 'delivery_execPhp',
-
'text' => $strDeliveryExecPhp
-
),
-
array (
-
'type' => 'break'
-
),
-
array (
-
'type' => 'text',
-
'name' => 'delivery_ctDelimiter',
-
'text' => $strDeliveryCtDelimiter
-
),
-
array (
-
'type' => 'break'
-
),
-
array (
-
'type' => 'text',
-
'name' => 'defaultBanner_imageUrl',
-
'text' => $strGlobalDefaultBannerUrl,
-
'check' => 'url'
-
)
-
)
-
),
-
array (
-
'text' => $strInvocationDefaults,
-
'items' => array (
-
array(
-
'type' => 'select',
-
'name' => 'delivery_clicktracking',
-
'text' => $strEnable3rdPartyTrackingByDefault,
-
'items' => $availableOutputAdServerNames
-
)
-
)
-
),
-
array (
-
'text' => $strP3PSettings,
-
'items' => array (
-
array (
-
'type' => 'checkbox',
-
'name' => 'p3p_policies',
-
'text' => $strUseP3P
-
),
-
array (
-
'type' => 'break'
-
),
-
array (
-
'type' => 'text',
-
'name' => 'p3p_compactPolicy',
-
'text' => $strP3PCompactPolicy,
-
'size' => 35,
-
'depends' => 'p3p_policies==true'
-
),
-
array (
-
'type' => 'break'
-
),
-
array (
-
'type' => 'text',
-
'name' => 'p3p_policyLocation',
-
'text' => $strP3PPolicyLocation,
-
'size' => 35,
-
'depends' => 'p3p_policies==true',
-
'check' => 'url'
-
)
-
)
-
),
-
array (
-
'text' => $strWebPath,
-
'items' => array (
-
array (
-
'type' => 'url',
-
'name' => 'webpath_admin',
-
'text' => $strAdminUrlPrefix,
-
'size' => 35
-
),
-
array (
-
'type' => 'break'
-
),
-
array (
-
'type' => 'urln',
-
'name' => 'webpath_delivery',
-
'text' => $strDeliveryUrlPrefix,
-
'size' => 35
-
),
-
array (
-
'type' => 'break'
-
),
-
array (
-
'type' => 'urls',
-
'name' => 'webpath_deliverySSL',
-
'text' => $strDeliveryUrlPrefixSSL,
-
'size' => 35
-
),
-
array (
-
'type' => 'break'
-
),
-
array (
-
'type' => 'urln',
-
'name' => 'webpath_images',
-
'text' => $strImagesUrlPrefix,
-
'size' => 35
-
),
-
array (
-
'type' => 'break'
-
),
-
array (
-
'type' => 'urls',
-
'name' => 'webpath_imagesSSL',
-
'text' => $strImagesUrlPrefixSSL,
-
'size' => 35
-
)
-
)
-
),
-
array (
-
'text' => $strDeliveryFilenames,
-
'items' => array (
-
array (
-
'type' => 'text',
-
'name' => 'file_click',
-
'text' => $strDeliveryFilenamesAdClick,
-
'req' => true
-
),
-
array (
-
'type' => 'break'
-
),
-
array (
-
'type' => 'text',
-
'name' => 'file_conversionvars',
-
'text' => $strDeliveryFilenamesAdConversionVars,
-
'req' => true
-
),
-
array (
-
'type' => 'break'
-
),
-
array (
-
'type' => 'text',
-
'name' => 'file_content',
-
'text' => $strDeliveryFilenamesAdContent,
-
'req' => true
-
),
-
array (
-
'type' => 'break'
-
),
-
array (
-
'type' => 'text',
-
'name' => 'file_conversion',
-
'text' => $strDeliveryFilenamesAdConversion,
-
'req' => true
-
),
-
array (
-
'type' => 'break'
-
),
-
array (
-
'type' => 'text',
-
'name' => 'file_conversionjs',
-
'text' => $strDeliveryFilenamesAdConversionJS,
-
'req' => true
-
),
-
array (
-
'type' => 'break'
-
),
-
array (
-
'type' => 'text',
-
'name' => 'file_frame',
-
'text' => $strDeliveryFilenamesAdFrame,
-
'req' => true
-
),
-
array (
-
'type' => 'break'
-
),
-
array (
-
'type' => 'text',
-
'name' => 'file_image',
-
'text' => $strDeliveryFilenamesAdImage,
-
'req' => true
-
),
-
array (
-
'type' => 'break'
-
),
-
array (
-
'type' => 'text',
-
'name' => 'file_js',
-
'text' => $strDeliveryFilenamesAdJS,
-
'req' => true
-
),
-
array (
-
'type' => 'break'
-
),
-
array (
-
'type' => 'text',
-
'name' => 'file_layer',
-
'text' => $strDeliveryFilenamesAdLayer,
-
'req' => true
-
),
-
array (
-
'type' => 'break'
-
),
-
array (
-
'type' => 'text',
-
'name' => 'file_log',
-
'text' => $strDeliveryFilenamesAdLog,
-
'req' => true
-
),
-
array (
-
'type' => 'break'
-
),
-
array (
-
'type' => 'text',
-
'name' => 'file_popup',
-
'text' => $strDeliveryFilenamesAdPopup,
-
'req' => true
-
),
-
array (
-
'type' => 'break'
-
),
-
array (
-
'type' => 'text',
-
'name' => 'file_view',
-
'text' => $strDeliveryFilenamesAdView,
-
'req' => true
-
),
-
array (
-
'type' => 'break'
-
),
-
array (
-
'type' => 'text',
-
'name' => 'file_xmlrpc',
-
'text' => $strDeliveryFilenamesXMLRPC,
-
'req' => true
-
),
-
array (
-
'type' => 'break'
-
),
-
array (
-
'type' => 'text',
-
'name' => 'file_local',
-
'text' => $strDeliveryFilenamesLocal,
-
'req' => true
-
),
-
array (
-
'type' => 'break'
-
),
-
array (
-
'type' => 'text',
-
'name' => 'file_frontcontroller',
-
'text' => $strDeliveryFilenamesFrontController,
-
'req' => true
-
),
-
array (
-
'type' => 'break'
-
),
-
array (
-
'type' => 'text',
-
'name' => 'file_flash',
-
'text' => $strDeliveryFilenamesFlash,
-
'req' => true
-
)
-
)
-
)
-
);
-
$oOptions->show($aSettings, $aErrormessage);
-
-
// Display the page footer
-
phpAds_PageFooter();
-
-
?>
And go to OpenX/www/admin/lib-maintenance.inc.php and update the file code with below
-
< ?php
-
-
/*
-
+—————————————————————————+
-
| OpenX v2.8 |
-
| ========== |
-
| |
-
| Copyright (c) 2003-2009 OpenX Limited |
-
| For contact details, see: http://www.openx.org/ |
-
| |
-
| This program is free software; you can redistribute it and/or modify |
-
| it under the terms of the GNU General Public License as published by |
-
| the Free Software Foundation; either version 2 of the License, or |
-
| (at your option) any later version. |
-
| |
-
| This program is distributed in the hope that it will be useful, |
-
| but WITHOUT ANY WARRANTY; without even the implied warranty of |
-
| MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
-
| GNU General Public License for more details. |
-
| |
-
| You should have received a copy of the GNU General Public License |
-
| along with this program; if not, write to the Free Software |
-
| Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA |
-
+—————————————————————————+
-
$Id: lib-maintenance.inc.php 62345 2010-09-14 21:16:38Z chris.nutting $
-
*/
-
-
// Required files
-
require_once MAX_PATH . '/lib/max/language/Loader.php';
-
-
// Load the required language files
-
Language_Loader::load('maintenance');
-
-
function phpAds_MaintenanceSelection($subSection, $mainSection='maintenance')
-
{
-
global
-
$phpAds_TextDirection
-
,$strBanners
-
,$strCache
-
,$strChooseSection
-
,$strPriority
-
,$strSourceEdit
-
,$strStats
-
,$strStorage
-
,$strMaintenance
-
,$strCheckForUpdates
-
,$strViewPastUpdates
-
,$strEncoding
-
,$strDeliveryLimitations
-
,$strAppendCodes
-
,$strMenus
-
,$strPlugins
-
;
-
-
?>
-
<script language="JavaScript">
-
<!–
-
function maintenance_goto_section()
-
{
-
s = document.maintenance_selection.section.selectedIndex;
-
-
s = document.maintenance_selection.section.options[s].value;
-
document.location = '<?php echo $mainSection; ?>-' + s + '.php';
-
}
-
// –>
-
</script>
-
< ?php
-
$conf =& $GLOBALS['_MAX']['CONF'];
-
$pref =& $GLOBALS['_MAX']['PREF'];
-
-
echo "<table border='0' width='100%' cellpadding='0' cellspacing='0'>";
-
echo "<tr><form name='maintenance_selection'><td height='35'>";
-
echo "<b>".$strChooseSection.": </b>";
-
echo "<select name='section' onChange='maintenance_goto_section();'>";
-
-
if (OA_Permission::isAccount(OA_ACCOUNT_ADMIN)) {
-
if ($mainSection == 'updates') {
-
echo "<option value='product'".($subSection == 'product' ? ' selected' : '').">".$strCheckForUpdates."</option>";
-
echo "<option value='history'".($subSection == 'history' ? ' selected' : '').">".$strViewPastUpdates."</option>";
-
} else {
-
echo "<option value='maintenance'".($subSection == 'maintenance' ? ' selected' : '').">".$strMaintenance."</option>";
-
echo "<option value='banners'".($subSection == 'banners' ? ' selected' : '').">".$strBanners."</option>";
-
echo "<option value='priority'".($subSection == 'priority' ? ' selected' : '').">".$strPriority."</option>";
-
-
$login = 'ftp://' . $conf['store']['ftpUsername'] . ':' . $conf['store']['ftpPassword'] . '@' .
-
$conf['store']['ftpHost'] . '/' . $conf['store']['ftpPath'];
-
if ($conf['allowedBanners']['web'] == true && (($conf['store']['mode'] == 0 &&
-
$conf['store']['webDir'] != '') || ($conf['store']['mode'] == 1 &&
-
$login != '')) && $conf['webpath']['images'] != '')
-
echo "<option value='storage'".($subSection == 'storage' ? ' selected' : '').">".$strStorage."</option>";
-
-
// if (!isset($conf['delivery']['cache']) || $conf['delivery']['cache'] != 'none')
-
// echo "<option value='cache'".($subSection == 'zones' ? ' selected' : '').">".$strCache."</option>";
-
-
if ($conf['delivery']['acls']) {
-
echo "<option value='acls'".($subSection == 'acls' ? ' selected' : '').">".$strDeliveryLimitations."</option>";
-
}
-
-
echo "<option value='appendcodes'".($subSection == 'appendcodes' ? ' selected' : '').">".$strAppendCodes."</option>";
-
echo "<option value='encoding'".($subSection == 'encoding' ? ' selected' : '').">$strEncoding</option>";
-
echo "<option value='menus'".($subSection == 'menus' ? ' selected' : '').">".$strMenus."</option>";
-
echo "<option value='plugins'".($subSection == 'plugins' ? ' selected' : '').">".$strPlugins."</option>";
-
}
-
}
-
-
// Switched off
-
// echo "<option value='finance'".($subSection == 'finance' ? ' selected' : '').">Finance</option>";
-
-
echo "</select> <a href='javascript:void(0)' onClick='maintenance_goto_section();'>";
-
echo "<img src='" . OX::assetPath() . "/images/".$phpAds_TextDirection."/go_blue.gif' border='0'/></a>";
-
echo "</td></form></tr>";
-
echo "";
-
-
phpAds_ShowBreak();
-
}
-
-
?>
Congratulations you’re done and you can now run your site، please let me know if you need any hep.
![economic-crisis[1]](http://waseemsite.com/wp-content/uploads/2012/06/economic-crisis1-300x280.jpg)




