Имеется скрипт, который непрерывно в цикле читает сокет (иногда - ждёт его долго) и складывает полученное в массив. Время от времени необходимо содержимое этого массива быстро отдать неопределённому количеству клиентов. Какова может быть архитектура такого приложения вообще? А если есть ограниченность в памяти и процессоре? А если без использования библиотек, не входящих в "обычную" конфигурацию?
быстро это или использовать память, что не идет в коробке или к примеру использовать memcache установи его также в php.ini задается memory_limit читаете с сокета пишете результат в memcache
Речь о работе с очередью. Можешь организовать две очереди (ключь-значение) 1) контент 2) потребитель. Накопил контент, лежит в мемкэше(или еще где то) до востребования. Прибежали потребители с ключом контента, раздал им контент, удалил их из очереди. Контент потерял актуальность, почистил очередь контента.
Ключ пишется без мягкого знака. Вы описали синхронную архитектуру, когда как по условию задачи она очевидно не подходит.
Спасибо что поправил . Читать и писать можешь асинхронно. С очередями могут работать несколько скриптов покладчики / разборщики. Идея очень ведь проста )
Куда то диалог свернул не туда. Попробуем сделать шаг назад. "Имеется скрипт, который непрерывно в цикле читает сокет (иногда - ждёт его долго) и складывает полученное в массив." Предположим массив меняем на мемкэш (тогда полученное и складируемое может быть вытащено и обработано другим скриптом) "Время от времени необходимо содержимое этого массива быстро отдать неопределённому количеству клиентов." Предположим у нас работает скрипт отслеживающий событие запроса, лезет к мемкэш и отдает содержимое. Писать и читать можно асинхронно.
Но как? Я не вижу в API memcached никаких намёков на то, что данные можно положить одной программой, а достать - другой.
Данные хранятся по ключу. Соответственно ты и вытаскивать их можешь по ключу. Посмотри пример https://php.ru/manual/memcached.set.html https://php.ru/manual/memcached.get.html
Кто такой php.ru? Что такое Memcached::set? Если бы Вы пользовались нормальной нотацией, то знали бы, что операция происходит в контексте соединения. Но и в приведённой Вами нотации Вы не видите, что всё происходит в контексте экземпляра объекта. Слышь, чувак, кончай прикалываться, а?
Есть китайская библиотека сокетов, тоже на PCNTL и без сторонних библиотек, на голом php. Говорят, хорошая. Но. На целевую платформу это всё, вероятно, не полезет, ибо каждый сокет на отдачу - это ещё один экземпляр данных. А уже четыре экземпляра - настоятельно требуют подумать о памяти. А для нужд получения и обработки нужно два. Поскольку клиентов в один момент может быть больше двух с высокой вероятностью - не видно смысла городить на сокетах. На самом деле, я уже сделал. По олдовой технологии - через файл. Потребности в памяти предсказуемы. Разве что файл в /tmp , так что это тоже memcache, только не через задницу.
А вот база данных - как раз и лишнее. Ибо отдавать из неё - всё равно затраты памяти на неопределённое количество копий данных. Единственный профит - можно разделить всё на три машины. А вот файл можно просто отдать клиенту как таковой. Ну, поборов кеширование, разумеется.
@Satger, операция происходит в контексте соединения, но соединяется-то с одним и тем же memcache, поэтому можно из одного соединения, из одной программы, положить что-то в мемкеш, а из другой программы - вытащить, ничего особенного. Главное, чтоб ключ совпадал.