= 5); define('W3TC_WIN', (strtoupper(substr(PHP_OS, 0, 3)) === 'WIN')); define('W3TC_EMAIL', 'w3tc@w3-edge.com'); define('W3TC_FEED_URL', 'http://feeds.feedburner.com/W3TOTALCACHE'); define('W3TC_FEED_ITEMS', 3); define('W3TC_README_URL', 'http://plugins.trac.wordpress.org/browser/w3-total-cache/trunk/readme.txt?format=txt'); define('W3TC_TWITTER_STATUS', 'I just optimized my #wordpress blog\'s #performance using the W3 Total Cache #plugin by @w3edge. Check it out! http://j.mp/A69xX'); define('W3TC_SUPPORT_US_TIMEOUT', 2592000); /** * W3 activate error * * @param string $error * @return void */ function w3_activate_error($error) { $active_plugins = (array) get_option('active_plugins'); $key = array_search(W3TC_FILE, $active_plugins); if ($key !== false) { do_action('deactivate_plugin', W3TC_FILE); array_splice($active_plugins, $key, 1); do_action('deactivate_' . W3TC_FILE); do_action('deactivated_plugin', W3TC_FILE); update_option('active_plugins', $active_plugins); } else { do_action('deactivate_' . W3TC_FILE); } include W3TC_DIR . '/inc/error.phtml'; exit(); } /** * W3 writable error * * @param string $path * @return string */ function w3_writable_error($path) { $activate_url = wp_nonce_url('plugins.php?action=activate&plugin=' . W3TC_FILE, 'activate-plugin_' . W3TC_FILE); $reactivate_button = sprintf('', addslashes($activate_url)); if (w3_check_open_basedir($path)) { if (file_exists($path)) { $error = sprintf('%s is not write-able, please run following command:
chmod 777 %s
then %s.', $path, $path, $reactivate_button); } else { $error = sprintf('%s could not be created, please run following command:
chmod 777 %s
then %s.', $path, dirname($path), $reactivate_button); } } else { $error = sprintf('%s could not be created, open_basedir restriction in effect, please check your php.ini settings:
open_basedir = "%s"
then %s.', $path, ini_get('open_basedir'), $reactivate_button); } w3_activate_error($error); } /** * Returns current microtime * * @return float */ function w3_microtime() { list ($usec, $sec) = explode(" ", microtime()); return ((float) $usec + (float) $sec); } /** * Check if URL is valid * * @param string $url * @return boolean */ function w3_is_url($url) { return preg_match('~^https?://~', $url); } /** * Decodes gzip-encoded string * * @param string $data * @return string */ function w3_gzdecode($data) { $flags = ord(substr($data, 3, 1)); $headerlen = 10; $extralen = 0; if ($flags & 4) { $extralen = unpack('v', substr($data, 10, 2)); $extralen = $extralen[1]; $headerlen += 2 + $extralen; } if ($flags & 8) { $headerlen = strpos($data, chr(0), $headerlen) + 1; } if ($flags & 16) { $headerlen = strpos($data, chr(0), $headerlen) + 1; } if ($flags & 2) { $headerlen += 2; } $unpacked = gzinflate(substr($data, $headerlen)); if ($unpacked === FALSE) { $unpacked = $data; } return $unpacked; } /** * Recursive creates directory * * @param string $path * @param integer $mask * @param string * @return boolean */ function w3_mkdir($path, $mask = 0755, $curr_path = '') { $path = preg_replace('~[\\\/]+~', '/', $path); $path = trim($path, '/'); $dirs = explode('/', $path); foreach ($dirs as $dir) { if (empty($dir)) { return false; } $curr_path .= ($curr_path == '' ? '' : '/') . $dir; if (! is_dir($curr_path)) { if (@mkdir($curr_path, $mask)) { @chmod($curr_path, $mask); } else { return false; } } } return true; } /** * Recursive remove dir * * @param string $path * @param array $exclude * @return void */ function w3_rmdir($path, $exclude = array(), $remove = true) { $dir = @opendir($path); if ($dir) { while (($entry = @readdir($dir))) { $full_path = $path . '/' . $entry; if ($entry != '.' && $entry != '..' && ! in_array($full_path, $exclude)) { if (is_dir($full_path)) { w3_rmdir($full_path, $exclude); } else { @unlink($full_path); } } } @closedir($dir); if ($remove) { @rmdir($path); } } } /** * Recursive empty dir * * @param string $path * @param array $exclude * @return void */ function w3_emptydir($path, $exclude = array()) { w3_rmdir($path, $exclude, false); } /** * Check if content is HTML or XML * * @param string $content * @return boolean */ function w3_is_xml($content) { return (stristr($content, ' $value) { $count--; $query .= urlencode($param) . (! empty($value) ? '=' . urlencode($value) : '') . ($count ? '&' : ''); } $url .= (strpos($url, '?') === false ? '?' : '&') . $query; } if ($fragment != '') { $url .= $fragment; } @header('Location: ' . $url); exit(); } /** * Returns caching engine name * * @param $engine * @return string */ function w3_get_engine_name($engine) { switch ($engine) { case 'memcached': $engine_name = 'memcached'; break; case 'apc': $engine_name = 'apc'; break; case 'file': $engine_name = 'disk'; break; case 'file_pgcache': $engine_name = 'disk (enhanced)'; break; default: $engine_name = 'N/A'; break; } return $engine_name; } /** * Converts value to boolean * * @param mixed $value * @return boolean */ function w3_to_boolean($value) { if (is_string($value)) { switch (strtolower($value)) { case '+': case '1': case 'y': case 'on': case 'yes': case 'true': case 'enabled': return true; case '-': case '0': case 'n': case 'no': case 'off': case 'false': case 'disabled': return false; } } return (boolean) $value; } /** * Request URL * * @param string $method * @param string $url * @param string $data * @param string $auth * @return string */ function w3_url_request($method, $url, $data = '', $auth = '') { $method = strtoupper($method); if (function_exists('curl_init')) { $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_USERAGENT, W3TC_POWERED_BY); if ($method == 'POST') { curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_POSTFIELDS, $data); } if (! empty($auth)) { curl_setopt($ch, CURLOPT_USERPWD, $auth); } $contents = curl_exec($ch); curl_close($ch); return $contents; } else { $parse_url = @parse_url($url); if ($parse_url && isset($parse_url['host'])) { $host = $parse_url['host']; $port = (isset($parse_url['port']) ? (int) $parse_url['port'] : 80); $path = (! empty($parse_url['path']) ? $parse_url['path'] : '/'); $query = (isset($parse_url['query']) ? $parse_url['query'] : ''); $request_uri = $path . ($query != '' ? '?' . $query : ''); $headers = array( sprintf('%s %s HTTP/1.1', $method, $request_uri), sprintf('Host: %s', $host), sprintf('User-Agent: %s', W3TC_POWERED_BY), 'Connection: close' ); if (! empty($data)) { $headers[] = sprintf('Content-Length: %d', strlen($data)); } if (! empty($auth)) { $headers[] = sprintf('Authorization: Basic %s', base64_encode($auth)); } $request = implode("\r\n", $headers) . "\r\n\r\n" . $data; if (($fp = @fsockopen($host, $port))) { $response = ''; @fputs($fp, $request); while (! @feof($fp)) { $response .= @fgets($fp, 4096); } @fclose($fp); list (, $contents) = explode("\r\n\r\n", $response, 2); return $contents; } } } } /** * Download url via GET * * @param $url * @return string */ function w3_url_get($url) { return w3_url_request('GET', $url); } /** * Send POST request to URL * * @param string $url * @param string $data * @param string $auth * @return string */ function w3_url_post($url, $data = '', $auth = '') { return w3_url_request('POST', $url, $data, $auth); } /** * Loads plugins * * @return void */ function w3_load_plugins() { $dir = @opendir(W3TC_PLUGINS_DIR); if ($dir) { while (($entry = @readdir($dir))) { if (strrchr($entry, '.') === '.php') { require_once W3TC_PLUGINS_DIR . '/' . $entry; } } @closedir($dir); } } /** * Returns true if current connection is secure * * @return boolean */ function w3_is_https() { switch (true) { case (isset($_SERVER['HTTPS']) && w3_to_boolean($_SERVER['HTTPS'])): case (isset($_SERVER['SERVER_PORT']) && (int) $_SERVER['SERVER_PORT'] == 443): return true; } return false; } /** * Returns realpath of given path * * @param string $path */ function w3_realpath($path) { $path = preg_replace('~[/\\\]+~', '/', $path); $parts = explode('/', $path); $absolutes = array(); foreach ($parts as $part) { if ('.' == $part) { continue; } if ('..' == $part) { array_pop($absolutes); } else { $absolutes[] = $part; } } return implode('/', $absolutes); } /** * Returns open basedirs * * @return array */ function w3_get_open_basedirs() { $open_basedir_ini = ini_get('open_basedir'); $open_basedirs = (W3TC_WIN ? preg_split('~[;,]~', $open_basedir_ini) : explode(':', $open_basedir_ini)); $result = array(); foreach ($open_basedirs as $open_basedir) { $open_basedir = trim($open_basedir); if ($open_basedir != '') { $result[] = w3_realpath($open_basedir); } } return $result; } /** * Checks if path is restricted by open_basedir * * @param string $path * @return boolean */ function w3_check_open_basedir($path) { $path = w3_realpath($path); $open_basedirs = w3_get_open_basedirs(); if (! count($open_basedirs)) { return true; } foreach ($open_basedirs as $open_basedir) { if (strstr($path, $open_basedir) !== false) { return true; } } return false; } /** * Returns PHP info * * @return array */ function w3_phpinfo() { ob_start(); phpinfo(); $phpinfo = ob_get_clean(); $phpinfo = preg_replace(array( '#^.*(.*).*$#ms', '#

PHP License

.*$#ms', '#

Configuration

#', "#\r?\n#", "##", '# +<#', "#[ \t]+#", '# #', '# +#', '# class=".*?"#', '%'%', '#(?:.*?)" src="(?:.*?)=(.*?)" alt="PHP Logo" />' . '

PHP Version (.*?)

(?:\n+?)#', '#

PHP Credits

#', '#(?:.*?)" src="(?:.*?)=(.*?)"(?:.*?)Zend Engine (.*?),(?:.*?)#', "# +#", '##', '##' ), array( '$1', '', '', '', '' . "\n", '<', ' ', ' ', ' ', '', ' ', '

PHP Configuration

' . "\n" . 'PHP Version$2' . "\n" . 'PHP Egg$1', 'PHP Credits Egg$1', 'Zend Engine$2' . "\n" . 'Zend Egg$1', ' ', '%S%', '%E%' ), $phpinfo); $sections = explode('

', strip_tags($phpinfo, '

')); $pi = array(); foreach ($sections as $section) { $n = substr($section, 0, strpos($section, '

')); $askapache = null; if (preg_match_all('#%S%(?:(.*?))?(?:(.*?))?(?:(.*?))?%E%#', $section, $askapache, PREG_SET_ORDER)) { foreach ($askapache as $m) { $pi[$n][$m[1]] = (! isset($m[3]) || $m[2] == $m[3]) ? $m[2] : array_slice($m, 2); } } } return $pi; } /** * Returns file mime type * * @param string $file * @return string */ function w3_get_mime_type($file) { $mime_types = array( 'jpg|jpeg|jpe' => 'image/jpeg', 'gif' => 'image/gif', 'png' => 'image/png', 'bmp' => 'image/bmp', 'tif|tiff' => 'image/tiff', 'ico' => 'image/x-icon', 'asf|asx|wax|wmv|wmx' => 'video/asf', 'avi' => 'video/avi', 'divx' => 'video/divx', 'mov|qt' => 'video/quicktime', 'mpeg|mpg|mpe' => 'video/mpeg', 'txt|c|cc|h' => 'text/plain', 'svg' => 'image/svg+xml', 'rtx' => 'text/richtext', 'css' => 'text/css', 'xsl|xsd|xml' => 'text/xml', 'htm|html' => 'text/html', 'mp3|m4a' => 'audio/mpeg', 'mp4|m4v' => 'video/mp4', 'ra|ram' => 'audio/x-realaudio', 'wav' => 'audio/wav', 'ogg' => 'audio/ogg', 'mid|midi' => 'audio/midi', 'wma' => 'audio/wma', 'rtf' => 'application/rtf', 'js' => 'application/x-javascript', 'pdf' => 'application/pdf', 'doc|docx' => 'application/msword', 'pot|pps|ppt|pptx' => 'application/vnd.ms-powerpoint', 'wri' => 'application/vnd.ms-write', 'xla|xls|xlsx|xlt|xlw' => 'application/vnd.ms-excel', 'mdb' => 'application/vnd.ms-access', 'mpp' => 'application/vnd.ms-project', 'swf' => 'application/x-shockwave-flash', 'class' => 'application/java', 'tar' => 'application/x-tar', 'zip' => 'application/zip', 'gz|gzip' => 'application/x-gzip', 'exe' => 'application/x-msdownload', 'odt' => 'application/vnd.oasis.opendocument.text', 'odp' => 'application/vnd.oasis.opendocument.presentation', 'ods' => 'application/vnd.oasis.opendocument.spreadsheet', 'odg' => 'application/vnd.oasis.opendocument.graphics', 'odc' => 'application/vnd.oasis.opendocument.chart', 'odb' => 'application/vnd.oasis.opendocument.database', 'odf' => 'application/vnd.oasis.opendocument.formula' ); $file_ext = strrchr($file, '.'); if ($file_ext) { $file_ext = ltrim($file_ext, '.'); foreach ($mime_types as $extension => $mime_type) { $exts = explode('|', $extension); foreach ($exts as $ext) { if ($file_ext == $ext) { return $mime_type; } } } } return false; } /** * Send twitter update status request * * @param string $username * @param string $password * @param string $status * @param string $error * @return string */ function w3_twitter_status_update($username, $password, $status, &$error) { $data = sprintf('status=%s', urlencode($status)); $auth = sprintf('%s:%s', $username, $password); $xml = w3_url_post('http://twitter.com/statuses/update.xml', $data, $auth); if ($xml) { $matches = null; if (preg_match('~(\d+)~', $xml, $matches)) { return $matches[1]; } elseif (preg_match('~([^<]+)~', $xml, $matches)) { $error = $matches[1]; } else { $error = 'Unknown error.'; } } else { $error = 'Unable to send request.'; } return false; } /** * Quotes regular expression string * * @param string $regexp * @return string */ function w3_preg_quote($string, $delimiter = null) { $string = preg_quote($string, $delimiter); $string = strtr($string, array( ' ' => '\ ' )); return $string; } /** * Normalize file path * * @param string $file * @return string */ function w3_normalize_file($file) { $site_url_regexp = '~' . w3_get_site_url_regexp() . '~i'; $file = preg_replace($site_url_regexp, '', $file); $file = ltrim($file, '/\\'); return $file; } /** * Returns true if zlib output compression is enabled otherwise false * * @return boolean */ function w3_zlib_output_compression() { return w3_to_boolean(ini_get('zlib.output_compression')); } /** * Recursive strips slahes from the var * * @param mixed $var * @return mixed */ function w3_stripslashes($var) { if (is_string($var)) { return stripslashes($var); } elseif (is_array($var)) { $var = array_map('w3_stripslashes', $var); } return $var; } /** * Send powered by header */ function w3_send_x_powered_by() { switch (true) { case defined('DOING_AJAX'): case defined('DOING_CRON'): case defined('APP_REQUEST'): case defined('XMLRPC_REQUEST'): case defined('WP_ADMIN'): return; } @header('X-Powered-By: ' . W3TC_POWERED_BY); } w3_send_x_powered_by();