]> git.mxchange.org Git - friendica.git/commitdiff
Adding cache mechanism for bbcode. Improving cache to use apc.
authorMichael Vogel <icarus@dabo.de>
Sun, 23 Feb 2014 14:51:57 +0000 (15:51 +0100)
committerMichael Vogel <icarus@dabo.de>
Sun, 23 Feb 2014 14:51:57 +0000 (15:51 +0100)
include/bbcode.php
include/cache.php

index 96ca39462d6237c3c2e10608322740fed5fff0fb..7f70563c7ae330bf20df95828d6764356e23bc2d 100644 (file)
@@ -534,77 +534,85 @@ function GetProfileUsername($profile, $username) {
 }
 
 function bb_RemovePictureLinks($match) {
-       $ch = @curl_init($match[1]);
-       @curl_setopt($ch, CURLOPT_NOBODY, true);
-       @curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
-       @curl_setopt($ch, CURLOPT_USERAGENT, "Mozilla/5.0 (compatible; Friendica)");
-       @curl_exec($ch);
-       $curl_info = @curl_getinfo($ch);
-
-       if (substr($curl_info["content_type"], 0, 6) == "image/")
-               $text = "[url=".$match[1]."]".$match[1]."[/url]";
-       else {
-               $text = "[url=".$match[2]."]".$match[2]."[/url]";
-
-               // if its not a picture then look if its a page that contains a picture link
-               require_once("include/network.php");
-
-               $body = fetch_url($match[1]);
-
-               $doc = new DOMDocument();
-               @$doc->loadHTML($body);
-               $xpath = new DomXPath($doc);
-               $list = $xpath->query("//meta[@name]");
-               foreach ($list as $node) {
-                       $attr = array();
-
-                       if ($node->attributes->length)
-                               foreach ($node->attributes as $attribute)
-                                       $attr[$attribute->name] = $attribute->value;
-
-                       if (strtolower($attr["name"]) == "twitter:image")
-                               $text = "[url=".$attr["content"]."]".$attr["content"]."[/url]";
+       $text = Cache::get($match[1]);
+
+       if(is_null($text)){
+               $ch = @curl_init($match[1]);
+               @curl_setopt($ch, CURLOPT_NOBODY, true);
+               @curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
+               @curl_setopt($ch, CURLOPT_USERAGENT, "Mozilla/5.0 (compatible; Friendica)");
+               @curl_exec($ch);
+               $curl_info = @curl_getinfo($ch);
+
+               if (substr($curl_info["content_type"], 0, 6) == "image/")
+                       $text = "[url=".$match[1]."]".$match[1]."[/url]";
+               else {
+                       $text = "[url=".$match[2]."]".$match[2]."[/url]";
+
+                       // if its not a picture then look if its a page that contains a picture link
+                       require_once("include/network.php");
+
+                       $body = fetch_url($match[1]);
+
+                       $doc = new DOMDocument();
+                       @$doc->loadHTML($body);
+                       $xpath = new DomXPath($doc);
+                       $list = $xpath->query("//meta[@name]");
+                       foreach ($list as $node) {
+                               $attr = array();
+
+                               if ($node->attributes->length)
+                                       foreach ($node->attributes as $attribute)
+                                               $attr[$attribute->name] = $attribute->value;
+
+                               if (strtolower($attr["name"]) == "twitter:image")
+                                       $text = "[url=".$attr["content"]."]".$attr["content"]."[/url]";
+                       }
                }
+               Cache::set($match[1],$text);
        }
-
        return($text);
 }
 
 function bb_CleanPictureLinksSub($match) {
-       $ch = @curl_init($match[1]);
-       @curl_setopt($ch, CURLOPT_NOBODY, true);
-       @curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
-       @curl_setopt($ch, CURLOPT_USERAGENT, "Mozilla/5.0 (compatible; Friendica)");
-       @curl_exec($ch);
-       $curl_info = @curl_getinfo($ch);
-
-       // if its a link to a picture then embed this picture
-       if (substr($curl_info["content_type"], 0, 6) == "image/")
-               $text = "[img]".$match[1]."[/img]";
-       else {
-               $text = "[img]".$match[2]."[/img]";
-
-               // if its not a picture then look if its a page that contains a picture link
-               require_once("include/network.php");
-
-               $body = fetch_url($match[1]);
-
-               $doc = new DOMDocument();
-               @$doc->loadHTML($body);
-               $xpath = new DomXPath($doc);
-               $list = $xpath->query("//meta[@name]");
-               foreach ($list as $node) {
-                       $attr = array();
-
-                       if ($node->attributes->length)
-                               foreach ($node->attributes as $attribute)
-                                       $attr[$attribute->name] = $attribute->value;
-
-                       if (strtolower($attr["name"]) == "twitter:image")
-                               $text = "[img]".$attr["content"]."[/img]";
+       $text = Cache::get($match[1]);
+
+       if(is_null($text)){
+               $ch = @curl_init($match[1]);
+               @curl_setopt($ch, CURLOPT_NOBODY, true);
+               @curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
+               @curl_setopt($ch, CURLOPT_USERAGENT, "Mozilla/5.0 (compatible; Friendica)");
+               @curl_exec($ch);
+               $curl_info = @curl_getinfo($ch);
+
+               // if its a link to a picture then embed this picture
+               if (substr($curl_info["content_type"], 0, 6) == "image/")
+                       $text = "[img]".$match[1]."[/img]";
+               else {
+                       $text = "[img]".$match[2]."[/img]";
+
+                       // if its not a picture then look if its a page that contains a picture link
+                       require_once("include/network.php");
+
+                       $body = fetch_url($match[1]);
+
+                       $doc = new DOMDocument();
+                       @$doc->loadHTML($body);
+                       $xpath = new DomXPath($doc);
+                       $list = $xpath->query("//meta[@name]");
+                       foreach ($list as $node) {
+                               $attr = array();
+
+                               if ($node->attributes->length)
+                                       foreach ($node->attributes as $attribute)
+                                               $attr[$attribute->name] = $attribute->value;
+
+                               if (strtolower($attr["name"]) == "twitter:image")
+                                       $text = "[img]".$attr["content"]."[/img]";
+                       }
                }
+               Cache::set($match[1],$text);
        }
-
        return($text);
 }
 
index 360c4acbdbadd285225f848149a3d2c778bc8576..e6ea8f045df8bd5a63a36fe54ad2784a0dc7eb9c 100644 (file)
@@ -2,29 +2,42 @@
        /**
         *  cache api
         */
-        
+
        class Cache {
-               public static function get($key){
+               public static function get($key) {
+                       if (function_exists("apc_fetch") AND function_exists("apc_exists"))
+                               if (apc_exists($key))
+                                       return(apc_fetch($key));
+
                        $r = q("SELECT `v` FROM `cache` WHERE `k`='%s' limit 1",
                                dbesc($key)
                        );
-                       
-                       if (count($r)) return $r[0]['v'];
+
+                       if (count($r)) {
+                               if (function_exists("apc_store"))
+                                       apc_store($key, $r[0]['v'], 600);
+
+                               return $r[0]['v'];
+                       }
                        return null;
                }
-               
+
                public static function set($key,$value) {
 
                        q("REPLACE INTO `cache` (`k`,`v`,`updated`) VALUES ('%s','%s','%s')",
                                        dbesc($key),
                                        dbesc($value),
                                        dbesc(datetime_convert()));
+
+                       if (function_exists("apc_store"))
+                               apc_store($key, $value, 600);
+
                }
 
-               
-/* 
+
+/*
  *
- * Leaving this legacy code temporaily to see how REPLACE fares 
+ * Leaving this legacy code temporaily to see how REPLACE fares
  * as opposed to non-atomic checks when faced with fast moving key duplication.
  * As a MySQL extension it isn't portable, but we're not yet very portable.
  */
  *             }
  */
 
-               
+
                public static function clear(){
                        q("DELETE FROM `cache` WHERE `updated` < '%s'",
-                               dbesc(datetime_convert('UTC','UTC',"now - 30 days")));                  
+                               dbesc(datetime_convert('UTC','UTC',"now - 30 days")));
                }
-               
+
        }
-        
+