mirror of
https://github.com/phpbb/phpbb.git
synced 2025-06-10 21:38:54 +00:00
[ticket/13713] Rework names caching
PHPBB3-13713
This commit is contained in:
parent
5e26380da7
commit
e769a036b6
7 changed files with 68 additions and 33 deletions
|
@ -36,6 +36,9 @@ abstract class base_group implements source_interface
|
||||||
/** @var string */
|
/** @var string */
|
||||||
protected $php_ext;
|
protected $php_ext;
|
||||||
|
|
||||||
|
/** @var string|false */
|
||||||
|
protected $cache_ttl = false;
|
||||||
|
|
||||||
/** @var array Fetched groups' data */
|
/** @var array Fetched groups' data */
|
||||||
protected $groups = null;
|
protected $groups = null;
|
||||||
|
|
||||||
|
@ -125,8 +128,8 @@ abstract class base_group implements source_interface
|
||||||
*/
|
*/
|
||||||
public function get(array &$names, $keyword, $topic_id)
|
public function get(array &$names, $keyword, $topic_id)
|
||||||
{
|
{
|
||||||
// Grab all group IDs, cache for 5 minutes
|
// Grab all group IDs and cache them if needed
|
||||||
$result = $this->db->sql_query($this->query($keyword, $topic_id), 300);
|
$result = $this->db->sql_query($this->query($keyword, $topic_id), $this->cache_ttl);
|
||||||
|
|
||||||
$group_ids = [];
|
$group_ids = [];
|
||||||
while ($row = $this->db->sql_fetchrow($result))
|
while ($row = $this->db->sql_fetchrow($result))
|
||||||
|
|
|
@ -30,6 +30,9 @@ abstract class base_user implements source_interface
|
||||||
/** @var string */
|
/** @var string */
|
||||||
protected $php_ext;
|
protected $php_ext;
|
||||||
|
|
||||||
|
/** @var string|false */
|
||||||
|
protected $cache_ttl = false;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Constructor
|
* Constructor
|
||||||
*/
|
*/
|
||||||
|
@ -73,47 +76,67 @@ abstract class base_user implements source_interface
|
||||||
$fetched_all = false;
|
$fetched_all = false;
|
||||||
$keyword = utf8_clean_string($keyword);
|
$keyword = utf8_clean_string($keyword);
|
||||||
|
|
||||||
// Grab all necessary user IDs, cache results for 5 minutes
|
|
||||||
$result = $this->db->sql_query($this->query($keyword, $topic_id), 300);
|
|
||||||
|
|
||||||
$i = 0;
|
$i = 0;
|
||||||
$users = [];
|
$users = [];
|
||||||
$user_ids = [];
|
$user_ids = [];
|
||||||
while ($i < $this->config['mention_batch_size'])
|
|
||||||
|
// Grab all necessary user IDs and cache them if needed
|
||||||
|
if ($this->cache_ttl)
|
||||||
{
|
{
|
||||||
$row = $this->db->sql_fetchrow($result);
|
$result = $this->db->sql_query($this->query($keyword, $topic_id), $this->cache_ttl);
|
||||||
|
|
||||||
if (!$row)
|
while ($i < $this->config['mention_batch_size'])
|
||||||
{
|
{
|
||||||
$fetched_all = true;
|
$row = $this->db->sql_fetchrow($result);
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!empty($keyword) && strpos($row['username_clean'], $keyword) !== 0)
|
if (!$row)
|
||||||
{
|
{
|
||||||
continue;
|
$fetched_all = true;
|
||||||
}
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
$i++;
|
|
||||||
$users[] = $row;
|
|
||||||
$user_ids[] = $row['user_id'];
|
|
||||||
}
|
|
||||||
|
|
||||||
// Determine whether all usernames were fetched in current batch
|
|
||||||
if (!$fetched_all)
|
|
||||||
{
|
|
||||||
$fetched_all = true;
|
|
||||||
|
|
||||||
while ($row = $this->db->sql_fetchrow($result))
|
|
||||||
{
|
|
||||||
if (!empty($keyword) && strpos($row['username_clean'], $keyword) !== 0)
|
if (!empty($keyword) && strpos($row['username_clean'], $keyword) !== 0)
|
||||||
{
|
{
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
// At least one username hasn't been fetched - exit loop
|
$i++;
|
||||||
$fetched_all = false;
|
$users[] = $row;
|
||||||
break;
|
$user_ids[] = $row['user_id'];
|
||||||
|
}
|
||||||
|
|
||||||
|
// Determine whether all usernames were fetched in current batch
|
||||||
|
if (!$fetched_all)
|
||||||
|
{
|
||||||
|
$fetched_all = true;
|
||||||
|
|
||||||
|
while ($row = $this->db->sql_fetchrow($result))
|
||||||
|
{
|
||||||
|
if (!empty($keyword) && strpos($row['username_clean'], $keyword) !== 0)
|
||||||
|
{
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
// At least one username hasn't been fetched - exit loop
|
||||||
|
$fetched_all = false;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
$result = $this->db->sql_query_limit($this->query($keyword, $topic_id), $this->config['mention_batch_size'], 0);
|
||||||
|
|
||||||
|
while ($row = $this->db->sql_fetchrow($result))
|
||||||
|
{
|
||||||
|
$users[] = $row;
|
||||||
|
$user_ids[] = $row['user_id'];
|
||||||
|
}
|
||||||
|
|
||||||
|
// Determine whether all usernames were fetched in current batch
|
||||||
|
if (count($user_ids) < $this->config['mention_batch_size'])
|
||||||
|
{
|
||||||
|
$fetched_all = true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -50,7 +50,8 @@ class friend extends base_user
|
||||||
]
|
]
|
||||||
],
|
],
|
||||||
'WHERE' => 'z.friend = 1 AND z.user_id = ' . (int) $this->user->data['user_id'] . '
|
'WHERE' => 'z.friend = 1 AND z.user_id = ' . (int) $this->user->data['user_id'] . '
|
||||||
AND ' . $this->db->sql_in_set('u.user_type', [USER_NORMAL, USER_FOUNDER]),
|
AND ' . $this->db->sql_in_set('u.user_type', [USER_NORMAL, USER_FOUNDER]) . '
|
||||||
|
AND u.username_clean ' . $this->db->sql_like_expression($keyword . $this->db->get_any_char()),
|
||||||
'ORDER_BY' => 'u.user_lastvisit DESC'
|
'ORDER_BY' => 'u.user_lastvisit DESC'
|
||||||
]);
|
]);
|
||||||
return $query;
|
return $query;
|
||||||
|
|
|
@ -15,6 +15,9 @@ namespace phpbb\mention\source;
|
||||||
|
|
||||||
class group extends base_group
|
class group extends base_group
|
||||||
{
|
{
|
||||||
|
/** @var string|false */
|
||||||
|
protected $cache_ttl = 300;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* {@inheritdoc}
|
* {@inheritdoc}
|
||||||
*/
|
*/
|
||||||
|
|
|
@ -15,6 +15,9 @@ namespace phpbb\mention\source;
|
||||||
|
|
||||||
class team extends base_user
|
class team extends base_user
|
||||||
{
|
{
|
||||||
|
/** @var string|false */
|
||||||
|
protected $cache_ttl = 300;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* {@inheritdoc}
|
* {@inheritdoc}
|
||||||
*/
|
*/
|
||||||
|
|
|
@ -61,7 +61,8 @@ class topic extends base_user
|
||||||
],
|
],
|
||||||
],
|
],
|
||||||
'WHERE' => 'p.topic_id = ' . (int) $topic_id . '
|
'WHERE' => 'p.topic_id = ' . (int) $topic_id . '
|
||||||
AND ' . $this->db->sql_in_set('u.user_type', [USER_NORMAL, USER_FOUNDER]),
|
AND ' . $this->db->sql_in_set('u.user_type', [USER_NORMAL, USER_FOUNDER]) . '
|
||||||
|
AND u.username_clean ' . $this->db->sql_like_expression($keyword . $this->db->get_any_char()),
|
||||||
'ORDER_BY' => 'p.post_time DESC'
|
'ORDER_BY' => 'p.post_time DESC'
|
||||||
]);
|
]);
|
||||||
return $query;
|
return $query;
|
||||||
|
|
|
@ -39,7 +39,8 @@ class user extends base_user
|
||||||
'FROM' => [
|
'FROM' => [
|
||||||
USERS_TABLE => 'u',
|
USERS_TABLE => 'u',
|
||||||
],
|
],
|
||||||
'WHERE' => $this->db->sql_in_set('u.user_type', [USER_NORMAL, USER_FOUNDER]),
|
'WHERE' => $this->db->sql_in_set('u.user_type', [USER_NORMAL, USER_FOUNDER]) . '
|
||||||
|
AND u.username_clean ' . $this->db->sql_like_expression($keyword . $this->db->get_any_char()),
|
||||||
'ORDER_BY' => 'u.user_lastvisit DESC'
|
'ORDER_BY' => 'u.user_lastvisit DESC'
|
||||||
]);
|
]);
|
||||||
return $query;
|
return $query;
|
||||||
|
|
Loading…
Add table
Reference in a new issue