Шортики — короткие и смешные, или как мы готовили сайт к Хабраэффекту



    Намба 0: Вступление

    Однажды, задумчиво листая башорг, я вдруг понял, что большинство цитат довольно длинные и очень часто их просто лень читать. В наш век всеобщей спешки — на это уходит много времени. Таким образом родился новый формат: Шортики (от английского слова Short — короткий). Шортик — это короткая (из одного-двух предложений) шутка, жестко ограниченная 255 символами (чтобы не повадно было).

    Как раз в этот момент я хотел подучить программирование и искал несложную задачу. Сайт я накидал довольно быстро — за пару вечеров, рассказал о нем коллегам по работе и паре знакомых в IRC, и собирался уже о нем забыть, как вдруг обнаружил, что за два дня сайт посетило 500 человек, из которых чуть ли не треть подписалась на RSS. Стало понятно, что концепция людям понравилась. Немного прилизав сайт внешне, я решился показать его Хабрасообществу — Шортики — короткие и смешные, прошу любить и жаловать.

    P.S. Учитывая то, что это не совсем стартап (проект пока некоммерческий, да и «стартап» — слишком громкое слово для моей поделки), приобретенная за годы пребывания на сайте хабрасовесть не позволила мне написать нетехническую статью. Поэтому, под катом вас ждет занимательная история о том, как мы готовили Шортики к Хабраэффекту.



    Намба 1: Ресурсы

    У любого веб-проекта, и особенно у стартапа, всегда есть резкие наплывы посещамости, вызванные разными причинами — публикация статьи на крупном ресурсе (например, на Хабре), пресс-релиз, рекламная кампания, неожиданное упоминание в новостях, итд. Часто (как в последнем примере) всплеск посещаемости происходит ВНЕЗАПНО™.

    Это подталкивает к важному выводу — поместить ресурс с посещаемостью в 100к уников в день на начальном VPS за 200 рублей, конечно, можно. Это будет большой повод для гордости в кругу друзей-гиков, однако, скорее всего, приведет к падению сайта в самый ответственный момент. Вообще, хорошо, когда веб-продакшн система работает в обычном режиме не более чем на 10% от ее мощности. Это позволит ей выстоять в момент всплеска посещаемости. Исходя из всего этого, даже такой «легкий» сайт как Шортики лучше поставить на сервер с приличным запасом мощности.

    Намба 2: FrontEnd и Backend

    Одна из первых заповедей оптимизации веба гласит — разделяй контент статический и динамический. Сделаем мы это стандартным решением: Nginx на фронтенд, Apache слушает на 127.0.0.1. Nginx отдает статический контент, а если видит, что запрос идет к динамическому — отдает запрос «внутрь» апачу:

    server {

        listen     10.0.121.124:80;
        server_name   shortiki.com www.shortiki.com;

        # Унифицируем домен

        if ($host = 'www.shortiki.com' ) {
          rewrite ^/(.*)$ http://shortiki.com/$1 permanent;
          }

        access_log   /var/log/vhosts/nginx-shortiki.com-access.log main;

        # Статику отдает нгинкс, пусть браузеры возвращаются за ней раз в месяц. А логи запросов к картинкам нам не нужны.

        location ~ ^.+\.(html|jpg|jpeg|gif|png|ico|css|js)$ {

        root /usr/home/vhosts/shortiki;
        expires 30d;
        access_log off;

        }

        location / {

        proxy_pass   http://127.0.0.1:8081;
        # Здесь в нашем случае можно придумать хитрое кеширование, но это тема для отдельной статьи
        }
    }


    * This source code was highlighted with Source Code Highlighter.


    Намба 3: MPM

    Сегодня Apache умеет работать в двух основных вариантах MPM (Multi-Processing Modules, они определяют, каким образом веб-сервер работает с тредами/дочерними процессами, итп) – prefork и worker.

    Prefork работает по следующей схеме – много процессов, один тред на процесс, процессы обрабатывают запросы. Prefork отличается стабильностью, однако потребляет больше памяти и работает медленнее чем worker.

    Worker отличается тем, что использует много процессов, много тредов на каждый процесс, запросы обрабатывают треды. Работает worker намного быстрее конкурента и использует меньше памяти, но изоляция между процессами у него неполноценная, что может создать проблемы на сайтах, где есть сессии, регистрации, ну и прочие важные данные. Учитывая популярность префорка, мы будем разбирать оптимизацию на его примере, хотя, в моем случае, с Шортиками логичнее использовать worker.

    Намба 4: Accept-фильтры

    Accept-фильтры (в данном случае) представляют собой модуль ядра, который буферизирует входящие соединения, и передает запрос веб-серверу только тогда, когда полностью получен корректный HTTP запрос.

    В моем случае используется FreeBSD, следовательно, подгружаем модуль:

    # kldload accf_http

    Делаем так, чтобы модуль подгружался при каждой загрузке системы:

    echo 'accf_http_load="YES"' >> /boot/loader.conf

    Настраиваем серверы, для апача:

    AcceptFilter http httpready

    И nginx:

    listen 10.0.121.124:80 default sndbuf=16k rcvbuf=8k accept_filter=httpready

    И перезапускаем веб-серверы:

    /usr/local/etc/rc.d/nginx reload
    /usr/local/etc/rc.d/apache22 restart


    Намба 5: Тюнинг Apache

    Тюнинг Apache традиционно начинается с самой главной рекомендации — первым делом необходимо отключить лишние модули. После того, как ненужные модули выброшены, начинаем подкручивать основные настройки:

    MaxClients – параметр, указывающий максимально количество одновременных соединений, которые может держать сервер. Если MaxClients = 300, то при 301 одновременном запросе, последний запрос встанет в очередь, и будет ждать, пока один из процессов освободится, чтобы его обслужить. Основной ресурс, ограничивающий MaxClients, это оперативная память – 300 созданных дочерних процесса апача должны поместиться в памяти одновременно. Обычно принято высчитывать MaxClients исходя из количество свободной памяти:

    MaxClients = СвободнаяПамять / РазмерПроцессаАпача

    Размер дочернего процесса Apache можно посмотреть в колонке RSS вывода команды top или ps.

    Отключаем AllowOverride:

    <Directory />
    AllowOverride none
    </Directory>


    * This source code was highlighted with Source Code Highlighter.


    Дело в том, что если оставить его его включенным, это заставит апач каждый раз делать запрос к файловой системе, проверяя есть ли файл .htaccess.

    Выключаем ExtendedStatus (добавляет 1 или 2 системных вызова на каждый реквест):

    ExtendedStatus Off

    Добавляем FollowSymLinks для веб-директории, иначе Apache каждый раз будет делать проверку симлинк перед ним или файл:

    <Directory />
    Options FollowSymLinks
    </Directory>


    * This source code was highlighted with Source Code Highlighter.


    Уменьшаем таймайут:

    Timeout 10

    Добавляем сжатие некоторых типов данных (экономит много трафика):

    <Location />
    AddOutputFilterByType DEFLATE text/html text/plain text/css text/xml application/x-javascript
    </Location>


    * This source code was highlighted with Source Code Highlighter.


    MinSpareServers и MaxSpareServers – эти параметры, указывающие, какое количество дочерних процессов держать «в холостую». Например, если сейчас запросами заняты четыре процесса, а MinSpareServers равен 2, то апач запустит еще 2 процесса, которые будут простаивать в ожидании запросов. Хитрость в том, что создание нового процесса – относительно ресурсоемкая задача, и, в принципе, настройки тут сводятся к тому, чтобы избежать ситуации, когда сервер начинает постоянно создавать/убивать процессы.

    MinSpareServers 2
    MaxSpareServers 8


    При таких настройках, апаче всегда будет держать 2 процесса в ожидании запросов, но в то же время, если простаивает уже 8 или более процессов – начнет их прибивать, освобождая ресурсы.
    Перед Хабраэффектом можно поставить и побольше:

    MinSpareServers 8
    MaxSpareServers 32


    StartServers – количество дочерних процессов, которые Apache создаст при запуске. Если StartServers меньше MinSpareServers, то апач догонит значение до MinSpareServers. Эта настройка зависит от изначальной нагрузки на сайт, и количества ресурсов в нашем случае:

    StartServers 8

    MaxRequestPerChild указывает сколько запросов обработает процесс перед тем, как будет убит и запущен новый вместо него. Это делается для того, чтобы нивелировать влияние утечек памяти. Если ваш код написан хорошо и у вас нет таких проблем – можно смело повышать значение, однако выше 10000 ставить не рекомендуется, раз в 10000 запросов передернуть процесс это не страшно, зато хорошая профилактика.

    MaxRequestPerChild 3000

    KeepAlive – настройка, позволяющая обработать несколько запросов в пределах одной TCP сессии, и не открывать новую сессию на каждый запрос. Важно оставить значение KeepAliveTimeout низким, т.к. при большом количестве запросов много процессов будут проводить время в ожидании, и тогда апачу нужно будеть запускать еще процессы.

    KeepAlive On
    KeepAliveTimeout 5


    Намба 6: Тюнинг PHP

    В нашем конкретном случае, мы сведем тюнинг php к установке php модуля memcache и самого memcached демону, поскольку все остальные параметры особо не повлияют на производительность. В FreeBSD это просто:

    cd /usr/ports/databases/pecl-memcache
    make install clean

    cd /usr/ports/databases/memcached
    make install clean


    Намба 7: Добавляем мемкеш

    Почти все пользовали, которые зайдут на сайт — зайдут с главной страницы. Следовательно, ее важнее всего оптимизировать. На главной странице у нас один SQL запрос, который берет из базы 20 самых свежих шортиков:

    SELECT sid, sdate, stext, srating FROM quotes ORDER BY id ASC LIMIT $shortik_first, $shortiks_main

    * This source code was highlighted with Source Code Highlighter.


    Лезть в базу каждый раз при открытии страницы нет смысла, а посему, легким движением руки запрос превращается в:

    // Устанавливаем соединение с Memcached

    $mem = new Memcache();
    $mem->connect('localhost', 11211);

    // Обнуляем переменные

    $quotesonpage = '';

    // Проверяем есть ли в мемкеше нужная запись

    if ( !$mem->get['s_main'] ) {

    // Если нет - забираем ее из MySQL...

    $connect = @mysql_connect ($server, $user, $pass) or die('Could not connect: ' . mysql_error());
    @mysql_select_db("ShoDB");

    $query = "SELECT sid, sdate, stext, srating FROM quotes ORDER BY id ASC LIMIT $shortik_first, $shortiks_main";

    @mysql_set_charset('utf8',$connect);

    $get_smain = mysql_query ($query) or die('Cannot execure query: ' . mysql_error());

    $quotesonpage = array();
    while ($shortik = mysql_fetch_assoc($get_smain)) {
     $quotesonpage[] = $shortik;
    }

    $quotesonpage = array_reverse($quotesonpage);

    // ...и добавляем в memcache, с временем жизни в полчаса (1800 секунд).

    $mem->set('quotes', $quotesonpage,MEMCACHE_COMPRESSED,1800);
    } else {
    $quotesonpage = $mem->get['quotes'];
    }


    * This source code was highlighted with Source Code Highlighter.


    Таким образом, при любом количестве пользователей, нагрузка главной страницы на MySQL равна одному запросу в полчаса. Разумеется, свежие шортики будут появляться на сайте с задержкой в полчаса, но это не страшно.

    Намба 8: Милости просим :)


    Добро пожаловать на Шортики! Надеюсь сайт будет так же тепло принят, как и в узком кругу тех, кто приходил в первые дни жизни ресурса.

    Напоминаю, что изначальная цель проекта была в том, чтобы подтянуть навыки программирования, так что не стреляйте в пианиста программиста, он пишет как может :)
    AdBlock has stolen the banner, but banners are not teeth — they will be back

    More
    Ads

    Comments 205

      +5
      //… и добавляем в memcache, с временем жизни в 2 часа.
      отличный пример неверного комментария и магических констант :)
        0
        Это опечатка :)
        Спасибо, исправил.
          +1
          магическая константа никуда не делась =)
      • UFO just landed and posted this here
          +1
          А вот это мы сейчас и проверяем :)
          • UFO just landed and posted this here
              +5
              На java всё так же, только вместо apache — tomcat или jetty. А иногда не вместо, а вместе.
              • UFO just landed and posted this here
                  +11
                  index.html еще лучше. Отказываемся от java и пр.? =)
                    0
                    хм, а если генерировать index.html по событию(триггеру?) обновления базы данных.
                    Или nginx не перепроверяет обновление статики?
                      0
                      Проверяет, почему нет.
                    +2
                    Мого діда дядя нагрузку держит лучше, а томкат — только в ваших мечтах.
                    –3
                    И Вебсфера.
                      0
                      На хабре не слышали про WAS, JEE Container от IBM?
              +7
              На главной странице вы получили классическую гонку. Раз в полчаса кэш будет чиститься и все пришедшие клиенты полезут в базу. При большом числе клиентов может случиться упс.
                0
                Вообще в случае очень посещаемых главных разумно их генерировать по крону на стороне сервера в обычную статику .html
                  +9
                  И крон не нужен — генерировать статические страницы при добавлении цитат.
                  –2
                  В базу полезет только первый. Остальные — в мемкеш.

                  Теоретически, при очень большой посещаемости может произойти ситуация, при которой в базу пойдут все, кто успеет сделать запрос МЕЖДУ тем как произойдет выборка из базы и тем, что она будет вставлена в memcache. Даже при тысяче запросов в секунду, врядли это будет больше десятка человек.
                    +9
                    Я как раз и говорю про ту ситуацию, которую вы считаете теоретической. Конечно, если на сайт будет один запрос в минуту, то всё будет в порядке. Но статья ведь про хабраэффект?

                    Возьмите какую-нибудь утилитку для нагрузочного тестирования, заставьте её делать 1000 запросов в секунду на главную, сбросьте кэш и посмотрите, что получится.

                    Можете ещё вот это почитать, там есть варианты решения проблемы.
                  +24
                  Справа куча иконок «поделиться» — от них рябит в глазах. Неужели нельзя сделать просто надпись «поделиться» и при наведении появляется див со всеми иконками? Можно через position absolute или просто рядом.

                  Вы сами представляете, откуда будете брать трафик? А как будете повышать процент возвращающихся?
                  Разработать небольшой проект под высокие нагрузки — это даже не пол работы, а гораздо меньше. Раскрутить и удержать пользователей — вот где собака зарыта. Сейчас клонов башорга сотни, а с такими плоскими баянами так больше, чем фотографов.

                  Ничего личного, удачи в развитии.
                    +2
                    Вы правы, сделали получше шеринг.

                    Насчет трафика — да я, собственно, вообще не собирался никому сайт показывать. Но люди стали друг другу ссылки кидать, просили добавить еще шортиков. На мой личный вкус, юмор на шортиках качественнее, чем на том же башорге.

                    Шортики — это ни в коем случае не клон башорга или какого-нибудь рейтинга статусов. Шортики — это место сбора хороших коротких шуток, не цитат, не статусов и не историй. Мне кажется, это интересный формат.

                    Спасибо за пожелание! :)
                      +1
                      Еще по трафу и шарингу. Надо сделать авторизацию через популярные сети (фб, вк, г+) и при клике мне нравится чел автоматом шарит понравившийся шортик туда откуда вошел. В итоге к вам придет траф с его друзей.
                        0
                        Собственно «поделиться» равносильно «нравится», вот я к чему.
                          0
                          А как же сети Twitter и Мой Мир Mail.ru? Первая должна быть в силу схожести формата, вторая из-за любви ее пользователей к комментированию статусов
                          Поставите «Нравится» от Mail.ru и трафик, аналогичный Хабраэффекту вам обеспечен!
                            0
                            Это само собой подразумевалось. Или вы на самом деле думаете, что я буду указывать все популярные социальные сети? :)
                              0
                              Просто был указан г+, который все еще не так популярен, как Твиттер, которого не было, и я подумал, что это не случайно.
                          +3
                          Мб надпись «Нравится!» над шуткой сделать в виде сердечка? А то сразу не заметишь…
                          Ну а так, Шортики понравились :) Первая запись на странице расположила меня к Вашему сервису сразу: «Израильский SQL-сервер отвечает запросом на запрос.» :D
                            +1
                            Шортики — это ни в коем случае не клон башорга или какого-нибудь рейтинга статусов. Шортики — это место сбора хороших коротких шуток, не цитат, не статусов и не историй. Мне кажется, это интересный формат.

                            Хорошая штука.

                            «Нуждики» напомнило, если кто помнит )
                          +3
                          Опера 11.50, win7. При клике на ссылку «Что такое шортик?», ничего не происходит.
                            0
                            По клику вроде и не должно, там текст появляется при наведении мышой. В Опере не появляется?
                              +8
                              Всплывающей подсказкой? Ну вы блин даете, если что-то выглядит как ссылка и с первого взгляда ведет себя как ссылка, то оно и должно быть ссылкой. А раз так, сделайте хотя бы курсор другой, например стрелку со знаком вопроса.
                              Кстати, ИМХО, слишком много линий у вас на странице, тяжело читать. А так спасибо, сижу смеюсь;)
                                0
                                В таком случае нет резона делать ссылку на # — достаточно просто атрибута title внутри, например, того же span.
                                  +5
                                  Тогда по традиции эта ссылка должна быть подчеркнута пунктирной линией.
                                    0
                                    Так и сделаем чуть позже.
                                      0
                                      Сами-знаете-кто рекомендует так.
                                      0
                                      Мне кажется dotted здесь будет более уместен.
                                      Dashed — это как правило, действие по нажатию без перезагрузки, а dotted — действие по наведению (например, всплывающая подсказка).
                                –7
                                Bash.org?
                                  +2
                                  Автор уже ответил на этот вопрос в комментариях.
                                    –5
                                    Даже bash.org смешнее. На сайте автора поста практически все «шутки» достойны максимум «Аншлага» или страниц календаря с Петросяном.
                                    • UFO just landed and posted this here
                                    +2
                                    А просто добавить proxy_cache в nginx чем не вариант?
                                      0
                                      С этим не все так просто, особенно на странице с рейтингом или случайными шортиками.

                                      Я решил что это тема для отдельной подробной статьи и оставил все по-простому. На самом деле у нас кеширование чуть посложнее организовано.
                                        0
                                        Ну так для индекса самое то
                                      0
                                      А мне нравится и идея и реализация! Обновлять часто будете?
                                        0
                                        А как же. Ежедневно :)

                                        Спасибо за отзыв!
                                        +10
                                        Картинка к посту просто требует этого:
                                        image
                                          +1
                                          Сорри, картинку делали второпях. Справедливость восстановлена!
                                            +1
                                            Да ну, за что вы извиняетесь. Хороший повод улыбнуться дали :)
                                          –3
                                          Вы зря кешируете на уровне запросов. Если можно закешировать всю страницу целиком, то так и надо делать (А если нельзя — надо постараться, чтобы было можно).
                                            0
                                            Вы правы, но учитывая что я совсем новичок в программировании и работал над сайтом только пару вечеров — это было бы чересчур :)
                                              –3
                                              За такие советы вас надо нещадно минусовать.
                                                +1
                                                То есть вы считаете, что full page cache на прокси — это не самый простой и эффективный способ кеширования? Почему?
                                                  0
                                                  Потому, что надо не только кэшировать, но и инвалидировать кэш.

                                                  Для такого проекта как «Шортики» делать это эффективнее когда страница собирается из разных источников на сборщике, пусть даже этот сборщик — PHP.

                                                  А для проектов, где страница разная для каждого пользователя, постоянная динамическая сборка — единственный возможный метод, если вы не хотите получить эн факториал файлов на диске.

                                                  Кроме того, в ряде случаев это и работает быстрее, так как тратится только CPU, а не происходит seek по диску в поисках файла и его отдаче.

                                                  О сборщике на основе nginx читать тут: habrahabr.ru/blogs/nginx/119582/
                                                    +4
                                                    Вы шутите? У проекта шортики полностью статическая главная страница (для всех). На ней один запрос, который кешируется по времени. Пейдж кэш не всегда можно использовать. Но в конкретном случае и в конкретных условиях это очень хороший вариант…

                                                    P.S.
                                                    Кстати, о конкретной технологии кеша, и как его хранить (почему сразу файлы?) я ничего не говорил…

                                                      0
                                                      Свободен. Qui potest capere, capiat.
                                              +39
                                              Подскажите, а зачем в этой связке вообще Apache? Не будет ли оптимальнее nginx+php_fpm?
                                                0
                                                простите если глупость спрашиваю, но
                                                Добавляем сжатие некоторых типов данных (экономит много трафика):
                                                для чего эти строки сжатия статики если статику отдает nginx?
                                                  +3
                                                  Сжатие идет по типу mime, а тип может устанавливаться и динамически. Выводимые из apache данные ведь вполне-таки text/html =)
                                                    0
                                                    Именно :)
                                                      0
                                                      Только вот у меня есть подозрение, что этот фильтр работает только на статику, и не работает на вывод всяких mod_php.
                                                  –3
                                                  чем то смахивает на зарубежный проект reddit.
                                                    0
                                                    Можно узнать — чем? :)
                                                      0
                                                      мне так показалось, без каких либо причит. это не утверждение.
                                                    –8
                                                    Автор, ну ведь вся статья же свелась к использованию memcache_set() / memcache_get() для защиты от Хабраэффекта. Все остальные вещи разжеваны в куче статей. Ну не стыдно?

                                                    Насчет того, что запустил проект и не постеснялся представить — молодец в любом случае.
                                                      +15
                                                      проект пока некоммерческий

                                                      Чем тогда объяснить наличие аж двух баннеров?
                                                        0
                                                        Некоммерческий = не извлекающий прибыли. Копейки накапавшие с адсенса уйдут на оплату сервера.
                                                        На самом деле баннеров должно было быть меньше и они должны были быть аккуратнее, но мы не успели доделать новый вид сайта и решили запускаться как есть.

                                                        Позже мы сделаем баннеры менее заметными.
                                                          0
                                                          > но мы не успели доделать новый вид сайта и решили запускаться как есть.

                                                          А куда торопились? Или нужно было по любому запустить 9 августа.
                                                            +12
                                                            Просто у меня сегодня выходной :)
                                                            +5
                                                            В утиль адсенс, «Московские индивидуалки» — вот реальный заработок сайтам развлекательной тематики, куда не зайду — везде они. Видать очень выгодно размещать такие баннеры.
                                                              +5
                                                              Проект не ставит своей целью побольше заработать. Так что перебьемся, наверное, без индивидуалок :)
                                                                +7
                                                                Только блэкджек?=)
                                                                  0
                                                                  Только преферанс. И никаких куртизанок :)
                                                              +2
                                                              Не надо оправдываться) Думаю тут все понятливые. Просто не надо писать «не коммерческий», если сайт является коммерческим. «Копейки» это возможно пока, но сайт направлен именно на извлечение прибыли (будет посещаемость — будет прибыль). Но меня это ни чуть не задевает. Чтобы его поддерживать нужно тратить время, и деньги — нормальный стимул. Удачи.
                                                                +6
                                                                Я думаю, что некоммерческий проект — это проект у которого основная цель не извлечение прибыли. При этом получение прибыли не делает проект коммерческим.
                                                                  +1
                                                                  Более того, именно это ЕМНИП записано в ГК РФ. Некоммерческая организация имеет право получать прибыль, но обязана пускать ее на цели, указанные в ее уставе
                                                              +3
                                                              Принял P.S. за заминусованный комментарий и пытался нанести на него мышкой (:
                                                                +2
                                                                Разумеется, свежие шортики будут появляться на сайте с задержкой в полчаса, но это не страшно.

                                                                Решается очень просто — перезаписью кэша (или его сбросом, что проще, но хуже) при добавлении шортиков.
                                                                  0
                                                                  Именно так и сделали в итоге :)
                                                                  +1
                                                                  давно так не ржал, классная штука))
                                                                    0
                                                                    Тоже позависал с полчаса на чтении, добавил в избранное! ;-)
                                                                    +5
                                                                    Добавил Шортик, снова открылась та же форма, после сабмита, но с очищенными полями. Не понятно, добавился ли мой шортик или нет. Думаю было бы не плохо уведомлять пользователя, что все ок, шортик добавился!
                                                                      +1
                                                                      Спасибо, починили :)
                                                                      +2
                                                                      Экспорт цитат в популярные форматы (txt,pdf, etc.) — и будет вполне неплохая книжечка для заграничных поездок, к примеру. Мне лично всегда этого не хватало.
                                                                        0
                                                                        Взяли фичерреквест, думаем.
                                                                          0
                                                                          Угу, а лучше сразу в fortune на сервер.
                                                                          +1
                                                                          Интересные шутки, но вам бы дизайн поменять, а то сильно уныло, сайт вроде юмористический, но в то же время серый какой-то. Удачи в развитии!
                                                                            0
                                                                            Уже работаем над новым видом сайта. Спасибо!
                                                                            –2
                                                                            nginx + uWSGI наше всё
                                                                              +1
                                                                              Особенно для php
                                                                                0
                                                                                А это уже другой вопрос :)
                                                                              0
                                                                              Какая конфигурация сервера, если не секрет?
                                                                                0
                                                                                Обычный EQ6 от хецнера. Но Шортики — не единственный сайт на сервере.
                                                                                +1
                                                                                очень интересно стоил ли 1 запрос подобной оптимизации.
                                                                                пробовали отключать мемкеш?
                                                                                сколько запросов в пике?
                                                                                  0
                                                                                  Мемкеш отключать пробовали — нагрузка ощутимо вырастает.

                                                                                  В пике было около 100 запросов/сек.
                                                                                  +1
                                                                                  А я не понял, зачем на апаче keep-alive. Nginx ведь всё равно запросы к бэкенду делает без keep-alive.
                                                                                    0
                                                                                    Изначально тестинг шел самого апача напрямую, дабы выжать из него максимум. А уже после этого поставили нгинкс перед ним. Все верно, кипалайв надо убрать.
                                                                                    +7
                                                                                    Судя по статистике liveinternet.ru ресурс получил порядка 15000 просмотров за 2 часа (это около 2-х просмотров в секунду) с такой нагрузкой легко справится Apache и MySQL и без Ваших ухишрений.

                                                                                    P.S. шутки попадаются действительно смешные.
                                                                                      0
                                                                                      Но с ухищрениями серверу будет дышать легче. Так ведь? :-)
                                                                                        +3
                                                                                        Вы можете утверждать, что в какую-то секунду не было, например, 100 запросов?
                                                                                          0
                                                                                          Нет. Но я вижу, что сегодня нагрузка упала в 10 раз.
                                                                                            0
                                                                                            Как я угадал насчёт сотни :)
                                                                                              0
                                                                                              А сегодня (через день) нагрузка упала уже в 25 раз.
                                                                                              Так что мало оптимизировать проект нужно еще обеспечить стабильную посещаемость.
                                                                                                0
                                                                                                Это уже не технический вопрос. Но если бы сайт не выдержал хабраэффекта, то через день нагрузка может упала бы меньше относительно, но и абсолютные числа были бы меньшие.
                                                                                          0
                                                                                          Был пик на 100 запросов/сек. Кроме того, мы рассчитывали не «чтобы только на хабраэффект хватило», а с большим запасом прочности. По нашим тестам выдержал 2,000 запросов/сек.
                                                                                          +3
                                                                                          KeepAlive в On на апаче нет смысла ставить в случае еcли перед ним nginx
                                                                                            0
                                                                                            Изначально тестинг шел самого апача напрямую, дабы выжать из него максимум. А уже после этого поставили нгинкс перед ним.

                                                                                            Все верно, кипалайв надо убрать.
                                                                                            +2
                                                                                            Дело не в хаброэффекте :) Просто пока что у вас контент хороший, правда.
                                                                                              0
                                                                                              Спасибо :)
                                                                                              +5
                                                                                              С оптимизацией справились неплохо, а вот за это подавление ошибок:

                                                                                              @mysql_select_db("ShoDB");
                                                                                              

                                                                                              на серъёзном проекте я бы яйца Вам пооторвал бы 8)
                                                                                              Конечно, на трёхстрочном проекте на это можно забить, но только если развитие не предвидится. В любом случае, считаю, что писать лучше сразу нормально, используя преимущества языка, иначе внесение элементарных правок и дебаг будут занимать всё больше и больше времени.

                                                                                              Ещё мог бы посоветовать обратить внимание на стиль кодирования (возмите тот же Zend за основу), наблюдаются явные проблемы с именованием, табуляцией, запятыми, будущие Ваши команды оценят умение писать хороший, стилизованный код. В общем, успехов Вам, спасибо за интересную историю, Хабр торт! 8)
                                                                                                0
                                                                                                Вы забываете, что я ниразу не программист и не планирую быть таковым. Так что мне можно :)

                                                                                                А насчет нейминга — код упрощен и все переменные и названия баз изменены реплейсом, на самом деле там нормальный нейминг :)

                                                                                                Спасибо за отзыв :)
                                                                                                +4
                                                                                                а зачем там апач вообще?
                                                                                                php-fpm ресурсов жрет меньше и нету мутатнит с .htaccess
                                                                                                  +9
                                                                                                  Жуть >_< просто невозможно читать на вашем сайте, оформление аля «рамки рамковые» да еще с пунктирными бордюрами… все серо сливается и рябит перед глазами, так нельзя делать, очень сложно привыкнуть, приходится напрягаться чтобы вычитать что-то=\\

                                                                                                  Остается надеяться что завтра кто-нибудь придумает бугагашечки с комфортным оформлением оных)
                                                                                                    0
                                                                                                    Уже работаем над новым внешним видом. Спасибо за отзыв.
                                                                                                    +4
                                                                                                    Автору Bogr под Android, если он видит это сообщение — пусть добавит в свое детище этот сайт.
                                                                                                    +2
                                                                                                    Сделал трансляцию потока на ВКонтакте: vkontakte.ru/shortiki_com
                                                                                                    Сейчас пока первичный импорт не закончился немного засирает ленту, но осталось немного :)
                                                                                                    Сделано на php+crontab+curl (для отправки сообщений на вконтакте).
                                                                                                      0
                                                                                                      Адская спам-машина переписана, понос из 200 записей удален и теперь каждые полчаса в ленте появляется бугагашенька.
                                                                                                      Подписывайтесь, посоны :)
                                                                                                        +2
                                                                                                        Сделайте, что бы к записи вк добавлялась ссылка на шортик.
                                                                                                          0
                                                                                                          Хмм… Но ведь кнопка «share|Поделиться» так и работает. Под записью на стене появляется ссылка на шортик.
                                                                                                            0
                                                                                                            Я имею ввиду не кнопку «Поделится» для контакта, а трансляцию потока на ВКонтакте пользователя themengzor. Обращение к нему было ) Просто запись в контатке с шортиком не содержит ссылки на него.
                                                                                                              0
                                                                                                              Сделаю вечерком.
                                                                                                      0
                                                                                                      Знакомо, делал нечто подобное про анекдоты: anekdotme.ru (на правах рекламы)
                                                                                                        0
                                                                                                        У вас если быстро кликнуть по «Смешно» или «Не смешно» то голос засчитывается дважды.
                                                                                                        +1
                                                                                                        Жаль, что вы не провели тестирование скорости работы сайта и создаваемой нагрузки на сервер до и после оптимизации. Сервисов, которые позволяют это сделать полно.
                                                                                                          0
                                                                                                          Мы проводили, картинок и прочего не приведу, но навскидку — голый апач на 1000 одновременных реквестах отдавал сайт в среднем более чем за 5 секунд, после чего вообще перестал отдавать. После оптимизиции — 1000 конкаррентов отдает до секунды на реквест, не падает.
                                                                                                            0
                                                                                                            Ясно, спасибо. Вот это уже понятнее.
                                                                                                          0
                                                                                                          апач настраиваете как будто он фронт-энд. За nginx должны быть несколько другие резоны. И keepAlive и сжатие и кэширование.
                                                                                                          Сжатие по mime отдайте nginx и deflate не при делах — все кто его поддерживает поддерживает и gzip. B nginx корректнее отрабатывает проблемные агенты со сжатием.
                                                                                                          Кэширование — тоже лучше отдать nginx, тем более что скрипты пишите сами. Динамику запрашивайте ajax-ом или SSI на крайний случай. Тот же memcache поставить в кэширование nginx и будет все намного лучше.

                                                                                                          В общем технически работа на троечку. А шортики ваши читаны уже раз на десятый. Хотите быть — будьте оригинальными.
                                                                                                            +2
                                                                                                            Снимите шортики. То есть скриншот бы непомешал ;)
                                                                                                              +2
                                                                                                              Лучше так:

                                                                                                              server {
                                                                                                                  server_name www.shortiki.com;
                                                                                                                  rewrite ...
                                                                                                              }
                                                                                                              
                                                                                                              server {
                                                                                                                  server_name static.shortiki.com;
                                                                                                                  root ПУТЬ_К_КАРТИНКАМ_И_CSS;
                                                                                                              }
                                                                                                              
                                                                                                              server {
                                                                                                                  server_name shortiki.com;
                                                                                                                  proxy_pass   http://127.0.0.1:8081;
                                                                                                              }
                                                                                                                0
                                                                                                                на кой чёрт немногочисленной статике отдельный субдомен? модно? %)
                                                                                                                  +2
                                                                                                                  Сравнение строк на равенство намного быстрее регулярок (что как бы не удивляет :) ). Если память не изменяет, то сам Игорь Сысоев рекомендовал о возможности обходиться без регулярок.
                                                                                                                  0
                                                                                                                  Это лишний днс запрос для клиента. Сайт будет открываться чуть дольше.
                                                                                                                    +2
                                                                                                                    Если много статики на страницу — открываться будет даже быстрее.
                                                                                                                    Во-первых, есть ограничение браузеров на параллельную загрузку. Во-вторых, отдельным субдоменом/доменом мы избавимся от cookies, которых может быть много.
                                                                                                                    Ну и вообще хорошая практика держать статику отдельно — так ею легче управлять и можно легко и быстро вынести на какой-нибудь CDN, в случае необходимости.
                                                                                                                      0
                                                                                                                      Статика и так отделена в /static.
                                                                                                                        +3
                                                                                                                        Это не «отдельно». Прочитайте мой комментарий ещё раз. Погуглите про параллельную загрузку и cookie-less домены.
                                                                                                                  0
                                                                                                                  Подтяните, пожалуйста, стиль страницы к логотипу. И забейте на башорговые штампы — вы делаете нечто отличающееся от классического башорга. Ну и визуальный шум в виде пунктирных бордеров лучше убрать. Достаточно выделения серым. И черный сплошной бордер можно сделать светло-серым или вообще убрать — блок будет просматриваться и так.

                                                                                                                  Типа того: clip2net.com/s/16pqr
                                                                                                                    0
                                                                                                                    Да, правильно.
                                                                                                                    — Шрифт без засечек и покрупнее;
                                                                                                                    — Подпись «поделиться:» убрать, ибо всем и так понятно, что это шаринг;
                                                                                                                    — Дату сделать человекопонятной (вчера, 21:30 / сегодня, 21:30 / 10 мая, 21:30 / 10 мая 2010, 21:30);
                                                                                                                    — Перед рейтингом поставить "+", что бы явно указать, что это рейтинг, не используя слово «рейтинг»;
                                                                                                                    — Ссылки «Нравится!» и номер бугагашеньки должны выглядеть как ссылки — подчеркнуты и выделены цветом.
                                                                                                                    0
                                                                                                                    Про способ запуска PHP скриптов как-то ни слова. Хотя можно предположить, что всё ограничилось традиционным mod_php.

                                                                                                                    Prefork отличается стабильностью, однако потребляет больше памяти и работает медленнее чем worker.

                                                                                                                    А что за мифическая стабильность? Стоит упомянуть про связь апачевских MPM с mod_php.
                                                                                                                      0
                                                                                                                      Стабильность относительно воркера.
                                                                                                                      0
                                                                                                                      В целом неплохо, дело за рихтовкой мелочей (например, приведенных выше). Время покажет, оторвётся ли публика от баша и заглянет к Вам. Успехов )
                                                                                                                        0
                                                                                                                        Мы не хотим отрывать публику от баша, у нас другая публика, хотя местами, конечно пересекается.
                                                                                                                        +1
                                                                                                                        Обнаружил глюк — при двойном щелчке на «Нравится!» рейтинг увеличивается на 2, хотя как я понял, от каждого человека только по 1 голосу.
                                                                                                                          0
                                                                                                                          Принято, исправляем.
                                                                                                                          +1
                                                                                                                          Шортики при добавлении на сайт проходят премодерацию? Я просто тут заметил 2 идентичные записи 278 и 276 с разницей по времени минута. Мб в спешке добавили. О таких казусах сообщать на мыло внизу сайта надо?
                                                                                                                            +2
                                                                                                                            И еще вот, 74 запись fgfgfgfgfgfgfg2 18 человек признали смешной )
                                                                                                                              0
                                                                                                                              Видимо в спешке :). Нет, не надо — я сейчас прикручиваю проверку уникальности.
                                                                                                                              +1
                                                                                                                              Чем меня всегда отпугивает башорг, так наличием большого количества бордеров. Так же как и forumBB. Прямо не знаю, что за таблицо-мания.

                                                                                                                              Так же, как все начинающие дизайнеры пишут красными буквами по темно-синему фону, так же все программисты, решившие самостоятельно сделать дизайн, обязательно поместят комментарий в отдельную ячейку таблицы, с огромными отступами, с серо-синим фоном, с грубым бордером.

                                                                                                                              Тоже самое в формате шортика:

                                                                                                                              − Дизайн легко угробить, поместив контент в таблицу в таблицу в таблицу в таблицу.
                                                                                                                                +5
                                                                                                                                — Надо поместить в див в див в див в див в спан в спан в спан в спан и дизайн заживёт новой жизнью? :)
                                                                                                                                  +1
                                                                                                                                  Я пишу не про метод верстки (Шортики, кстати, сверстаны дивами), а про оформление. На мой взгляд дизайн действительно заживет новой жизнью, если резких бордеров станет меньше.
                                                                                                                                  0
                                                                                                                                  Пофиксили внешний вид :)
                                                                                                                                  0
                                                                                                                                  Я бы добавил, что еще бы правильнее было вообще убрать Apache, поставить php-fpm как FastCGI для NGINX, так же поставить eAccelerator.
                                                                                                                                    0
                                                                                                                                    Дело вкуса, но я предпочитаю APC, к тому же он вроде как будет стандартом в то ли в 5.4, то ли в 6.0.
                                                                                                                                      0
                                                                                                                                      +1 и, вроде, обещали в 6.0.

                                                                                                                                      а если еще apc.stat = 0 мммммм
                                                                                                                                        0
                                                                                                                                        и заюзать apc_store вместо memcached
                                                                                                                                          0
                                                                                                                                          Не на всех задачах он равноценная замена, но в данном случае почему бы нет. Зачем множить сущности. Не в обиду автору, но если он говорит, что не разработсик, то, похоже, использовал memcache услышав (или нагуглив) о нём где-то.
                                                                                                                                    0
                                                                                                                                    Было бы неплохо выделать кнопку «Нравится» после нажатия, тыкал на нее несколько раз, не мог понять, учтен мой голос или нет.
                                                                                                                                      0
                                                                                                                                      *выделять, конечно же.
                                                                                                                                      +1
                                                                                                                                      На сколько подскочила посещаемость сайта после публикации сего топика?
                                                                                                                                        +3
                                                                                                                                        Использование @ перед функциями, die() на бою, работа через библиотеку mysql, неэкранированные переменные в запросе, да и просто мусор в коде:

                                                                                                                                        $quotesonpage = '';
                                                                                                                                        
                                                                                                                                        ....
                                                                                                                                        
                                                                                                                                        $quotesonpage = array();
                                                                                                                                        


                                                                                                                                        И все это в очень маленьком кусочке кода. А еще удивляемся, почему так предвзято относятся к php-кодерам.

                                                                                                                                          +2
                                                                                                                                          я совсем новичок в программировании и работал над сайтом только пару вечеров

                                                                                                                                          Во всём виноват низкий порог вхождения.
                                                                                                                                            0
                                                                                                                                            Еще вот заметил:
                                                                                                                                            $quotesonpage = array_reverse($quotesonpage);
                                                                                                                                          0
                                                                                                                                          что по поводу базы? как устроено голосование и его хранение? при каждом плюсе/минусе базу апдейте? что с оптимизацией базы и запросов?
                                                                                                                                          какая версия php стоит? обновляйтесь до последней, там постоянно улучшают работу с памятью. переходите на более современные расширения работы с базой (mysqli)
                                                                                                                                            0
                                                                                                                                            про хардверно-софтверную состовляющую подготовились неплохо.
                                                                                                                                            а смешных шуток для хабраэффектатм подготовить не могли?
                                                                                                                                              0
                                                                                                                                              Подготовили аж 400 штук :)
                                                                                                                                              +2
                                                                                                                                              Только ограничение нужно было делать 140 символов, чтобы в твиттер удобнее было кидать )
                                                                                                                                                0
                                                                                                                                                Не получится. Ведь добавляется еще и хештег и ссылка, без которых нет особого смысла делать трансляцию в твиттер. И тогда получается что сам шортик надо уже до 120 сокращать. А это мало :)
                                                                                                                                                0
                                                                                                                                                Если быстро много раз подряд нажать на кнопку НРАВИТСЯ, то прибавится не 1, а сразу несколько голосов (ну правильно: пока в базу данных попадет строчка {мой IP, id шортика за который я уже проголосовал}), пройдет не одна возможность опять послать запрос на сервер. Может быть временно программно на стороне клиента скрывать кнопку «Нравится», скажем, на N секунд?
                                                                                                                                                  0
                                                                                                                                                  >> свежие шортики будут появляться на сайте с задержкой в полчаса, но это не страшно

                                                                                                                                                  Просто очищайте мемкэш для главной при вставке и обновлении.

                                                                                                                                                  Посмотрите решение в LiveStreet: за кэширование и взаимодействие с маппером БД отвечает модуль. При вставке и обновлении он чистит зависимые кэши или удаляет по тэгам. При чтении сначала смотрит кэш. Например, 232 строка.

                                                                                                                                                  Надеюсь код в Вашем проекте не настолько низкоуровневый как в примерах? :)
                                                                                                                                                    +1
                                                                                                                                                    Поздравляю, сайт работает стабильно, чего не скажешь о гугловском рекламном сервере: «Соединение с сервером googleads.g.doubleclick.net сбой (Сервер не отвечает.) — это вместо нижнего баннера
                                                                                                                                                      0
                                                                                                                                                      Твиттер Ромочки смешнее.
                                                                                                                                                        +2
                                                                                                                                                        Сайт — просто готовый монолог «А знаете ли вы, что?..» для Задорнова.
                                                                                                                                                          0
                                                                                                                                                          Вы нас раскусили :(
                                                                                                                                                          –4
                                                                                                                                                          Зашел на главную, первый шортик (аж мутит от этого названия, произнося его, кажется, что ты попал в какую-то секту)
                                                                                                                                                          Иван Иванович Иванов никогда не заполняет никакие бланки. Он просто тупо крадёт образец...

                                                                                                                                                          Очень смешно!

                                                                                                                                                          Но дальше лучше:
                                                                                                                                                          Пафосные лоси не лижут соль без текилы.

                                                                                                                                                          Пафосные лоси ^__^ — о-о-о-ок!

                                                                                                                                                          Продам хамелеона синего. Нет, красного. Нет, зеленого. Блин. Круто. Нет, не продам.

                                                                                                                                                          Автор, скажи честно, ты сам придумываешь эти шортики шутки?
                                                                                                                                                            +2
                                                                                                                                                            Интересно, а как происходит отбор шуток? Вручную, что ли?

                                                                                                                                                            Пример с шортиков:
                                                                                                                                                            www: Вся история женской моды — это история борьбы климата, морали и гигиены с желанием женщины ходить голой.

                                                                                                                                                            Оригинал с башорга:
                                                                                                                                                            www: Вся история женской моды — это история борьбы климата, морали и гигиены с желанием женщины ходить голой.
                                                                                                                                                            xxx: да и пусть бы голыми ходили, жалко что ли
                                                                                                                                                            yyy: а если твоя девушка будет ходить по улицам голой, как тебе это понравится?
                                                                                                                                                            zzz: Ну так пусть свободные ходят голыми, а занятые — одетыми. Сразу избавит мир от многих проблем

                                                                                                                                                              0
                                                                                                                                                              Вручную, конечно. В основном, шутки присылают пользователи.
                                                                                                                                                                0
                                                                                                                                                                Было бы здорово, если бы вы сделали динамический отбор шуток с настраиваимым порогом оценок — скажем, все шутки с оценкой больше 5000.
                                                                                                                                                              0
                                                                                                                                                              отлично, теперь (в отличие от башорга) в гуглридере не надо кликать на развернуть, один клик в сутки — «отметить как прочитанное» (это я про длину сообщений).
                                                                                                                                                                –2
                                                                                                                                                                Название «шортики» действительно не самое удачное. «Шорты» и то звучит лучше, но все равно непривычно.
                                                                                                                                                                Но смешные цитаты есть. Удачи в дальнейшем развитии!
                                                                                                                                                                  0
                                                                                                                                                                  Хороший сайт получился, залип на нём, спасибо)
                                                                                                                                                                  Каменты не читал, приделайте кнопочку для контактика, чтоб цитаты воровать.
                                                                                                                                                                    0
                                                                                                                                                                    Там справа у каждого шортика есть иконки и вконтакты присутствует.
                                                                                                                                                                    Одним кликом воруешь шортик и распространяешь бренд ;-)
                                                                                                                                                                      0
                                                                                                                                                                      А, правда, они такие ненавязчивые что даже не заметил, пока не начал искать, за это отдельное уважение)
                                                                                                                                                                      0
                                                                                                                                                                      Первая кнопочка в ряду соцсетей :)
                                                                                                                                                                      +5
                                                                                                                                                                      А вообще, прочитав заголовок, ожидал увидеть что-то подобное в дизайне главной страницы:
                                                                                                                                                                        0
                                                                                                                                                                        жестко ограниченная 255 символами

                                                                                                                                                                        Почему не 140? :)
                                                                                                                                                                          –2
                                                                                                                                                                          Дайте угадаю, VARCHAR в 4-ом mysql имеет длину 0..255? :)
                                                                                                                                                                            0
                                                                                                                                                                            В 5-м для хранения длины VARCHAR нужно 2 байта :)
                                                                                                                                                                              0
                                                                                                                                                                              Я знаю. Я же написал про 4-ый, так как если автор руководствовался старой статьей для начинающих, там наверняка был разобран пример для php4.* и mysql4.*
                                                                                                                                                                          0
                                                                                                                                                                          «Разумеется, свежие шортики будут появляться на сайте с задержкой в полчаса, но это не страшн»

                                                                                                                                                                          Проблема решается теггированием. Хоть memcached и не поддерживает теггирование средствами своего api, реализовать собственный класс, наследующий memcached с методами t_set, t_get не займет много времени.

                                                                                                                                                                          Хорошая статья по теме: www.smira.ru/2008/10/29/web-caching-memcached-5/
                                                                                                                                                                            0
                                                                                                                                                                            ну вообще, для одной главной страницы можно тупо сделаь кеш «бесконеным» по времени, и обновлять его при добавлении чего-то нового средствами «движка». И только при его кончине обновлять при запросе клиента
                                                                                                                                                                            +4
                                                                                                                                                                            >Выключаем ExtendedStatus (добавляет 1 или 2 системных вызова на каждый реквест):

                                                                                                                                                                            Экономия на спичках. Не нужно.

                                                                                                                                                                            >Timeout 10

                                                                                                                                                                            Нет смысла для Apache за nginx. Вообще, все таймауты стоит держать в одном месте. Держите их в nginx.

                                                                                                                                                                            >KeepAlive On KeepAliveTimeout 5

                                                                                                                                                                            Нет смысла. А в будущих версиях nginx это вам без проблем положит бэкэнд.

                                                                                                                                                                            >Добавляем мемкеш

                                                                                                                                                                            Тут вообще листовая жесть. Во-первых, будет гонка базы при протухании кэша. Во-вторых, кэш надо уметь инвалидировать. Вы это делать не умеете, потому у вас задержки.
                                                                                                                                                                              0
                                                                                                                                                                              У меня гугловская кнопка +1 очень затормаживает загрузку страницы. Не могли бы вы эти кнопки убрать в js, уже после загрузки страницы?
                                                                                                                                                                                0
                                                                                                                                                                                Спасибо. Починили:)
                                                                                                                                                                                0
                                                                                                                                                                                Спасибо, шутки попадаются классные. А чем отличаются списки «лучшие» и «по рейтингу»?
                                                                                                                                                                                  0
                                                                                                                                                                                  «Лучшие» — топ20, а «по рейтингу» — сортировка всех шортиков по рейтингу, не?
                                                                                                                                                                                    0
                                                                                                                                                                                    Починили, спасибо :)
                                                                                                                                                                                    0
                                                                                                                                                                                    Да, еще было бы классно сделать функцию «показать, начиная с даты» — отсортированные по рейтингу шутки, начиная с определенной даты (чтобы одно и то же два раза не читать). RSS-ридер не предлагать — все подряд читать не хочется, а вот раз в недельку заходить и читать лучшее было бы удобно.
                                                                                                                                                                                      +1
                                                                                                                                                                                      а нельзя ли сделать трансляцию в twitter? настроить twitterfeed.com/ 5 минут займет
                                                                                                                                                                                        0
                                                                                                                                                                                        Сделали. Еще и во вконтакик и в фейсбук.
                                                                                                                                                                                        0
                                                                                                                                                                                        Защита от накрутки голосований через куки — это совсем несерьезно.
                                                                                                                                                                                        1) Их легко удалить
                                                                                                                                                                                        2) Суммарный объем кук ограничен — значит через какое-то кол-во голосований они сами начнут исчезать. Особенно актуально потому что вы используете длинные имена кук
                                                                                                                                                                                          0
                                                                                                                                                                                          Понятное дело. Однако на сайте написанном за пару вечеров другого быть и не может :)

                                                                                                                                                                                          Мы пишем сейчас защиту от накрутки.
                                                                                                                                                                                        • UFO just landed and posted this here
                                                                                                                                                                                            0
                                                                                                                                                                                            За сайтом вообще кто-нибудь следит? Откуда там поток несвежих, неактуальных шуток?
                                                                                                                                                                                            Например, вот эта шутка shortiki.com/shortik.php?shortik=4893, датированная 25 октября была актуальна 12 марта, когда вск и пнд были рабочими днями. После 12 марта уже никто и не знает в чем смысл этого шортика.
                                                                                                                                                                                            Чем думал модератор, когда апрувил?
                                                                                                                                                                                              0
                                                                                                                                                                                              Я продал сайт около полугода назад, так что насчет модерация уже давно не моя.
                                                                                                                                                                                                +1
                                                                                                                                                                                                Спасибо, что сообщили. Пойду отпишусь.
                                                                                                                                                                                                Вам желаю придумать ещё что-нибудь интересненькое.

                                                                                                                                                                                            Only users with full accounts can post comments. Log in, please.