Азбука/Знакомства
Служба Знакомств
База данных
Использование базы:
- В чате: /var/www/chat.azbyka.ru/app/server/config.json
- В СЗ: /var/www/znakomstva.azbyka.ru/znakomstva/application/settings/database.php
- Для Тестов: azbyka.ru/znakomstva/application/settings/database.php
Проблемы
Статистика по нагрузке
20.10.13, 00:53, "Vitaly Lipatov" <lav@etersoft.ru>": Вот статистика нагрузки (за прошедшую неделю) по серверу постранично. Видно, что всю нагрузку делает СЗ (около 70%).
% Время, с Кол-во Ср.время (мс) 14.0 61060.717 208426 293.0 azbyka.ru/znakomstva/ 13.0 56346.885 130139 433.0 azbyka.ru/znakomstva/dnevniki.htm 10.0 44853.448 126983 353.0 azbyka.ru/znakomstva/index.php?module=community&file=prosmotr 9.0 40557.964 147580 275.0 azbyka.ru/znakomstva/c/chat/send_message 6.0 27300.267 115241 237.0 azbyka.ru/znakomstva/index.php?module=community&file=user 5.0 24235.245 121887 199.0 azbyka.ru/znakomstva/index.php?module=community&file=history 4.0 19375.514 10387 1865.0 azbyka.ru/znakomstva/index.php?module=community&file=add_foto 3.0 13272.869 119722 111.0 azbyka.ru/znakomstva/c/chat/reset_new 2.0 9943.398 106273 94.0 azbyka.ru/znakomstva/c/chat/check_new_message 2.0 9731.134 95529 102.0 azbyka.ru/znakomstva/index.php?module=community&file=login
Последняя колонка — это время обработки запроса.
По поводу главной страницы — нужно посмотреть, там наверняка создаётся php-сессия. Надо сделать, чтобы сессия создавалась только для залогиненных пользователей. В принципе, это касается всех страниц СЗ. С другой стороны, сессии нам будут мешать расти, это неподходящий механизм, нужно определиться, зачем мы его используем, и отказаться от него.
На главной явно есть что закэшировать в memcached. Например, Новые участники. Этот блок должен в готовом виде выдаваться всем одинаковым. То же с новым фото.
По поводу фоток. Они хранятся в трёх размерах, как я понял. 1. Нельзя класть все фотографии в один каталог. Сейчас там уже больше 100 тыс. изображений в каждом. Я бы не стал хранить больше 10 тыс. в одном каталоге. Это вызывает проблемы с производительностью (никто не знает, какая у нас файловая система и не ищет ли она файлы в каталоге перебором). 2. Вообще там конечно не фотки, а произвол. Хорошим вариантом было бы давать своё уникальное имя фотографии (id пользователя + хэш от содержимого файла, например), а не принимать имя какое есть. 3. Я подозреваю, что там много неактуальных фотографий, на которых нет ссылки в базе.
Чем занимается send_message так долго (0.3 секунды почти) не знаю, но ещё раз предлагаю перенести её в nodejs. То же про какой-то reset_new и check_new_message.
Некэшированный внешний запрос
При обращении к страницам знакомств идёт обращение к http://azbyka.ru/forum/blog_external.php?bloguserid=727 причём без кэширования.
Эта ссылка встречается в следующих файлах:
modules/news/_dnevnik.php: $url_rss = "http://azbyka.ru/forum/blog_external.php?bloguserid=727"; modules/news/comment.php: $url_rss = "http://azbyka.ru/forum/blog_external.php?bloguserid=727"; modules/news/dnevnik.php: $url_rss = "http://azbyka.ru/forum/blog_external.php?bloguserid=727"; modules/news/dnevnik2-17.php: $url_rss = "http://azbyka.ru/forum/blog_external.php?bloguserid=727"; modules/news/izb.php: $url_rss = "http://azbyka.ru/forum/blog_external.php?bloguserid=727"; modules/news/my.php: $url_rss = "http://azbyka.ru/forum/blog_external.php?bloguserid=727"; modules/news/search.php: $url_rss = "http://azbyka.ru/forum/blog_external.php?bloguserid=727";
Что нужно сделать:
- . Код обращения к этому url_rss оставить только в одном файле, а не копировать по разным
- . Удалить лишние, неиспользуемые файлы
- . Применить для кэширования готовое решение Cache:Lite: http://pear.php.net/package/Cache_Lite/docs
Подобная история и с frss.php Остаётся неясным, пишется cache_rss.xml в frss/cache_rss.xml или прямо в /cache_rss.xml
Пропавший overlay.png
В style.css прописана загрузка /znakomstva/images/admin/overlay.png, но самого файла нет.
last.info и напоминания
В index.php проверяется last.info Было бы неплохо вынести это из главной страницы Знакомств (сейчас случайно выбранному человеку замедляется показ страницы путём отправки в это время писем для всех, кому пришло время напомнить).
Лучше сделать отдельным файлом, который вызывать по cron.
Использование opendir и readdir
В частности, для http://azbyka.ru/znakomstva/index.php?module=news&file=add вызывается файл /home/azbyka/www/azbyka.ru/znakomstva/modules/news/add.php в котором используется конструкция вида
$handle=@opendir($smiles_path); while(false!==($file=@readdir($handle))) { }
Всё это недопустимо. Нельзя добавлять @. Нельзя не проверять $handle. Нельзя сравнивать результат readdir с false (и через ==). В итоге получаем бесконечный цикл. Я вроде уже раньше писал об этом. Это действо по замене смайликов должно быть функцией.
Запросы к базе
Запросы к базе без использования индексов.
Запрос FROM a_messenger_messages
К таблице azbyka_znakomstv кто-то делает запрос вида
SELECT * FROM a_messenger_messages WHERE (fromid='23704' AND toid='35199' AND hide_from=0) OR (toid='23704' AND fromid='35199' AND hide_to=0) ORDER BY id DESC LIMIT 0,20;
Он выполняется более 3 секунд, что ненормально долго. Проблема в том, что индексы для таблицы совершенно не подходят для этого запроса.
Ситуация выглядит так:
# Query_time: 4.032949 Lock_time: 0.000051 Rows_sent: 3 Rows_examined: 2364018
Чтобы сделать запрос без использования кэша:
SELECT SQL_NO_CACHE
Запрос FROM a_dnevnik_comments
SELECT COUNT(DISTINCT did) FROM a_dnevnik_comments; SELECT * FROM a_dnevnik_comments GROUP BY did ORDER BY data DESC LIMIT 10770,30;
Запрос FROM a_forum_topics_visits
SELECT COUNT(*) FROM a_forum_topics_visits WHERE tid='4683' AND data>'1337333621';
Запрос FROM a_dnevnik
SELECT COUNT(*) FROM a_dnevnik WHERE hidden='0' AND no_comments='0' AND uid NOT IN (21753);
Запрос FROM a_dnevnik_comments
SELECT * FROM a_dnevnik_comments GROUP BY did ORDER BY id DESC LIMIT 53040,30
Ссылки
- Про Using where и индексы: http://alegenk.livejournal.com/19188.html
Отправка писем
Код отправки писем накопирован много раз в разных местах. Отчёты о недоставке приходят на разные адреса. Это потому что в качестве обратных так указано, и ещё адреса для доставки писем с ошибками не указаны. Надо сделать общий адрес и поставить обработку этих писем с ошибками. Также надо правильно закодировать заголовки писем (используя правильный код для отправки писем).
=== Замечания по коду: Нужно посмотреть в описании функции file_put_contents значение 3-го параметра
+function MyLOG($mess) {^M + $tmp = file_get_contents($_SERVER['DOCUMENT_ROOT']."/znakomstva/modules/news/dne.log");^M + file_put_contents($_SERVER['DOCUMENT_ROOT']."/znakomstva/modules/news/dne.log", $mess . "\r\n" . $tmp);^M
Что хотели сказать этим кодом:
<script type="text/javascript"> window.___azcfg = {api: 'http://azbyka.ru/days/api'}; (function() { var el = document.createElement('script'); el.type = 'text/javascript'; el.async = true; el.src = 'http://azbyka.ru/days/assets/js/api.js'; var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(el, s); })(); </script>