From 0625897f1e47e6cb46c5e4f4d4b6d50f9dd48239 Mon Sep 17 00:00:00 2001 From: Cash Costello Date: Sat, 29 Oct 2011 09:52:17 -0400 Subject: Fixes #3920 profile plugin adds a fast loading of user avatars --- mod/profile/icon.php | 53 -------------------------------- mod/profile/icondirect.php | 45 ++++++++++++--------------- mod/profile/start.php | 76 ++++++++++++++++++++++++++++++++++++++-------- 3 files changed, 84 insertions(+), 90 deletions(-) delete mode 100644 mod/profile/icon.php (limited to 'mod/profile') diff --git a/mod/profile/icon.php b/mod/profile/icon.php deleted file mode 100644 index a624c0811..000000000 --- a/mod/profile/icon.php +++ /dev/null @@ -1,53 +0,0 @@ -owner_guid = $user->getGUID(); -$filehandler->setFilename("profile/" . $user->getGUID() . $size . ".jpg"); - -$success = false; -if ($filehandler->open("read")) { - if ($contents = $filehandler->read($filehandler->size())) { - $success = true; - } -} - -if (!$success) { - $path = elgg_view("icon/user/default/$size"); - header("Location: $path"); - exit; -} - -header("Content-type: image/jpeg"); -header('Expires: ' . date('r',time() + 864000)); -header("Pragma: public"); -header("Cache-Control: public"); -header("Content-Length: " . strlen($contents)); - -$splitString = str_split($contents, 1024); - -foreach($splitString as $chunk) { - echo $chunk; -} \ No newline at end of file diff --git a/mod/profile/icondirect.php b/mod/profile/icondirect.php index fe4726d1a..f7188455e 100644 --- a/mod/profile/icondirect.php +++ b/mod/profile/icondirect.php @@ -1,38 +1,33 @@ dbhost,$CONFIG->dbuser,$CONFIG->dbpass, true); +$mysql_dblink = @mysql_connect($CONFIG->dbhost, $CONFIG->dbuser, $CONFIG->dbpass, true); if ($mysql_dblink) { - if (@mysql_select_db($CONFIG->dbname,$mysql_dblink)) { - - // get dataroot and simplecache_enabled in one select for efficiency - if ($result = mysql_query("select name, value from {$CONFIG->dbprefix}datalists where name in ('dataroot','simplecache_enabled')",$mysql_dblink)) { - $simplecache_enabled = true; + if (@mysql_select_db($CONFIG->dbname, $mysql_dblink)) { + $result = mysql_query("select name, value from {$CONFIG->dbprefix}datalists where name='dataroot'", $mysql_dblink); + if ($result) { $row = mysql_fetch_object($result); while ($row) { if ($row->name == 'dataroot') { - $dataroot = $row->value; - } else if ($row->name == 'simplecache_enabled') { - $simplecache_enabled = $row->value; + $data_root = $row->value; } $row = mysql_fetch_object($result); } @@ -40,21 +35,22 @@ if ($mysql_dblink) { @mysql_close($mysql_dblink); - // if the simplecache is enabled, we get icon directly - if ($simplecache_enabled) { + if (isset($data_root)) { + + // this depends on ElggDiskFilestore::makeFileMatrix() + $user_path = date('Y/m/d/', $join_date) . $guid; - // first try to read icon directly - $user_path = date('Y/m/d/', $joindate) . $guid; - $filename = "$dataroot$user_path/profile/{$guid}{$size}.jpg"; + $filename = "$data_root$user_path/profile/{$guid}{$size}.jpg"; $contents = @file_get_contents($filename); if (!empty($contents)) { header("Content-type: image/jpeg"); - header('Expires: ' . date('r',time() + 864000)); + header('Expires: ' . date('r', strtotime("+6 months")), true); header("Pragma: public"); header("Cache-Control: public"); header("Content-Length: " . strlen($contents)); - $splitString = str_split($contents, 1024); - foreach($splitString as $chunk) { + // this chunking is done for supposedly better performance + $split_string = str_split($contents, 1024); + foreach ($split_string as $chunk) { echo $chunk; } exit; @@ -64,8 +60,7 @@ if ($mysql_dblink) { } -// simplecache is not turned on or something went wrong so load engine and try that way +// something went wrong so load engine and try to forward to default icon require_once(dirname(dirname(dirname(__FILE__))) . "/engine/start.php"); -$user = get_entity($guid); -set_input('username', $user->username); -require_once(dirname(__FILE__).'/icon.php'); +elgg_log("Profile icon direct failed.", "WARNING"); +forward("_graphics/icons/user/default{$size}.gif"); diff --git a/mod/profile/start.php b/mod/profile/start.php index 2c38fdd2d..0f13ad844 100644 --- a/mod/profile/start.php +++ b/mod/profile/start.php @@ -20,6 +20,9 @@ function profile_init() { // will dictate the URL for all ElggUser objects elgg_register_entity_url_handler('user', 'all', 'profile_url'); + elgg_register_plugin_hook_handler('entity:icon:url', 'user', 'profile_override_avatar_url'); + elgg_unregister_plugin_hook_handler('entity:icon:url', 'user', 'user_avatar_hook'); + elgg_register_simplecache_view('icon/user/default/tiny'); elgg_register_simplecache_view('icon/user/default/topbar'); @@ -28,7 +31,6 @@ function profile_init() { elgg_register_simplecache_view('icon/user/default/large'); elgg_register_simplecache_view('icon/user/default/master'); - // Register a page handler, so we can have nice URLs elgg_register_page_handler('profile', 'profile_page_handler'); elgg_extend_view('page/elements/head', 'profile/metatags'); @@ -45,7 +47,7 @@ function profile_init() { /** * Profile page handler * - * @param array $page Array of page elements, forwarded by the page handling mechanism + * @param array $page Array of URL segments passed by the page handling mechanism */ function profile_page_handler($page) { @@ -94,15 +96,66 @@ function profile_url($user) { return elgg_get_site_url() . "profile/" . $user->username; } +/** + * Use a URL for avatars that avoids loading Elgg engine for better performance + * + * @param string $hook + * @param string $entity_type + * @param string $return_value + * @param array $params + * @return string + */ +function profile_override_avatar_url($hook, $entity_type, $return_value, $params) { + + // if someone already set this, quit + if ($return_value) { + return null; + } + + $user = $params['entity']; + $size = $params['size']; + + if (!elgg_instanceof($user, 'user')) { + return null; + } + + $user_guid = $user->getGUID(); + $icon_time = $user->icontime; + + if (!$icon_time) { + return "_graphics/icons/user/default{$size}.gif"; + } + + if ($user->isBanned()) { + return null; + } + + $filehandler = new ElggFile(); + $filehandler->owner_guid = $user_guid; + $filehandler->setFilename("profile/{$user_guid}{$size}.jpg"); + + try { + if ($filehandler->exists()) { + $join_date = $user->getTimeCreated(); + return "mod/profile/icondirect.php?lastcache=$icon_time&joindate=$join_date&guid=$user_guid&size=$size"; + } + } catch (InvalidParameterException $e) { + elgg_log("Unable to get profile icon for user with GUID $user_guid", 'ERROR'); + return "_graphics/icons/default/$size.png"; + } + + return null; +} + /** * Parse ECML on parts of the profile * - * @param unknown_type $hook - * @param unknown_type $entity_type - * @param unknown_type $return_value - * @param unknown_type $params + * @param string $hook + * @param string $entity_type + * @param array $return_value + * @return array */ -function profile_ecml_views_hook($hook, $entity_type, $return_value, $params) { +function profile_ecml_views_hook($hook, $entity_type, $return_value) { $return_value['profile/profile_content'] = elgg_echo('profile'); return $return_value; @@ -111,13 +164,12 @@ function profile_ecml_views_hook($hook, $entity_type, $return_value, $params) { /** * Register profile widgets with default widgets * - * @param unknown_type $hook - * @param unknown_type $type - * @param unknown_type $return - * @param unknown_type $params + * @param string $hook + * @param string $type + * @param array $return * @return array */ -function profile_default_widgets_hook($hook, $type, $return, $params) { +function profile_default_widgets_hook($hook, $type, $return) { $return[] = array( 'name' => elgg_echo('profile'), 'widget_context' => 'profile', -- cgit v1.2.3