misc performance: cache contact details by url during script

This commit is contained in:
Hypolite Petovan 2016-11-06 00:51:23 -04:00
parent 27a2e44d89
commit bae9f0852f
1 changed files with 36 additions and 14 deletions

View File

@ -196,6 +196,7 @@ function unmark_for_death($contact) {
* @brief Get contact data for a given profile link * @brief Get contact data for a given profile link
* *
* The function looks at several places (contact table and gcontact table) for the contact * The function looks at several places (contact table and gcontact table) for the contact
* It caches its result for the same script execution to prevent duplicate calls
* *
* @param string $url The profile link * @param string $url The profile link
* @param int $uid User id * @param int $uid User id
@ -204,8 +205,15 @@ function unmark_for_death($contact) {
* @return array Contact data * @return array Contact data
*/ */
function get_contact_details_by_url($url, $uid = -1, $default = array()) { function get_contact_details_by_url($url, $uid = -1, $default = array()) {
if ($uid == -1) static $cache = array();
if ($uid == -1) {
$uid = local_user(); $uid = local_user();
}
if (isset($cache[$url][$uid])) {
return $cache[$url][$uid];
}
// Fetch contact data from the contact table for the given user // Fetch contact data from the contact table for the given user
$r = q("SELECT `id`, `id` AS `cid`, 0 AS `gid`, 0 AS `zid`, `uid`, `url`, `nurl`, `alias`, `network`, `name`, `nick`, `addr`, `location`, `about`, `xmpp`, $r = q("SELECT `id`, `id` AS `cid`, 0 AS `gid`, 0 AS `zid`, `uid`, `url`, `nurl`, `alias`, `network`, `name`, `nick`, `addr`, `location`, `about`, `xmpp`,
@ -229,10 +237,13 @@ function get_contact_details_by_url($url, $uid = -1, $default = array()) {
if ($r) { if ($r) {
// If there is more than one entry we filter out the connector networks // If there is more than one entry we filter out the connector networks
if (count($r) > 1) if (count($r) > 1) {
foreach ($r AS $id => $result) foreach ($r AS $id => $result) {
if ($result["network"] == NETWORK_STATUSNET) if ($result["network"] == NETWORK_STATUSNET) {
unset($r[$id]); unset($r[$id]);
}
}
}
$profile = array_shift($r); $profile = array_shift($r);
@ -251,31 +262,40 @@ function get_contact_details_by_url($url, $uid = -1, $default = array()) {
$profile["bd"] = $current_year."-".$month."-".$day; $profile["bd"] = $current_year."-".$month."-".$day;
$current = $current_year."-".$current_month."-".$current_day; $current = $current_year."-".$current_month."-".$current_day;
if ($profile["bd"] < $current) if ($profile["bd"] < $current) {
$profile["bd"] = (++$current_year)."-".$month."-".$day; $profile["bd"] = (++$current_year)."-".$month."-".$day;
} else }
} else {
$profile["bd"] = "0000-00-00"; $profile["bd"] = "0000-00-00";
} else }
} else {
$profile = $default; $profile = $default;
}
if (($profile["photo"] == "") AND isset($default["photo"])) if (($profile["photo"] == "") AND isset($default["photo"])) {
$profile["photo"] = $default["photo"]; $profile["photo"] = $default["photo"];
}
if (($profile["name"] == "") AND isset($default["name"])) if (($profile["name"] == "") AND isset($default["name"])) {
$profile["name"] = $default["name"]; $profile["name"] = $default["name"];
}
if (($profile["network"] == "") AND isset($default["network"])) if (($profile["network"] == "") AND isset($default["network"])) {
$profile["network"] = $default["network"]; $profile["network"] = $default["network"];
}
if (($profile["thumb"] == "") AND isset($profile["photo"])) if (($profile["thumb"] == "") AND isset($profile["photo"])) {
$profile["thumb"] = $profile["photo"]; $profile["thumb"] = $profile["photo"];
}
if (($profile["micro"] == "") AND isset($profile["thumb"])) if (($profile["micro"] == "") AND isset($profile["thumb"])) {
$profile["micro"] = $profile["thumb"]; $profile["micro"] = $profile["thumb"];
}
if ((($profile["addr"] == "") OR ($profile["name"] == "")) AND ($profile["gid"] != 0) AND if ((($profile["addr"] == "") OR ($profile["name"] == "")) AND ($profile["gid"] != 0) AND
in_array($profile["network"], array(NETWORK_DFRN, NETWORK_DIASPORA, NETWORK_OSTATUS))) in_array($profile["network"], array(NETWORK_DFRN, NETWORK_DIASPORA, NETWORK_OSTATUS))) {
proc_run(PRIORITY_LOW, "include/update_gcontact.php", $profile["gid"]); proc_run(PRIORITY_LOW, "include/update_gcontact.php", $profile["gid"]);
}
// Show contact details of Diaspora contacts only if connected // Show contact details of Diaspora contacts only if connected
if (($profile["cid"] == 0) AND ($profile["network"] == NETWORK_DIASPORA)) { if (($profile["cid"] == 0) AND ($profile["network"] == NETWORK_DIASPORA)) {
@ -285,7 +305,9 @@ function get_contact_details_by_url($url, $uid = -1, $default = array()) {
$profile["birthday"] = "0000-00-00"; $profile["birthday"] = "0000-00-00";
} }
return($profile); $cache[$url][$uid] = $profile;
return $profile;
} }
if (! function_exists('contact_photo_menu')) { if (! function_exists('contact_photo_menu')) {