1f62ea8a1Sandi<?php 2f62ea8a1Sandi/** 3f62ea8a1Sandi * DokuWiki media passthrough file 4f62ea8a1Sandi * 5f62ea8a1Sandi * @license GPL 2 (http://www.gnu.org/licenses/gpl.html) 6f62ea8a1Sandi * @author Andreas Gohr <andi@splitbrain.org> 7f62ea8a1Sandi */ 8f62ea8a1Sandi 9b1a72e3dSmatthiasgrimm if(!defined('DOKU_INC')) define('DOKU_INC',realpath(dirname(__FILE__).'/../../').'/'); 10f62ea8a1Sandi require_once(DOKU_INC.'inc/init.php'); 11f62ea8a1Sandi require_once(DOKU_INC.'inc/common.php'); 12f62ea8a1Sandi require_once(DOKU_INC.'inc/pageutils.php'); 13f62ea8a1Sandi require_once(DOKU_INC.'inc/confutils.php'); 14f62ea8a1Sandi require_once(DOKU_INC.'inc/auth.php'); 158746e727Sandi //close sesseion 168746e727Sandi session_write_close(); 17*e935fb4aSAndreas Gohr if(!defined('CHUNK_SIZE')) define('CHUNK_SIZE',16*1024); 188746e727Sandi 19f62ea8a1Sandi $mimetypes = getMimeTypes(); 20f62ea8a1Sandi 21f62ea8a1Sandi //get input 2242905504SAndreas Gohr $MEDIA = getID('media',false); // no cleaning - maybe external 23f62ea8a1Sandi $CACHE = calc_cache($_REQUEST['cache']); 24f62ea8a1Sandi $WIDTH = $_REQUEST['w']; 25f62ea8a1Sandi $HEIGHT = $_REQUEST['h']; 26f62ea8a1Sandi list($EXT,$MIME) = mimetype($MEDIA); 27f62ea8a1Sandi if($EXT === false){ 28f62ea8a1Sandi $EXT = 'unknown'; 29f62ea8a1Sandi $MIME = 'application/octet-stream'; 30f62ea8a1Sandi } 31f62ea8a1Sandi 32f62ea8a1Sandi //media to local file 33f62ea8a1Sandi if(preg_match('#^(https?|ftp)://#i',$MEDIA)){ 34f62ea8a1Sandi //handle external media 35f62ea8a1Sandi $FILE = get_from_URL($MEDIA,$EXT,$CACHE); 36f62ea8a1Sandi if(!$FILE){ 37f62ea8a1Sandi //download failed - redirect to original URL 38f62ea8a1Sandi header('Location: '.$MEDIA); 39f62ea8a1Sandi exit; 40f62ea8a1Sandi } 41f62ea8a1Sandi }else{ 42f62ea8a1Sandi $MEDIA = cleanID($MEDIA); 43f62ea8a1Sandi if(empty($MEDIA)){ 44f62ea8a1Sandi header("HTTP/1.0 400 Bad Request"); 45f62ea8a1Sandi print 'Bad request'; 46f62ea8a1Sandi exit; 47f62ea8a1Sandi } 48f62ea8a1Sandi 49f62ea8a1Sandi //check permissions (namespace only) 50f62ea8a1Sandi if(auth_quickaclcheck(getNS($MEDIA).':X') < AUTH_READ){ 51f62ea8a1Sandi header("HTTP/1.0 401 Unauthorized"); 52f62ea8a1Sandi //fixme add some image for imagefiles 53f62ea8a1Sandi print 'Unauthorized'; 54f62ea8a1Sandi exit; 55f62ea8a1Sandi } 56f62ea8a1Sandi $FILE = mediaFN($MEDIA); 57f62ea8a1Sandi } 58f62ea8a1Sandi 59f62ea8a1Sandi //check file existance 60f62ea8a1Sandi if(!@file_exists($FILE)){ 61f62ea8a1Sandi header("HTTP/1.0 404 Not Found"); 62f62ea8a1Sandi //FIXME add some default broken image 63f62ea8a1Sandi print 'Not Found'; 64f62ea8a1Sandi exit; 65f62ea8a1Sandi } 66f62ea8a1Sandi 67f62ea8a1Sandi //handle image resizing 68f62ea8a1Sandi if((substr($MIME,0,5) == 'image') && $WIDTH){ 69f62ea8a1Sandi $FILE = get_resized($FILE,$EXT,$WIDTH,$HEIGHT); 70f62ea8a1Sandi } 71f62ea8a1Sandi 72*e935fb4aSAndreas Gohr // finally send the file to the client 73*e935fb4aSAndreas Gohr sendFile($FILE,$MIME); 74f62ea8a1Sandi 75*e935fb4aSAndreas Gohr/* ------------------------------------------------------------------------ */ 76f62ea8a1Sandi 77*e935fb4aSAndreas Gohr/** 78*e935fb4aSAndreas Gohr * Set headers and send the file to the client 79*e935fb4aSAndreas Gohr * 80*e935fb4aSAndreas Gohr * @author Andreas Gohr <andi@splitbrain.org> 81*e935fb4aSAndreas Gohr */ 82*e935fb4aSAndreas Gohrfunction sendFile($file,$mime){ 83*e935fb4aSAndreas Gohr // send headers 84*e935fb4aSAndreas Gohr header("Content-Type: $mime"); 85*e935fb4aSAndreas Gohr http_conditionalRequest(filemtime($file)); 86*e935fb4aSAndreas Gohr list($start,$len) = http_rangeRequest(filesize($file)); 87*e935fb4aSAndreas Gohr header('Cache-Control: must-revalidate, post-check=0, pre-check=0'); 88*e935fb4aSAndreas Gohr header('Pragma: public'); 89*e935fb4aSAndreas Gohr header('Accept-Ranges: bytes'); 90f62ea8a1Sandi 91f62ea8a1Sandi //application mime type is downloadable 92*e935fb4aSAndreas Gohr if(substr($mime,0,11) == 'application'){ 93*e935fb4aSAndreas Gohr header('Content-Disposition: attachment; filename="'.basename($file).'";'); 94f62ea8a1Sandi } 95f62ea8a1Sandi 96*e935fb4aSAndreas Gohr // send file contents 97*e935fb4aSAndreas Gohr $fp = @fopen($file,"rb"); 98f62ea8a1Sandi if($fp){ 99*e935fb4aSAndreas Gohr fseek($fp,$start); //seek to start of range 100*e935fb4aSAndreas Gohr 101*e935fb4aSAndreas Gohr $chunk = ($len > CHUNK_SIZE) ? CHUNK_SIZE : $len; 102*e935fb4aSAndreas Gohr while (!feof($fp) && $chunk > 0) { 103615a21edSBrian Cowan @set_time_limit(); // large files can take a lot of time 104*e935fb4aSAndreas Gohr print fread($fp, $chunk); 105615a21edSBrian Cowan flush(); 106*e935fb4aSAndreas Gohr $len -= $chunk; 107*e935fb4aSAndreas Gohr $chunk = ($len > CHUNK_SIZE) ? CHUNK_SIZE : $len; 108615a21edSBrian Cowan } 109615a21edSBrian Cowan fclose($fp); 110f62ea8a1Sandi }else{ 111f62ea8a1Sandi header("HTTP/1.0 500 Internal Server Error"); 112*e935fb4aSAndreas Gohr print "Could not read $file - bad permissions?"; 113*e935fb4aSAndreas Gohr } 114f62ea8a1Sandi} 115f62ea8a1Sandi 116*e935fb4aSAndreas Gohr/** 117*e935fb4aSAndreas Gohr * Checks and sets headers to handle range requets 118*e935fb4aSAndreas Gohr * 119*e935fb4aSAndreas Gohr * @author Andreas Gohr <andi@splitbrain.org> 120*e935fb4aSAndreas Gohr * @returns array The start byte and the amount of bytes to send 121*e935fb4aSAndreas Gohr */ 122*e935fb4aSAndreas Gohrfunction http_rangeRequest($size){ 123*e935fb4aSAndreas Gohr if(!isset($_SERVER['HTTP_RANGE'])){ 124*e935fb4aSAndreas Gohr // no range requested - send the whole file 125*e935fb4aSAndreas Gohr header("Content-Length: $size"); 126*e935fb4aSAndreas Gohr return array(0,$size); 127*e935fb4aSAndreas Gohr } 128*e935fb4aSAndreas Gohr 129*e935fb4aSAndreas Gohr $t = explode('=', $_SERVER['HTTP_RANGE']); 130*e935fb4aSAndreas Gohr if (!$t[0]=='bytes') { 131*e935fb4aSAndreas Gohr // we only understand byte ranges - send the whole file 132*e935fb4aSAndreas Gohr header("Content-Length: $size"); 133*e935fb4aSAndreas Gohr return array(0,$size); 134*e935fb4aSAndreas Gohr } 135*e935fb4aSAndreas Gohr 136*e935fb4aSAndreas Gohr $r = explode('-', $t[1]); 137*e935fb4aSAndreas Gohr $start = (int)$r[0]; 138*e935fb4aSAndreas Gohr $end = (int)$r[1]; 139*e935fb4aSAndreas Gohr if (!$end) $end = $size - 1; 140*e935fb4aSAndreas Gohr if ($start > $end || $start > $size || $end > $size){ 141*e935fb4aSAndreas Gohr header('HTTP/1.1 416 Requested Range Not Satisfiable'); 142*e935fb4aSAndreas Gohr print 'Bad Range Request!'; 143*e935fb4aSAndreas Gohr exit; 144*e935fb4aSAndreas Gohr } 145*e935fb4aSAndreas Gohr 146*e935fb4aSAndreas Gohr $tot = $end - $start + 1; 147*e935fb4aSAndreas Gohr header('HTTP/1.1 206 Partial Content'); 148*e935fb4aSAndreas Gohr header("Content-Range: bytes {$start}-{$end}/{$size}"); 149*e935fb4aSAndreas Gohr header("Content-Length: $tot"); 150*e935fb4aSAndreas Gohr 151*e935fb4aSAndreas Gohr return array($start,$tot); 152*e935fb4aSAndreas Gohr} 153*e935fb4aSAndreas Gohr 154*e935fb4aSAndreas Gohr/** 155*e935fb4aSAndreas Gohr * Checks and sets HTTP headers for conditional HTTP requests 156*e935fb4aSAndreas Gohr * 157*e935fb4aSAndreas Gohr * @author Simon Willison <swillison@gmail.com> 158*e935fb4aSAndreas Gohr * @link http://simon.incutio.com/archive/2003/04/23/conditionalGet 159*e935fb4aSAndreas Gohr */ 160*e935fb4aSAndreas Gohrfunction http_conditionalRequest($timestamp){ 161*e935fb4aSAndreas Gohr // A PHP implementation of conditional get, see 162*e935fb4aSAndreas Gohr // http://fishbowl.pastiche.org/archives/001132.html 163*e935fb4aSAndreas Gohr $last_modified = substr(date('r', $timestamp), 0, -5).'GMT'; 164*e935fb4aSAndreas Gohr $etag = '"'.md5($last_modified).'"'; 165*e935fb4aSAndreas Gohr // Send the headers 166*e935fb4aSAndreas Gohr header("Last-Modified: $last_modified"); 167*e935fb4aSAndreas Gohr header("ETag: $etag"); 168*e935fb4aSAndreas Gohr // See if the client has provided the required headers 169*e935fb4aSAndreas Gohr $if_modified_since = isset($_SERVER['HTTP_IF_MODIFIED_SINCE']) ? 170*e935fb4aSAndreas Gohr stripslashes($_SERVER['HTTP_IF_MODIFIED_SINCE']) : 171*e935fb4aSAndreas Gohr false; 172*e935fb4aSAndreas Gohr $if_none_match = isset($_SERVER['HTTP_IF_NONE_MATCH']) ? 173*e935fb4aSAndreas Gohr stripslashes($_SERVER['HTTP_IF_NONE_MATCH']) : 174*e935fb4aSAndreas Gohr false; 175*e935fb4aSAndreas Gohr if (!$if_modified_since && !$if_none_match) { 176*e935fb4aSAndreas Gohr return; 177*e935fb4aSAndreas Gohr } 178*e935fb4aSAndreas Gohr // At least one of the headers is there - check them 179*e935fb4aSAndreas Gohr if ($if_none_match && $if_none_match != $etag) { 180*e935fb4aSAndreas Gohr return; // etag is there but doesn't match 181*e935fb4aSAndreas Gohr } 182*e935fb4aSAndreas Gohr if ($if_modified_since && $if_modified_since != $last_modified) { 183*e935fb4aSAndreas Gohr return; // if-modified-since is there but doesn't match 184*e935fb4aSAndreas Gohr } 185*e935fb4aSAndreas Gohr // Nothing has changed since their last request - serve a 304 and exit 186*e935fb4aSAndreas Gohr header('HTTP/1.0 304 Not Modified'); 187*e935fb4aSAndreas Gohr exit; 188*e935fb4aSAndreas Gohr} 189f62ea8a1Sandi 190f62ea8a1Sandi/** 191f62ea8a1Sandi * Resizes the given image to the given size 192f62ea8a1Sandi * 193f62ea8a1Sandi * @author Andreas Gohr <andi@splitbrain.org> 194f62ea8a1Sandi */ 195f62ea8a1Sandifunction get_resized($file, $ext, $w, $h=0){ 196f62ea8a1Sandi global $conf; 197f62ea8a1Sandi 198f62ea8a1Sandi $info = getimagesize($file); 199f62ea8a1Sandi if(!$h) $h = round(($w * $info[1]) / $info[0]); 200f62ea8a1Sandi 201f62ea8a1Sandi 202f62ea8a1Sandi //cache 20398407a7aSandi $local = getCacheName($file,'.media.'.$w.'x'.$h.'.'.$ext); 204f62ea8a1Sandi $mtime = @filemtime($local); // 0 if not exists 205f62ea8a1Sandi 20668375754SPavel Vitis if( $mtime > filemtime($file) || 20768375754SPavel Vitis resize_imageIM($ext,$file,$info[0],$info[1],$local,$w,$h) || 20868375754SPavel Vitis resize_imageGD($ext,$file,$info[0],$info[1],$local,$w,$h) ){ 209f62ea8a1Sandi return $local; 210f62ea8a1Sandi } 211f62ea8a1Sandi //still here? resizing failed 212f62ea8a1Sandi return $file; 213f62ea8a1Sandi} 214f62ea8a1Sandi 215f62ea8a1Sandi/** 216f62ea8a1Sandi * Returns the wanted cachetime in seconds 217f62ea8a1Sandi * 218f62ea8a1Sandi * Resolves named constants 219f62ea8a1Sandi * 220f62ea8a1Sandi * @author Andreas Gohr <andi@splitbrain.org> 221f62ea8a1Sandi */ 222f62ea8a1Sandifunction calc_cache($cache){ 223f62ea8a1Sandi global $conf; 224f62ea8a1Sandi 225f62ea8a1Sandi if(strtolower($cache) == 'nocache') return 0; //never cache 226f62ea8a1Sandi if(strtolower($cache) == 'recache') return $conf['cachetime']; //use standard cache 227f62ea8a1Sandi return -1; //cache endless 228f62ea8a1Sandi} 229f62ea8a1Sandi 230f62ea8a1Sandi/** 231f62ea8a1Sandi * Download a remote file and return local filename 232f62ea8a1Sandi * 233f62ea8a1Sandi * returns false if download fails. Uses cached file if available and 234f62ea8a1Sandi * wanted 235f62ea8a1Sandi * 236f62ea8a1Sandi * @author Andreas Gohr <andi@splitbrain.org> 23768375754SPavel Vitis * @author Pavel Vitis <Pavel.Vitis@seznam.cz> 238f62ea8a1Sandi */ 239f62ea8a1Sandifunction get_from_URL($url,$ext,$cache){ 240f62ea8a1Sandi global $conf; 241f62ea8a1Sandi 24268375754SPavel Vitis $local = getCacheName(strtolower($url),".media.$ext"); 243f62ea8a1Sandi $mtime = @filemtime($local); // 0 if not exists 244f62ea8a1Sandi 245f62ea8a1Sandi //decide if download needed: 24668375754SPavel Vitis if( $cache == 0 || // never cache 24768375754SPavel Vitis ($mtime != 0 && $cache != -1) || // exists but no endless cache 24868375754SPavel Vitis ($mtime == 0) || // not exists 24968375754SPavel Vitis ($cache != -1 && $mtime < time()-$cache) // expired 25068375754SPavel Vitis ){ 251f62ea8a1Sandi if(io_download($url,$local)){ 252f62ea8a1Sandi return $local; 253f62ea8a1Sandi }else{ 254f62ea8a1Sandi return false; 255f62ea8a1Sandi } 256f62ea8a1Sandi } 257f62ea8a1Sandi 258f62ea8a1Sandi //if cache exists use it else 259f62ea8a1Sandi if($mtime) return $local; 260f62ea8a1Sandi 261f62ea8a1Sandi //else return false 262f62ea8a1Sandi return false; 263f62ea8a1Sandi} 264f62ea8a1Sandi 265f62ea8a1Sandi/** 26668375754SPavel Vitis * resize images using external ImageMagick convert program 26768375754SPavel Vitis * 26868375754SPavel Vitis * @author Pavel Vitis <Pavel.Vitis@seznam.cz> 26968375754SPavel Vitis * @author Andreas Gohr <andi@splitbrain.org> 27068375754SPavel Vitis */ 27168375754SPavel Vitisfunction resize_imageIM($ext,$from,$from_w,$from_h,$to,$to_w,$to_h){ 27268375754SPavel Vitis global $conf; 27368375754SPavel Vitis 2747bc7a78eSAndreas Gohr // check if convert is configured 2757bc7a78eSAndreas Gohr if(!$conf['im_convert']) return false; 27668375754SPavel Vitis 27768375754SPavel Vitis // prepare command 27868375754SPavel Vitis $cmd = $conf['im_convert']; 27968375754SPavel Vitis $cmd .= ' -resize '.$to_w.'x'.$to_h.'!'; 28068375754SPavel Vitis $cmd .= " $from $to"; 28168375754SPavel Vitis 28268375754SPavel Vitis @exec($cmd,$out,$retval); 28368375754SPavel Vitis if ($retval == 0) return true; 28468375754SPavel Vitis 28568375754SPavel Vitis return false; 28668375754SPavel Vitis} 28768375754SPavel Vitis 28868375754SPavel Vitis/** 28968375754SPavel Vitis * resize images using PHP's libGD support 290f62ea8a1Sandi * 291f62ea8a1Sandi * @author Andreas Gohr <andi@splitbrain.org> 292f62ea8a1Sandi */ 29368375754SPavel Vitisfunction resize_imageGD($ext,$from,$from_w,$from_h,$to,$to_w,$to_h){ 294f62ea8a1Sandi global $conf; 295f62ea8a1Sandi 296f62ea8a1Sandi if($conf['gdlib'] < 1) return false; //no GDlib available or wanted 297f62ea8a1Sandi 2984e406776SAndreas Gohr // check available memory 2994e406776SAndreas Gohr if(!is_mem_available(($from_w * $from_h * 4) + ($to_w * $to_h * 4))){ 3004e406776SAndreas Gohr return false; 3014e406776SAndreas Gohr } 3024e406776SAndreas Gohr 303f62ea8a1Sandi // create an image of the given filetype 304f62ea8a1Sandi if ($ext == 'jpg' || $ext == 'jpeg'){ 305f62ea8a1Sandi if(!function_exists("imagecreatefromjpeg")) return false; 306f62ea8a1Sandi $image = @imagecreatefromjpeg($from); 307f62ea8a1Sandi }elseif($ext == 'png') { 308f62ea8a1Sandi if(!function_exists("imagecreatefrompng")) return false; 309f62ea8a1Sandi $image = @imagecreatefrompng($from); 310f62ea8a1Sandi 311f62ea8a1Sandi }elseif($ext == 'gif') { 312f62ea8a1Sandi if(!function_exists("imagecreatefromgif")) return false; 313f62ea8a1Sandi $image = @imagecreatefromgif($from); 314f62ea8a1Sandi } 315f62ea8a1Sandi if(!$image) return false; 316f62ea8a1Sandi 317f62ea8a1Sandi if(($conf['gdlib']>1) && function_exists("imagecreatetruecolor")){ 318f62ea8a1Sandi $newimg = @imagecreatetruecolor ($to_w, $to_h); 319f62ea8a1Sandi } 320f62ea8a1Sandi if(!$newimg) $newimg = @imagecreate($to_w, $to_h); 321dd7bbbf4SAndreas Gohr if(!$newimg){ 322dd7bbbf4SAndreas Gohr imagedestroy($image); 323dd7bbbf4SAndreas Gohr return false; 324dd7bbbf4SAndreas Gohr } 325f62ea8a1Sandi 326f62ea8a1Sandi //keep png alpha channel if possible 327f62ea8a1Sandi if($ext == 'png' && $conf['gdlib']>1 && function_exists('imagesavealpha')){ 328f62ea8a1Sandi imagealphablending($newimg, false); 329f62ea8a1Sandi imagesavealpha($newimg,true); 330f62ea8a1Sandi } 331f62ea8a1Sandi 332f62ea8a1Sandi //try resampling first 333f62ea8a1Sandi if(function_exists("imagecopyresampled")){ 334f62ea8a1Sandi if(!@imagecopyresampled($newimg, $image, 0, 0, 0, 0, $to_w, $to_h, $from_w, $from_h)) { 335f62ea8a1Sandi imagecopyresized($newimg, $image, 0, 0, 0, 0, $to_w, $to_h, $from_w, $from_h); 336f62ea8a1Sandi } 337f62ea8a1Sandi }else{ 338f62ea8a1Sandi imagecopyresized($newimg, $image, 0, 0, 0, 0, $to_w, $to_h, $from_w, $from_h); 339f62ea8a1Sandi } 340f62ea8a1Sandi 341dd7bbbf4SAndreas Gohr $okay = false; 342f62ea8a1Sandi if ($ext == 'jpg' || $ext == 'jpeg'){ 343dd7bbbf4SAndreas Gohr if(!function_exists('imagejpeg')){ 344dd7bbbf4SAndreas Gohr $okay = false; 345dd7bbbf4SAndreas Gohr }else{ 346dd7bbbf4SAndreas Gohr $okay = imagejpeg($newimg, $to, 70); 347dd7bbbf4SAndreas Gohr } 348f62ea8a1Sandi }elseif($ext == 'png') { 349dd7bbbf4SAndreas Gohr if(!function_exists('imagepng')){ 350dd7bbbf4SAndreas Gohr $okay = false; 351dd7bbbf4SAndreas Gohr }else{ 352dd7bbbf4SAndreas Gohr $okay = imagepng($newimg, $to); 353dd7bbbf4SAndreas Gohr } 354f62ea8a1Sandi }elseif($ext == 'gif') { 355dd7bbbf4SAndreas Gohr if(!function_exists('imagegif')){ 356dd7bbbf4SAndreas Gohr $okay = false; 357dd7bbbf4SAndreas Gohr }else{ 358dd7bbbf4SAndreas Gohr $okay = imagegif($newimg, $to); 359dd7bbbf4SAndreas Gohr } 360f62ea8a1Sandi } 361f62ea8a1Sandi 362dd7bbbf4SAndreas Gohr // destroy GD image ressources 363dd7bbbf4SAndreas Gohr if($image) imagedestroy($image); 364dd7bbbf4SAndreas Gohr if($newimg) imagedestroy($newimg); 365dd7bbbf4SAndreas Gohr 366dd7bbbf4SAndreas Gohr return $okay; 367f62ea8a1Sandi} 368f62ea8a1Sandi 3694e406776SAndreas Gohr/** 3704e406776SAndreas Gohr * Checks if the given amount of memory is available 3714e406776SAndreas Gohr * 3724e406776SAndreas Gohr * If the memory_get_usage() function is not available the 3734e406776SAndreas Gohr * function just assumes $used bytes of already allocated memory 3744e406776SAndreas Gohr * 3754e406776SAndreas Gohr * @param int $mem Size of memory you want to allocate in bytes 3764e406776SAndreas Gohr * @param int $used already allocated memory (see above) 3774e406776SAndreas Gohr * @author Filip Oscadal <webmaster@illusionsoftworks.cz> 3784e406776SAndreas Gohr * @author Andreas Gohr <andi@splitbrain.org> 3794e406776SAndreas Gohr */ 3804e406776SAndreas Gohrfunction is_mem_available($mem,$bytes=1048576){ 3814e406776SAndreas Gohr $limit = trim(ini_get('memory_limit')); 3824e406776SAndreas Gohr if(empty($limit)) return true; // no limit set! 3834e406776SAndreas Gohr 3844e406776SAndreas Gohr // parse limit to bytes 3854e406776SAndreas Gohr $unit = strtolower(substr($limit,-1)); 3864e406776SAndreas Gohr switch($unit){ 3874e406776SAndreas Gohr case 'g': 3884e406776SAndreas Gohr $limit = substr($limit,0,-1); 3894e406776SAndreas Gohr $limit *= 1024*1024*1024; 3904e406776SAndreas Gohr break; 3914e406776SAndreas Gohr case 'm': 3924e406776SAndreas Gohr $limit = substr($limit,0,-1); 3934e406776SAndreas Gohr $limit *= 1024*1024; 3944e406776SAndreas Gohr break; 3954e406776SAndreas Gohr case 'k': 3964e406776SAndreas Gohr $limit = substr($limit,0,-1); 3974e406776SAndreas Gohr $limit *= 1024; 3984e406776SAndreas Gohr break; 3994e406776SAndreas Gohr } 4004e406776SAndreas Gohr 4014e406776SAndreas Gohr // get used memory if possible 4024e406776SAndreas Gohr if(function_exists('memory_get_usage')){ 4034e406776SAndreas Gohr $used = memory_get_usage(); 4044e406776SAndreas Gohr } 4054e406776SAndreas Gohr 4064e406776SAndreas Gohr 4074e406776SAndreas Gohr if($used+$mem > $limit){ 4084e406776SAndreas Gohr return false; 4094e406776SAndreas Gohr } 4104e406776SAndreas Gohr 4114e406776SAndreas Gohr return true; 4124e406776SAndreas Gohr} 413f62ea8a1Sandi 414f62ea8a1Sandi//Setup VIM: ex: et ts=2 enc=utf-8 : 415f62ea8a1Sandi?> 416