Азбука/Знакомства

Материал из Etersoft wiki
Перейти к: навигация, поиск

Служба Знакомств

База данных

Использование базы:

  • В чате: /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";

Что нужно сделать:

  1. . Код обращения к этому url_rss оставить только в одном файле, а не копировать по разным
  2. . Удалить лишние, неиспользуемые файлы
  3. . Применить для кэширования готовое решение 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

Ссылки

Отправка писем

Код отправки писем накопирован много раз в разных местах. Отчёты о недоставке приходят на разные адреса. Это потому что в качестве обратных так указано, и ещё адреса для доставки писем с ошибками не указаны. Надо сделать общий адрес и поставить обработку этих писем с ошибками. Также надо правильно закодировать заголовки писем (используя правильный код для отправки писем).

=== Замечания по коду: Нужно посмотреть в описании функции 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>