Der Punkt ist:
Es werden
alle User mit Geburtstagen abgefragt und bei sehr vielen Usern kann das dann eben schon mal eine Weile dauern.
Die Frage, die sich stellt:
Kann man wirklich die Anzahl Sekunden auf Tage umrechnen, wie es der Birthday-Mod auch in der Datenbank speichert und damit immer noch die korrekten Anzeigen erhalten? Also aktuellen Zeitraum umrechnen und als WHERE-Clausel mit in die SQL-Abfrage packen.
Das würde sicherlich die Anzahl der abgefragten User um einiges verringern und damit beschleunigen...
Ich versuche es mal eben.
EDIT:
Das kann nicht funktionieren, da ja der Geburtstag
mit Geburtsjahr in der Datenbank steht, also nicht nur Monat und Tag extra. Und in einem SQL-Statement kann man nur mit Datenbankfunktionen arbeiten, nicht mit externen.
Schade aber auch.
Ich wüsste dann wirklich keine Möglichkeit, das noch zu beschleunigen.
BTW: Über wie viele User reden wir hier überhaupt? Also die mit eingetragenem Geburtstag?
EDIT2:
Hier der Code, den ich für den "zusammenklappbaren" Block auf meinem Index verwende:
In der index.php nach dem Birthday-Abfrage-Block
Code: Alles auswählen
$birth_on = ( $HTTP_POST_VARS['bon'] ) ? $HTTP_POST_VARS['bon'] : $HTTP_GET_VARS['bon'];
if( $birth_on == TRUE )
{
$template->assign_block_vars('switch_birth_on', array());
$birth_heading = $lang['Birthday'].' ( <a href="'.append_sid("index.$phpEx").'" class="mainmenu">'.$lang['Vhide'].'</a> )';
}
else
{
$template->assign_block_vars('switch_birth_off', array());
$birth_heading = '<a href="'.append_sid("index.$phpEx?bon=".TRUE).'" class="mainmenu">'.$lang['Birthday'].'</a> <img src="templates/subSilver/images/down_arrow.gif" border="0"/>';
}
Hier wäre es auch möglich, den Block der nächsten Geburtstage in die Bedingung einzubauen, also einfach den Block nach
verschieben und die Geburtstage werden erst berechnet, wenn jemand den Block öffnet.
Tabelle für die Anzeigen in der index_body.tpl:
Code: Alles auswählen
<!-- BEGIN switch_birth_on -->
<table width="100%" cellpadding="2" cellspacing="0" border="0" class="forumline">
<td valign="top">
<tr>
<td class="row4" align="center"><span class="gen"><b>{L_BIRTHDAY}</b></span></td>
</tr>
<tbody id="birth" style="display: ;">
<!-- END switch_birth_on -->
<!-- BEGIN switch_birth_off -->
<table width="100%" cellpadding="2" cellspacing="0" border="0">
<td valign="top">
<tr>
<td align="left"><span class="gen"><b>{L_BIRTHDAY}</b></span></td>
</tr>
<tbody id="birth" style="display: none;">
<!-- END switch_birth_off -->
<tr>
<td class="row1" align="left"><span class="gensmall">{L_WHOSBIRTHDAY_TODAY}<br />{L_WHOSBIRTHDAY_WEEK}</span></td>
</tr>
</td>
</tbody>
</table>
Und so sieht der Code in der index.php bei mir jetzt aus und damit spare ich rund eine halbe Sekunde Generation Time, wenn die Box (per Default) nicht auf ist (der Code in der index_body.tpl ist der gleiche wie oben):
Code: Alles auswählen
if ($board_config['birthday_check_day'])
{
$birth_on = ( $HTTP_POST_VARS['bon'] ) ? $HTTP_POST_VARS['bon'] : $HTTP_GET_VARS['bon'];
if( $birth_on == TRUE )
{
$template->assign_block_vars('switch_birth_on', array());
$birth_heading = $lang['Birthday'].' ( <a href="'.append_sid("index.$phpEx").'" class="mainmenu">'.$lang['Vhide'].'</a> )';
// Birthday Mod, Show users with birthday
$sql = "SELECT user_id, user_birthday FROM " . USERS_TABLE. " WHERE user_birthday != 999999 ORDER BY username";
if($result = $db->sql_query($sql))
{
if (!empty($result))
{
$time_now = time();
$this_year = create_date('Y', $time_now, $board_config['board_timezone']);
$date_today = create_date('Ymd', $time_now, $board_config['board_timezone']);
$date_forward = create_date('Ymd', $time_now+($board_config['birthday_check_day']*86400), $board_config['board_timezone']);
include_once("includes/functions_color_groups.".$phpEx);
while ($birthdayrow = $db->sql_fetchrow($result))
{
$user_birthday2 = $this_year.($user_birthday = realdate("md",$birthdayrow['user_birthday'] ));
if ( $user_birthday2 < $date_today ) $user_birthday2 += 10000;
if ( $user_birthday2 > $date_today && $user_birthday2 <= $date_forward )
{
// user are having birthday within the next days
$user_age = ( $this_year.$user_birthday < $date_today ) ? $this_year - realdate ('Y',$birthdayrow['user_birthday'])+1 : $this_year- realdate ('Y',$birthdayrow['user_birthday']);
$birthday_week_list .= ' <a href="' . append_sid("profile.$phpEx?mode=viewprofile&" . POST_USERS_URL . "=" . $birthdayrow['user_id']) . '">' . color_group_colorize_name($birthdayrow['user_id'], true) . ' ('.$user_age.')</a>,';
} else if ( $user_birthday2 == $date_today )
{
//user have birthday today
$user_age = $this_year - realdate ( 'Y',$birthdayrow['user_birthday'] );
$birthday_today_list .= ' <a href="' . append_sid("profile.$phpEx?mode=viewprofile&" . POST_USERS_URL . "=" . $birthdayrow['user_id']) . '">' . color_group_colorize_name($birthdayrow['user_id'], true) . ' ('.$user_age.')</a>,';
}
}
if ($birthday_today_list) $birthday_today_list[ strlen( $birthday_today_list)-1] = ' ';
if ($birthday_week_list) $birthday_week_list[ strlen( $birthday_week_list)-1] = ' ';
}
$db->sql_freeresult($result);
}
}
else
{
$template->assign_block_vars('switch_birth_off', array());
$birth_heading = '<a href="'.append_sid("index.$phpEx?bon=".TRUE).'" class="mainmenu">'.$lang['Birthday'].'</a> <img src="templates/subSilver/images/down_arrow.gif" border="0"/>';
}
}
$lang['Vhide'] müsste dann ggf. noch in der lang_main.php definiert werden.