WedX - журнал о программировании и компьютерных науках

Как разделить пользовательский кеш APC между CLI и экземплярами веб-сервера?

Я использую PHP APC для хранения большого количества информации (с apc_fetch() и т.д.). Эта информация иногда нуждается в анализе и сбросе в другое место.

История гласит, что я получаю несколько сотен обращений в секунду. Эти попадания увеличивают различные счетчики (с apc_inc() и друзьями). Каждый час я хотел бы перебирать все значения, которые я накопил, и выполнять с ними какую-то другую обработку, а затем сохранять их на диске.

Я мог бы сделать это как случайное или основанное на времени переключение в каждом запросе, но это потенциально долгая операция (может потребоваться 20-30 секунд, если не несколько минут), и я не хочу зависать запрос так долго.

Я думал, что простой PHP cronjob справится с этой задачей. Однако я даже не могу заставить его прочитать кэш-информацию.

<?php
  print_r(apc_cache_info());
?>

Создает, казалось бы, другой сегмент памяти APC с:

[num_entries] => 1

(Кажется, что единственная запись сама по себе является кешем кода операции)

В то время как мой веб-сервер, работающий на nginx/php5-fpm, дает:

[num_entries] => 3175

Таким образом, они, очевидно, не используют один и тот же кусок памяти. Как я могу получить доступ к одному и тому же фрагменту памяти в сценарии CLI (предпочтительно), или, если это просто невозможно, какой самый безопасный способ выполнить длинную последовательность, скажем, случайный HTTP-запрос каждый час?

Что касается последнего, будет ли использование register_shutdown_function() и сразу же set_time_limit(0) и ignore_user_abort(true) делать трюк, чтобы гарантировать завершение выполнения и не «подвешивать» чей-либо браузер?

И да, я знаю о Redis, memcache и т. Д., У которых не было бы этой проблемы, но пока я придерживаюсь APC, поскольку ни один из них не может продемонстрировать такую ​​​​же скорость, как APC.

08.01.2013

  • Данные APC привязаны к процессу, в котором они хранятся. Остановите или перезапустите этот процесс, и данные будут удалены. Насколько мне известно, невозможно получить доступ к информации из разных процессов. 08.01.2013

Ответы:


1

На самом деле это проблема дизайна и вопрос выбора предпочтительных затрат по сравнению с выплатами.

Вы в восторге от скорости APC, поскольку не тратите время на сохранение данных. Вы также хотите сохранить данные, но теперь снижение производительности слишком велико. Вы должны как-то их сбалансировать.

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

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

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

Однако потенциальные риски в этом случае связаны с целостностью данных (поскольку вы будете записывать кеш на диск, в то время как он будет обновляться другими запросами), а также запросы, обслуживаемые, пока вы сохраняете кеш, оплачивая снижение производительности ваш сервер занят.

По сути, мы ввели пучок сена в дилемму волк/ягненок ;)

23.07.2014
Новые материалы

Как создать диаграмму градиентной кисти с помощью D3.js
Резюме: Из этого туториала Вы узнаете, как добавить градиентную кисть к диаграмме с областями в D3.js. Мы добавим градиент к значениям SVG и применим градиент в качестве заливки к диаграмме с..

Я хотел выучить язык программирования MVC4, но не мог выучить его раньше, потому что это выглядит сложно…
Просто начните и учитесь самостоятельно Я хотел выучить язык программирования MVC4, но не мог выучить его раньше, потому что он кажется мне сложным, и я бросил его. Это в основном инструмент..

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

Объяснение документов 02: BERT
BERT представил двухступенчатую структуру обучения: предварительное обучение и тонкая настройка. Во время предварительного обучения модель обучается на неразмеченных данных с помощью..

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

Работа с цепями Маркова, часть 4 (Машинное обучение)
Нелинейные цепи Маркова с агрегатором и их приложения (arXiv) Автор : Бар Лайт Аннотация: Изучаются свойства подкласса случайных процессов, называемых дискретными нелинейными цепями Маркова..

Crazy Laravel Livewire упростил мне создание электронной коммерции (панель администратора и API) [Часть 3]
Как вы сегодня, ребята? В этой части мы создадим CRUD для данных о продукте. Думаю, в этой части я не буду слишком много делиться теорией, но чаще буду делиться своим кодом. Потому что..


Для любых предложений по сайту: [email protected]