Merge pull request #34 from green-ponies/master
CSS & JS caching and Fix for Issue 22
This commit is contained in:
		
						commit
						d37a2bfdd4
					
				| @ -93,6 +93,7 @@ class Image { | |||||||
| 	public static function by_random($tags=array()) { | 	public static function by_random($tags=array()) { | ||||||
| 		assert(is_array($tags)); | 		assert(is_array($tags)); | ||||||
| 		$max = Image::count_images($tags); | 		$max = Image::count_images($tags); | ||||||
|  | 		if ($max < 1) return null;		// From Issue #22 - opened by HungryFeline on May 30, 2011.
 | ||||||
| 		$rand = mt_rand(0, $max-1); | 		$rand = mt_rand(0, $max-1); | ||||||
| 		$set = Image::find_images($rand, 1, $tags); | 		$set = Image::find_images($rand, 1, $tags); | ||||||
| 		if(count($set) > 0) return $set[0]; | 		if(count($set) > 0) return $set[0]; | ||||||
|  | |||||||
| @ -167,8 +167,8 @@ class Page { | |||||||
| 	public function display() { | 	public function display() { | ||||||
| 		global $page; | 		global $page; | ||||||
| 		 | 		 | ||||||
| 		$this->add_http_header("Content-type: {$this->type}", 1); | 		header("Content-type: ".$this->type); | ||||||
| 		$this->add_http_header("X-Powered-By: SCore-".SCORE_VERSION, 2); | 		header("X-Powered-By: SCore-".SCORE_VERSION); | ||||||
| 
 | 
 | ||||||
| 		if (!headers_sent()) { | 		if (!headers_sent()) { | ||||||
| 			foreach($this->http_headers as $head){ header($head); } | 			foreach($this->http_headers as $head){ header($head); } | ||||||
| @ -204,25 +204,128 @@ class Page { | |||||||
| 	protected function add_auto_html_headers() { | 	protected function add_auto_html_headers() { | ||||||
| 		$data_href = get_base_href(); | 		$data_href = get_base_href(); | ||||||
| 		 | 		 | ||||||
| 		foreach(glob("lib/*.css") as $css) { | 		/* Attempt to cache the CSS & JavaScript files */ | ||||||
| 			$this->add_html_header("<link rel='stylesheet' href='$data_href/$css' type='text/css'>"); | 		if ($this->add_cached_auto_html_headers() === FALSE) { | ||||||
|  | 			// caching failed, add all files to html_headers.
 | ||||||
|  | 			 | ||||||
|  | 			foreach(glob("lib/*.css") as $css) { | ||||||
|  | 				$this->add_html_header("<link rel='stylesheet' href='$data_href/$css' type='text/css'>"); | ||||||
|  | 			} | ||||||
|  | 			$css_files = glob("ext/*/style.css"); | ||||||
|  | 			if($css_files) { | ||||||
|  | 				foreach($css_files as $css_file) { | ||||||
|  | 					$this->add_html_header("<link rel='stylesheet' href='$data_href/$css_file' type='text/css'>"); | ||||||
|  | 				} | ||||||
|  | 			} | ||||||
|  | 			 | ||||||
|  | 			foreach(glob("lib/*.js") as $js) { | ||||||
|  | 				$this->add_html_header("<script src='$data_href/$js' type='text/javascript'></script>"); | ||||||
|  | 			} | ||||||
|  | 			$js_files = glob("ext/*/script.js"); | ||||||
|  | 			if($js_files) { | ||||||
|  | 				foreach($js_files as $js_file) { | ||||||
|  | 					$this->add_html_header("<script src='$data_href/$js_file' type='text/javascript'></script>"); | ||||||
|  | 				} | ||||||
|  | 			} | ||||||
| 		} | 		} | ||||||
| 		$css_files = glob("ext/*/style.css"); | 	} | ||||||
| 		if($css_files) { | 
 | ||||||
| 			foreach($css_files as $css_file) { | 	/* | ||||||
| 				$this->add_html_header("<link rel='stylesheet' href='$data_href/$css_file' type='text/css'>"); | 		This function caches the CSS and JavaScript files. | ||||||
|  | 		This is done to reduce the number of HTTP requests (recommended by | ||||||
|  | 		the Yahoo high-performance guidelines). It combines all of the CSS | ||||||
|  | 		and JavaScript files into one for each type, and stores them in  | ||||||
|  | 		cached files to serve the client. Changes to the CSS or JavaScript | ||||||
|  | 		files are caught by taking the md5sum of the concatenated files. | ||||||
|  | 	*/ | ||||||
|  | 	private function add_cached_auto_html_headers() | ||||||
|  | 	{ | ||||||
|  | 		$cache_location = 'data/cache/'; | ||||||
|  | 		$data_href = get_base_href(); | ||||||
|  | 		 | ||||||
|  | 		if(!file_exists($cache_location)) { | ||||||
|  | 			if (!mkdir($cache_location, 0750, true)) { | ||||||
|  | 				return false; // failed to create directory
 | ||||||
| 			} | 			} | ||||||
| 		} | 		} | ||||||
| 
 | 
 | ||||||
| 		foreach(glob("lib/*.js") as $js) { | 		/* ----- CSS Files ----- */ | ||||||
| 			$this->add_html_header("<script src='$data_href/$js' type='text/javascript'></script>"); | 		// First get all the CSS from the lib directory
 | ||||||
|  | 		$data_1 = ''; | ||||||
|  | 		$css_files = glob("lib/*.css"); | ||||||
|  | 		if($css_files) { | ||||||
|  | 			foreach($css_files as $css_file) { | ||||||
|  | 				$data_1 .= file_get_contents($css_file); | ||||||
|  | 			} | ||||||
|  | 			//	Can't directly cache the CSS files, as they might have relative locations to images, etc. in them.
 | ||||||
|  | 			//	We have to adjust the URLs accordingly before saving the cached file.
 | ||||||
|  | 			$pattern = '/url[\s]*\([\s]*["\']?([^"\'\)]+)["\']?[\s]*\)/'; | ||||||
|  | 			$replace = 'url("../../lib/${1}")'; | ||||||
|  | 			$data_1 = preg_replace($pattern, $replace, $data_1); | ||||||
|  | 		} | ||||||
|  | 		// Next get all the CSS from the extensions
 | ||||||
|  | 		$data_2 = ''; | ||||||
|  | 		$css_files = glob("ext/*/style.css"); | ||||||
|  | 		if($css_files) { | ||||||
|  | 			foreach($css_files as $css_file) { | ||||||
|  | 				$data_2 .= file_get_contents($css_file); | ||||||
|  | 			} | ||||||
|  | 			//	Can't directly cache the CSS files, as they might have relative locations to images, etc. in them.
 | ||||||
|  | 			//	We have to adjust the URLs accordingly before saving the cached file.
 | ||||||
|  | 			$pattern = '/url[\s]*\([\s]*["\']?([^"\'\)]+)["\']?[\s]*\)/'; | ||||||
|  | 			$replace = 'url("../../${1}")'; | ||||||
|  | 			$data_2 = preg_replace($pattern, $replace, $data_2); | ||||||
|  | 		} | ||||||
|  | 		// Combine the two
 | ||||||
|  | 		$data = $data_1 . $data_2; | ||||||
|  | 		// compute the MD5 sum of the concatenated CSS files
 | ||||||
|  | 		$md5sum = md5($data); | ||||||
|  | 		 | ||||||
|  | 		if (!file_exists($cache_location.$md5sum.'.css')) { | ||||||
|  | 			// remove any old cached CSS files.
 | ||||||
|  | 			$mask = '*.css'; | ||||||
|  | 			array_map( 'unlink', glob( $mask ) ); | ||||||
|  | 		 | ||||||
|  | 			// output the combined file
 | ||||||
|  | 			if (file_put_contents($cache_location.$md5sum.'.css', $data, LOCK_EX) === FALSE) { | ||||||
|  | 				return false; | ||||||
|  | 			} | ||||||
|  | 		} | ||||||
|  | 		// tell the client where to get the css cache file
 | ||||||
|  | 		$this->add_html_header('<link rel="stylesheet" href="'.$data_href.'/'.$cache_location.$md5sum.'.css'.'" type="text/css">'); | ||||||
|  | 
 | ||||||
|  | 		 | ||||||
|  | 		/* ----- JavaScript Files ----- */ | ||||||
|  | 		$data = ''; | ||||||
|  | 		$js_files = glob("lib/*.js"); | ||||||
|  | 		if($js_files) { | ||||||
|  | 			foreach($js_files as $js_file) { | ||||||
|  | 				$data .= file_get_contents($js_file); | ||||||
|  | 			} | ||||||
| 		} | 		} | ||||||
| 		$js_files = glob("ext/*/script.js"); | 		$js_files = glob("ext/*/script.js"); | ||||||
| 		if($js_files) { | 		if($js_files) { | ||||||
| 			foreach($js_files as $js_file) { | 			foreach($js_files as $js_file) { | ||||||
| 				$this->add_html_header("<script src='$data_href/$js_file' type='text/javascript'></script>"); | 				$data .= file_get_contents($js_file); | ||||||
| 			} | 			} | ||||||
| 		} | 		} | ||||||
|  | 		// compute the MD5 sum of the concatenated JavaScript files
 | ||||||
|  | 		$md5sum = md5($data); | ||||||
|  | 		 | ||||||
|  | 		if (!file_exists($cache_location.$md5sum.'.js')) { | ||||||
|  | 			// remove any old cached js files.
 | ||||||
|  | 			$mask = '*.js'; | ||||||
|  | 			array_map( 'unlink', glob( $mask ) ); | ||||||
|  | 			// output the combined file
 | ||||||
|  | 			if (file_put_contents($cache_location.$md5sum.'.js', $data, LOCK_EX) === FALSE) { | ||||||
|  | 				return false; | ||||||
|  | 			} | ||||||
|  | 		} | ||||||
|  | 		// tell the client where to get the js cache file
 | ||||||
|  | 		$this->add_html_header('<script src="'.$data_href.'/'.$cache_location.$md5sum.'.js'.'" type="text/javascript"></script>'); | ||||||
|  | 		 | ||||||
|  | 		return true; | ||||||
| 	} | 	} | ||||||
|  | 
 | ||||||
| } | } | ||||||
| ?>
 | ?>
 | ||||||
|  | |||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user