Prechádzať zdrojové kódy

SimplePie: cache feeds with errors

Before the cache system was not used for feeds with errors, which was
problematic especially if several users have this feed.
Furthermore, there was no protection against repetitive refresh.

Bonus: slightly better performance by avoiding some superfluous
file_exists().

Warning: needs a bit of testing
https://github.com/marienfressinaud/FreshRSS/issues/681
Alexandre Alapetite 11 rokov pred
rodič
commit
00127f07c5

+ 2 - 1
app/Models/Feed.php

@@ -217,7 +217,8 @@ class FreshRSS_Feed extends Minz_Model {
 				$mtime = $feed->init();
 
 				if ((!$mtime) || $feed->error()) {
-					throw new FreshRSS_Feed_Exception($feed->error() . ' [' . $url . ']');
+					$errorMessage = $feed->error();
+					throw new FreshRSS_Feed_Exception(($errorMessage == '' ? 'Feed error' : $errorMessage) . ' [' . $url . ']');
 				}
 
 				if ($loadDetails) {

+ 15 - 9
lib/SimplePie/SimplePie.php

@@ -1455,7 +1455,11 @@ class SimplePie
 		{
 			// Load the Cache
 			$this->data = $cache->load();
-			if (!empty($this->data))
+			if ($cache->mtime() + $this->cache_duration > time()) {	//FreshRSS
+				$this->raw_data = false;
+				return true;	// If the cache is still valid, just return true
+			}
+			elseif (!empty($this->data))
 			{
 				// If the cache is for an outdated build of SimplePie
 				if (!isset($this->data['build']) || $this->data['build'] !== SIMPLEPIE_BUILD)
@@ -1487,7 +1491,7 @@ class SimplePie
 					}
 				}
 				// Check if the cache has been updated
-				elseif ($cache->mtime() + $this->cache_duration < time())
+				else //if ($cache->mtime() + $this->cache_duration < time())	//FreshRSS removed
 				{
 					// If we have last-modified and/or etag set
 					//if (isset($this->data['headers']['last-modified']) || isset($this->data['headers']['etag']))	//FreshRSS removed
@@ -1516,6 +1520,7 @@ class SimplePie
 						}
 						else
 						{
+							$cache->touch();	//FreshRSS
 							$this->error = $file->error;	//FreshRSS
 							return !empty($this->data);	//FreshRSS
 							//unset($file);	//FreshRSS removed
@@ -1533,17 +1538,18 @@ class SimplePie
 						}
 					}
 				}
-				// If the cache is still valid, just return true
-				else
-				{
-					$this->raw_data = false;
-					return true;
-				}
+				//// If the cache is still valid, just return true
+				//else	//FreshRSS removed
+				//{
+				//	$this->raw_data = false;
+				//	return true;
+				//}
 			}
 			// If the cache is empty, delete it
 			else
 			{
-				$cache->unlink();
+				//$cache->unlink();	//FreshRSS removed
+				$cache->touch();	//FreshRSS
 				$this->data = array();
 			}
 		}

+ 6 - 6
lib/SimplePie/SimplePie/Cache/File.php

@@ -136,11 +136,11 @@ class SimplePie_Cache_File implements SimplePie_Cache_Base
 	 */
 	public function mtime()
 	{
-		if (file_exists($this->name))
+		//if (file_exists($this->name))	//FreshRSS removed
 		{
-			return filemtime($this->name);
+			return @filemtime($this->name);	//FreshRSS
 		}
-		return false;
+		//return false;	//FreshRSS removed
 	}
 
 	/**
@@ -150,11 +150,11 @@ class SimplePie_Cache_File implements SimplePie_Cache_Base
 	 */
 	public function touch()
 	{
-		if (file_exists($this->name))
+		//if (file_exists($this->name))	//FreshRSS removed
 		{
-			return touch($this->name);
+			return @touch($this->name);	//FreshRSS
 		}
-		return false;
+		//return false;	//FreshRSS removed
 	}
 
 	/**