За последние 24 часа нас посетили 22980 программистов и 1233 робота. Сейчас ищут 832 программиста ...

Подход к написанию демона

Тема в разделе "PHP для профи", создана пользователем Satger, 19 апр 2020.

Метки:
  1. Satger

    Satger Активный пользователь

    С нами с:
    19 апр 2020
    Сообщения:
    72
    Симпатии:
    1
    Имеется скрипт, который непрерывно в цикле читает сокет (иногда - ждёт его долго) и складывает полученное в массив.
    Время от времени необходимо содержимое этого массива быстро отдать неопределённому количеству клиентов.

    Какова может быть архитектура такого приложения вообще?

    А если есть ограниченность в памяти и процессоре?
    А если без использования библиотек, не входящих в "обычную" конфигурацию?
     
  2. Poznakomlus

    Poznakomlus Активный пользователь

    С нами с:
    12 сен 2014
    Сообщения:
    96
    Симпатии:
    19
    Адрес:
    Киев
    быстро это или использовать память, что не идет в коробке или к примеру использовать memcache установи его также
    в php.ini задается memory_limit
    читаете с сокета пишете результат в memcache
     
  3. Satger

    Satger Активный пользователь

    С нами с:
    19 апр 2020
    Сообщения:
    72
    Симпатии:
    1
    Что делать дальше с данными в memcache?
     
  4. iceblood

    iceblood Активный пользователь

    С нами с:
    20 фев 2020
    Сообщения:
    83
    Симпатии:
    12
    Речь о работе с очередью. Можешь организовать две очереди (ключь-значение) 1) контент 2) потребитель. Накопил контент, лежит в мемкэше(или еще где то) до востребования. Прибежали потребители с ключом контента, раздал им контент, удалил их из очереди. Контент потерял актуальность, почистил очередь контента.
     
  5. Satger

    Satger Активный пользователь

    С нами с:
    19 апр 2020
    Сообщения:
    72
    Симпатии:
    1
    Ключ пишется без мягкого знака.
    Вы описали синхронную архитектуру, когда как по условию задачи она очевидно не подходит.
     
  6. iceblood

    iceblood Активный пользователь

    С нами с:
    20 фев 2020
    Сообщения:
    83
    Симпатии:
    12
    Спасибо что поправил . Читать и писать можешь асинхронно. С очередями могут работать несколько скриптов покладчики / разборщики. Идея очень ведь проста )
     
  7. Satger

    Satger Активный пользователь

    С нами с:
    19 апр 2020
    Сообщения:
    72
    Симпатии:
    1
    Эээ... Видимо, я плохо читал доку.
    Как в memcached отдать один объект разным скриптам?
     
  8. iceblood

    iceblood Активный пользователь

    С нами с:
    20 фев 2020
    Сообщения:
    83
    Симпатии:
    12
    Куда то диалог свернул не туда. Попробуем сделать шаг назад.

    "Имеется скрипт, который непрерывно в цикле читает сокет (иногда - ждёт его долго) и складывает полученное в массив."
    Предположим массив меняем на мемкэш (тогда полученное и складируемое может быть вытащено и обработано другим скриптом)


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

    Писать и читать можно асинхронно.
     
  9. Satger

    Satger Активный пользователь

    С нами с:
    19 апр 2020
    Сообщения:
    72
    Симпатии:
    1
    Но как? Я не вижу в API memcached никаких намёков на то, что данные можно положить одной программой, а достать - другой.
     
  10. iceblood

    iceblood Активный пользователь

    С нами с:
    20 фев 2020
    Сообщения:
    83
    Симпатии:
    12
  11. Satger

    Satger Активный пользователь

    С нами с:
    19 апр 2020
    Сообщения:
    72
    Симпатии:
    1
    Кто такой php.ru? Что такое Memcached::set?
    Если бы Вы пользовались нормальной нотацией, то знали бы, что операция происходит в контексте соединения. Но и в приведённой Вами нотации Вы не видите, что всё происходит в контексте экземпляра объекта.

    Слышь, чувак, кончай прикалываться, а?
     
  12. iceblood

    iceblood Активный пользователь

    С нами с:
    20 фев 2020
    Сообщения:
    83
    Симпатии:
    12
    #12 iceblood, 28 апр 2020
    Последнее редактирование: 28 апр 2020
  13. Satger

    Satger Активный пользователь

    С нами с:
    19 апр 2020
    Сообщения:
    72
    Симпатии:
    1
    Есть китайская библиотека сокетов, тоже на PCNTL и без сторонних библиотек, на голом php. Говорят, хорошая.
    Но. На целевую платформу это всё, вероятно, не полезет, ибо каждый сокет на отдачу - это ещё один экземпляр данных. А уже четыре экземпляра - настоятельно требуют подумать о памяти. А для нужд получения и обработки нужно два. Поскольку клиентов в один момент может быть больше двух с высокой вероятностью - не видно смысла городить на сокетах.

    На самом деле, я уже сделал. По олдовой технологии - через файл. Потребности в памяти предсказуемы. Разве что файл в /tmp , так что это тоже memcache, только не через задницу.
     
  14. iceblood

    iceblood Активный пользователь

    С нами с:
    20 фев 2020
    Сообщения:
    83
    Симпатии:
    12
    Стеснялся предложить через файл, также как и через организацию очреди в БД. Рад за твой успех )
     
  15. Satger

    Satger Активный пользователь

    С нами с:
    19 апр 2020
    Сообщения:
    72
    Симпатии:
    1
    А вот база данных - как раз и лишнее. Ибо отдавать из неё - всё равно затраты памяти на неопределённое количество копий данных. Единственный профит - можно разделить всё на три машины. А вот файл можно просто отдать клиенту как таковой. Ну, поборов кеширование, разумеется.
     
  16. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.555
    Симпатии:
    1.754
    @Satger, операция происходит в контексте соединения, но соединяется-то с одним и тем же memcache, поэтому можно из одного соединения, из одной программы, положить что-то в мемкеш, а из другой программы - вытащить, ничего особенного. Главное, чтоб ключ совпадал.