Zoptymalizowanie standardowych statystyk PHP-Fusion (Aktualnie online)
|
Gutek1806 |
Dodany dnia 02.10.2010 14:48:02
|
Przedszkolak
Postów: 65 Pomógł: 3
Data rejestracji: 08.07.2009 23:19
|
Witam korzystam z PHP-Fusion v7.00.07 i mój problem jest następujący przy włączonych standardowych statystykach strony obciążenie procentowe procesora samym tylko procesem mysql waha się pomiędzy 50-120% co spowalnia pracę innych stron umieszczonych na tym samym serwerze. Próbowałem odchudzić statystyki na własną rękę, ale niestety ja się na tym nie znam i obciążenie się nie zmienia. Adres strony to www.ls-world.pl, liczę na Waszą pomoc.
Poniżej dane, które mogą być pomocne.
Odwiedziny:
- średnio: 23000
- rekord: 30150
Odsłony:
- średnio: 170000
- rekord: 273909
Ilość osób przebywających jednocześnie na portalu:
- średnio: 180-200
- godziny szczytu: 250+
- rekord: 605
Zużycie transferu:
- wrzesień 2010: ~ 380 GB
Edytowane przez Pieka dnia 02.10.2010 16:29:38
|
|
|
|
Wścibski Gość |
Dodany dnia 24.11.2024 18:58:14
|
Pan Kontekstualny
Postów: n^x
Data rejestracji: Zawsze
|
|
IP: localhost |
|
|
bartek124 |
Dodany dnia 02.10.2010 16:06:12
|
Weteran
Postów: 3264 Pomógł: 236
v7.02.06 Data rejestracji: 26.05.2007 12:25
|
Których standardowych statystyk, bo nie łapie?
Nie pomagam na komunikatorach oraz PW!
|
|
|
|
Pieka |
Dodany dnia 02.10.2010 16:15:02
|
Postów: 19882 Pomógł: 767
v7.02.03 Data rejestracji: 23.02.2005 18:12
|
bartek124 napisał/a:
Których standardowych statystyk, bo nie łapie?
Chodzi o statystyki odwiedzin, nowych uzytkowikow etc., umieszczone w bocznym panelu (Aktualnie online).
Pieka dodał/a następującą grafikę:
Jestem jaki jestem
|
|
|
|
bartek124 |
Dodany dnia 02.10.2010 19:36:59
|
Weteran
Postów: 3264 Pomógł: 236
v7.02.06 Data rejestracji: 26.05.2007 12:25
|
Usuń z bazy tabelę prefix_online, a następnie w PHPMyAdmin wykonaj zapytanie:
GeSHi: MySQL KEY `online_lastactive` (`online_lastactive`)
Zinterpretowano w sekund: 0.009, wykorzystano GeSHi 1.0.8.10
Oczywiście wcześniej wpisz swój prefix tabel do zapytania!
Teraz podmień zawartość pliku infusions/online_users_panel/online_users_panel.php na następującą:
<?php
/*-------------------------------------------------------+
| PHP-Fusion Content Management System
| Copyright 2002 - 2007 Nick Jones
| http://www.php-fusion.co.uk/
+--------------------------------------------------------+
| Filename: online_users_panel.php
| Author: Nick Jones (Digitanium)
| Co-Author: bartek124
+--------------------------------------------------------+
| This program is released as free software under the
| Affero GPL license. You can redistribute it and/or
| modify it under the terms of this license which you
| can read by viewing the included agpl.txt or online
| at http://www.gnu.org/licenses/agpl.html. Removal of this
| copyright header is strictly prohibited without
| written permission from the original author(s).
+--------------------------------------------------------*/
if (!defined("IN_FUSION")) { die("Access Denied"); }
$user_level = $userdata['user_level'] != 0 ? $userdata['user_id'] : '0';
$result = dbcount("(online_user)", DB_ONLINE, "online_user=" . $user_level . " AND online_ip=INET_ATON('" . USER_IP . "') LIMIT 1");
if (!empty($result)) {
$result = dbquery("UPDATE ".DB_ONLINE." SET online_lastactive='".time()."' WHERE online_user=".($userdata['user_level'] != 0 ? "'".$userdata['user_id']."'" : "'0' AND online_ip=INET_ATON('".USER_IP."')")." LIMIT 1");
} else {
$result = dbquery("INSERT INTO ".DB_ONLINE." (online_user, online_ip, online_lastactive) VALUES ('".($userdata['user_level'] != 0 ? $userdata['user_id'] : "0")."', INET_ATON('".USER_IP."'), '".time()."')");
}
$result = dbquery("DELETE FROM ".DB_ONLINE." WHERE online_lastactive<".(time()-60)."");
openside($locale['global_010']);
$result = dbquery(
"SELECT ton.online_user, tu.user_name, tu.user_status FROM ".DB_ONLINE." ton
LEFT JOIN ".DB_USERS." tu ON ton.online_user=tu.user_id"
);
$guests = 0; $members = array();
while ($data = dbarray($result)) {
if ($data['online_user'] == "0") {
$guests++;
} else {
array_push($members, array($data['online_user'], $data['user_name']));
}
}
echo THEME_BULLET." ".$locale['global_011'].": ".$guests."<br /><br />\n";
echo THEME_BULLET." ".$locale['global_012'].": ".count($members)."<br />\n";
if (count($members)) {
$i = 1;
while (list($key, $member) = each($members)) {
echo "<a href='".BASEDIR."profile.php?lookup=".$member[0]."' class='side'>".$member[1]."</a>";
if ($i != count($members)) { echo ",\n"; } else { echo "<br />\n"; }
$i++;
}
}
echo "<br />\n".THEME_BULLET." ".$locale['global_014'].": ".number_format(dbcount("(user_id)", DB_USERS, "user_status<='1' LIMIT 1"))."<br />\n";
if (iADMIN && checkrights("M") && $settings['admin_activation'] == "1") {
echo THEME_BULLET." <a href='".ADMIN."members.php".$aidlink."&status=2' class='side'>".$locale['global_015']."</a>";
echo ": ".dbcount("(user_id)", DB_USERS, "user_status='2'")."<br />\n";
}
$data = dbarray(dbquery("SELECT user_id, user_name, user_status FROM ".DB_USERS." WHERE user_status='0' ORDER BY user_joined DESC LIMIT 1"));
echo THEME_BULLET." ".$locale['global_016'].": <a href='".BASEDIR."profile.php?lookup=".$data['user_id']."' class='side'>".$data['user_name']."</a>\n";
closeside();
?>
Tyle obecnie mogę zrobić. Przeprowadź kilka testów i daj znać, jak wyniki. Jeśli Cię nie zadowolą, będziemy próbować dalej :)
Edytowane przez bartek124 dnia 02.10.2010 19:53:44
Nie pomagam na komunikatorach oraz PW!
|
|
|
|
Gutek1806 |
Dodany dnia 02.10.2010 20:33:07
|
Przedszkolak
Postów: 65 Pomógł: 3
Data rejestracji: 08.07.2009 23:19
|
Zastosowałem wszystko co napisał bartek124 i obciążenie zmniejszyło się minimalnie, ale problem jest nadal, w praktyce nic to nie dało.
|
|
|
|
bartek124 |
Dodany dnia 02.10.2010 20:38:08
|
Weteran
Postów: 3264 Pomógł: 236
v7.02.06 Data rejestracji: 26.05.2007 12:25
|
Widziałem serwis gdy był włączony panel. ~150 zalogowanych użytkowników wtedy. To jest jedna z tych sekcji strony, w której cache się w ogóle nie przyda, więc musimy myśleć dalej.
Swoją drogą, a jak wyglądają statystyki bez tego panela? Bo zdaje mi się że i cały serwis potrzebuje optymalizacji, przy takim ruchu.
Nie pomagam na komunikatorach oraz PW!
|
|
|
|
Gutek1806 |
Dodany dnia 02.10.2010 20:46:12
|
Przedszkolak
Postów: 65 Pomógł: 3
Data rejestracji: 08.07.2009 23:19
|
Obciążenie procentowe procesora samym tylko procesem mysql W granicach 2-12%.
|
|
|
|
Pieka |
Dodany dnia 02.10.2010 20:52:02
|
Postów: 19882 Pomógł: 767
v7.02.03 Data rejestracji: 23.02.2005 18:12
|
Nie Bartku, tylko te statystyki generuja obciazenie procesora na poziomie 60-120% procesem mysql. Po wylaczeniu wszystko wraca do normy. Inne procesy nie stanowia problemu. Standardowo LA wynosi 0.8, a w godzinach szczytu 1.5.
Jestem jaki jestem
|
|
|
|
bartek124 |
Dodany dnia 02.10.2010 21:50:30
|
Weteran
Postów: 3264 Pomógł: 236
v7.02.06 Data rejestracji: 26.05.2007 12:25
|
Skombinowałem jeszcze taki kodzik:
<?php
/*-------------------------------------------------------+
| PHP-Fusion Content Management System
| Copyright 2002 - 2007 Nick Jones
| http://www.php-fusion.co.uk/
+--------------------------------------------------------+
| Filename: online_users_panel.php
| Author: Nick Jones (Digitanium)
| Co-Author: bartek124
+--------------------------------------------------------+
| This program is released as free software under the
| Affero GPL license. You can redistribute it and/or
| modify it under the terms of this license which you
| can read by viewing the included agpl.txt or online
| at http://www.gnu.org/licenses/agpl.html. Removal of this
| copyright header is strictly prohibited without
| written permission from the original author(s).
+--------------------------------------------------------*/
if (!defined("IN_FUSION")) { die("Access Denied"); }
$user_level = isset($userdata['user_level']) && $userdata['user_level'] != 0 ? $userdata['user_id'] : '0';
//$result = dbcount("(online_user)", DB_ONLINE, "online_user=" . $user_level . " AND online_ip=INET_ATON('" . USER_IP . "') LIMIT 1");
$time = time();
if (isset($_COOKIE['online_user']) && isnum($_COOKIE['online_user'])) {
if (($time - $_COOKIE['online_user']) >= 45) {
$result = dbquery("UPDATE ".DB_ONLINE." SET online_lastactive='".$time."' WHERE online_user='".$user_level."' AND online_ip=INET_ATON('".USER_IP."') LIMIT 1");
}
} else {
$result = dbquery("INSERT INTO ".DB_ONLINE." (online_user, online_ip, online_lastactive) VALUES ('".$user_level."', INET_ATON('".USER_IP."'), '".$time."')");
}
setcookie('online_user', $time, $time+45);
$result = dbquery("DELETE FROM ".DB_ONLINE." WHERE online_lastactive<".($time-60)."");
openside($locale['global_010']);
$result = dbquery(
"SELECT ton.online_user, tu.user_name, tu.user_status FROM ".DB_ONLINE." ton
LEFT JOIN ".DB_USERS." tu ON ton.online_user=tu.user_id"
);
$guests = 0; $members = array();
while ($data = dbarray($result)) {
if ($data['online_user'] == '0') {
$guests++;
} else {
$members[$data['online_user']] = $data;
}
}
$count_members = count($members);
echo THEME_BULLET." ".$locale['global_011'].": ".$guests."<br /><br />\n";
echo THEME_BULLET." ".$locale['global_012'].": ".$count_members."<br />\n";
if ($count_members > 0) {
$i = 1;
foreach ($members as $data) {
echo "<a href='".BASEDIR."profile.php?lookup=".$data['online_user']."' class='side'>".$data['user_name']."</a>";
echo ($i != $count_members ? ", " : "<br />");
$i++;
}
}
unset($members, $count_members);
echo "<br />\n".THEME_BULLET." ".$locale['global_014'].": ".number_format(dbcount("(user_id)", DB_USERS, "user_status<='1' LIMIT 1"))."<br />\n";
if (iADMIN && checkrights("M") && $settings['admin_activation'] == "1") {
echo THEME_BULLET." <a href='".ADMIN."members.php".$aidlink."&status=2' class='side'>".$locale['global_015']."</a>";
echo ": ".dbcount("(user_id)", DB_USERS, "user_status='2'")."<br />\n";
}
$data = dbarray(dbquery("SELECT user_id, user_name, user_status FROM ".DB_USERS." WHERE user_status='0' ORDER BY user_joined DESC LIMIT 1"));
echo THEME_BULLET." ".$locale['global_016'].": <a href='".BASEDIR."profile.php?lookup=".$data['user_id']."' class='side'>".$data['user_name']."</a>\n";
closeside();
?>
Sprawdź go, oczywiście razem z modyfikacją tabeli prefix_online z pierwszego postu.
Pozbyłem się całkowicie jednego zapytania oraz drugiego częściowo (wykonuje się rzadziej niż raz na 45 sekund).
Zobaczymy, co z tego wyjdzie.
Edytowane przez bartek124 dnia 02.10.2010 22:03:20
Nie pomagam na komunikatorach oraz PW!
|
|
|
|
eldiablo |
Dodany dnia 02.10.2010 22:17:20
|
Bywalec
Postów: 671 Pomógł: 80
Data rejestracji: 13.07.2009 19:20
|
@Gutek1806 zawsze możesz podpiąć zewnętrzny widget "online", np: ten z którego korzysta toolbar wibiya. Albo całkowicie panel online pożegnać, jeżeli szukasz oszczędności w zasobach. Lub zostawić jedynie użytkownicy online, a gości bye bye. |
|
|
|
Gutek1806 |
Dodany dnia 02.10.2010 22:33:29
|
Przedszkolak
Postów: 65 Pomógł: 3
Data rejestracji: 08.07.2009 23:19
|
bartek124 teraz nie mogę do końca sprawdzić czy pomogło bo ilość osób online jest dużo mniejsza ale obliczając tak procentowo wychodzi na to że nie bardzo pomogło.
eldiablo no właśnie chciałbym tego uniknąć.
|
|
|
|
bartek124 |
Dodany dnia 02.10.2010 23:11:15
|
Weteran
Postów: 3264 Pomógł: 236
v7.02.06 Data rejestracji: 26.05.2007 12:25
|
Ok, ostatnia próba na dzisiaj, pomysły mi się kończą.
Usuń poprzednią tabelę prefix_online, a następnie wykonaj zapytanie w PHPMyAdmin:
CREATE TABLE `prefix_online` (
`online_user` mediumint(8) unsigned NOT NULL DEFAULT '0',
`user_name` varchar(30) NOT NULL DEFAULT '',
`user_status` tinyint(1) unsigned NOT NULL DEFAULT '0',
`online_ip` int(10) unsigned NOT NULL DEFAULT '0',
`online_lastactive` int(10) unsigned NOT NULL DEFAULT '0',
KEY `online_lastactive` (`online_lastactive`),
KEY `online_user` (`online_user`)
) ENGINE=MyISAM;
Pamiętaj o prefixie.
Nowa zawartość pliku online_users_panel.php:
<?php
/*-------------------------------------------------------+
| PHP-Fusion Content Management System
| Copyright 2002 - 2007 Nick Jones
| http://www.php-fusion.co.uk/
+--------------------------------------------------------+
| Filename: online_users_panel.php
| Author: Nick Jones (Digitanium)
| Co-Author: bartek124
+--------------------------------------------------------+
| This program is released as free software under the
| Affero GPL license. You can redistribute it and/or
| modify it under the terms of this license which you
| can read by viewing the included agpl.txt or online
| at http://www.gnu.org/licenses/agpl.html. Removal of this
| copyright header is strictly prohibited without
| written permission from the original author(s).
+--------------------------------------------------------*/
if (!defined("IN_FUSION")) { die("Access Denied"); }
$user_level = $userdata['user_level'] != 0 ? $userdata['user_id'] : '0';
//$result = dbcount("(online_user)", DB_ONLINE, "online_user=" . $user_level . " AND online_ip=INET_ATON('" . USER_IP . "') LIMIT 1");
$time = time();
if (isset($_COOKIE['online_user']) && isnum($_COOKIE['online_user'])) {
if (($time - $_COOKIE['online_user']) >= 45) {
$result = dbquery("UPDATE ".DB_ONLINE." SET online_lastactive='".$time."' WHERE online_user='".$user_level."' AND online_ip=INET_ATON('".USER_IP."') LIMIT 1");
}
} else {
if (iMEMBER) {
$result = dbquery("INSERT INTO ".DB_ONLINE." (online_user, user_name, user_status, online_ip, online_lastactive) VALUES ('".$user_level."', '".$userdata['user_name']."', '".$userdata['user_status']."', INET_ATON('".USER_IP."'), '".$time."')");
} else {
$result = dbquery("INSERT INTO ".DB_ONLINE." (online_user, online_ip, online_lastactive) VALUES ('".$user_level."', INET_ATON('".USER_IP."'), '".$time."')");
}
}
$result = dbquery("DELETE FROM ".DB_ONLINE." WHERE online_lastactive<".($time-60)."");
setcookie('online_user', $time, $time+45);
openside($locale['global_010']);
$result = dbquery("SELECT online_user AS user_id, user_name, user_status FROM ".DB_ONLINE);
$guests = 0; $members = array();
while ($data = dbarray($result)) {
if ($data['user_id'] == '0') {
$guests++;
} else {
$members[$data['user_id']] = $data;
}
}
$count_members = count($members);
echo THEME_BULLET." ".$locale['global_011'].": ".$guests."<br /><br />\n";
echo THEME_BULLET." ".$locale['global_012'].": ".$count_members."<br />\n";
if ($count_members > 0) {
$i = 1;
foreach ($members as $data) {
echo "<a href='".BASEDIR."profile.php?lookup=".$data['user_id']."' class='side'>".$data['user_name']."</a>";
echo ($i != $count_members ? ", " : "<br />");
$i++;
}
}
unset($members, $count_members);
echo "<br />\n".THEME_BULLET." ".$locale['global_014'].": ".number_format(dbcount("(user_id)", DB_USERS, "user_status<='1' LIMIT 1"))."<br />\n";
if (iADMIN && checkrights("M") && $settings['admin_activation'] == "1") {
echo THEME_BULLET." <a href='".ADMIN."members.php".$aidlink."&status=2' class='side'>".$locale['global_015']."</a>";
echo ": ".dbcount("(user_id)", DB_USERS, "user_status='2'")."<br />\n";
}
$data = dbarray(dbquery("SELECT user_id, user_name, user_status FROM ".DB_USERS." WHERE user_status='0' ORDER BY user_joined DESC LIMIT 1"));
echo THEME_BULLET." ".$locale['global_016'].": <a href='".BASEDIR."profile.php?lookup=".$data['user_id']."' class='side'>".$data['user_name']."</a>\n";
closeside();
?>
Edytowane przez bartek124 dnia 02.10.2010 23:11:31
Nie pomagam na komunikatorach oraz PW!
|
|
|
|
Gutek1806 |
Dodany dnia 03.10.2010 12:47:55
|
Przedszkolak
Postów: 65 Pomógł: 3
Data rejestracji: 08.07.2009 23:19
|
Nic nie pomogło, obciążenie nadal jest tak duże.
|
|
|
|
pajoman22 |
Dodany dnia 03.10.2010 13:10:11
|
Przedszkolak
Postów: 42 Pomógł: 6 Ostrzeżeń: 2
Data rejestracji: 17.02.2010 21:09
|
Może zainteresuj się tym http://whos.amung...
|
|
|
|
bartek124 |
Dodany dnia 03.10.2010 13:12:34
|
Weteran
Postów: 3264 Pomógł: 236
v7.02.06 Data rejestracji: 26.05.2007 12:25
|
Tego typu widgety to żadne zamienniki. Chodzi o optymalizację kodu PHP-Fusion.
Nie pomagam na komunikatorach oraz PW!
|
|
|
|
Pieka |
Dodany dnia 03.10.2010 13:30:30
|
Postów: 19882 Pomógł: 767
v7.02.03 Data rejestracji: 23.02.2005 18:12
|
Dokladnie. Tu nie chodzi o jakies atrapy, tylko o poprawe wydajnosci kodu, ktory jak widac przy bardzo obleganej stronie obciazajac baze katuje moim zdaniem bardzo wydajny procesor. Trzeba to jak najszybciej poprawic.
Jestem jaki jestem
|
|
|
|
Gutek1806 |
Dodany dnia 06.10.2010 16:26:15
|
Przedszkolak
Postów: 65 Pomógł: 3
Data rejestracji: 08.07.2009 23:19
|
Co zrobić z pif_global_cache.php bo jak dodałem do głównego folderu to zamiast panelu wyświetla się Access Denied
|
|
|
|
Pieka |
Dodany dnia 06.10.2010 16:28:41
|
Postów: 19882 Pomógł: 767
v7.02.03 Data rejestracji: 23.02.2005 18:12
|
Z tego, co widac w pliku wymagana jest wtyczka Pimped Fusion, bez tego nie ruszy.
A wywala poniewaz jest wpis zabezpieczajacy:
if (!defined("PIMPED_FUSION")) { die("Access Denied"); }
Jestem jaki jestem
|
|
|
|
Gutek1806 |
Dodany dnia 06.10.2010 20:45:27
|
Przedszkolak
Postów: 65 Pomógł: 3
Data rejestracji: 08.07.2009 23:19
|
Teraz wywala błędy
Warning: array_key_exists() [function.array-key-exists]: The second argument should be either an array or an object in /home/gutek1806/domains/ls-world.pl/public_html/pif_global_cache.php on line 39
· Gości online: 31
· Użytkowników online: 93
Fatal error: Call to undefined function profile_link() in /home/gutek1806/domains/ls-world.pl/public_html/infusions/online_users_panel/online_users_panel.php on line 27
|
|
|
|
Gutek1806 |
Dodany dnia 07.10.2010 15:42:32
|
Przedszkolak
Postów: 65 Pomógł: 3
Data rejestracji: 08.07.2009 23:19
|
Błędów już nie ma, ale statystyki dla Admina wyświetlają się normalnie, lecz jak mi się pokazało 16 gości 47 zalogowanych to już się to nie zmienia, a innym wywala całą listę
Notice: Undefined index: hide_userprofiles in /home/gutek1806/domains/ls-world.pl/public_html/maincore.php on line 844
Admin,
|
|
|