Я использую 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.