2013-06-07 1 views
-1

Я храню много переменных в APC в секунду. В то же время у меня есть задача CRON, которая непрерывно выполняет php-процесс для чтения переменных из APC, удаляя его из APC и сохраняя его в базе данных. Скрипт php получает все переменные, определенные префиксом. Проблема заключается в том, что, хотя процесс PHP обрабатывает APC, читает все переменные, удаляет их из APC и вставляет его в базу данных, другой процесс (запущенный также CRON) может читать одни и те же данные, поскольку он еще не удалён, и я бы дублировать данные в моей базе данных. Есть ли решение для этого? Может быть, это ограничение APC?Избегайте параллельных проблем альтернативного PHP-кэша (APC)

Заранее спасибо.

Марк

+1

Вы не должны использовать кеш в первую очередь. Используйте базу данных напрямую. И переключитесь на Postgres, если MySQL не справится с нагрузкой. –

+0

Существует множество решений: от создания php-процесса daemon, который имеет поток, который сохраняет APC и поток, который сохраняет данные в DB. Наличие db с уникальным ограничением, установленным, позаботится о наличии дубликатов. Кроме того, советы, такие как выше, чем мой комментарий, - это то, что вы должны игнорировать и сосредоточиться на том, чтобы сначала работать с параллелизмом. –

+0

Несмотря на то, что очередь сообщений, безусловно, звучит как правильный путь, чтобы идти сюда просто для простоты и отслеживания вашей текущей реализации: когда вы говорите «другой» cron, вы имеете в виду совершенно другую работу или одну и ту же работу более поздний (перекрывающий) запуск? – smassey

ответ

0

Во-первых, я хотел бы знать, из любопытства рассуждение позади этого решения! Очень заинтересован!

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

Я решил это ранее, установив переключатель, который уведомляет код, в котором работает предыдущее задание. Когда ваша работа закончится, снимите переключатель, и в следующий раз ваш cron снова запустится. Вы можете поместить этот переключатель в APC.

+0

Здравствуйте, dKen, спасибо за ваш ответ. Я буду иметь в виду вашу идею о коммутаторе. Обоснование довольно простое, мы собираемся собрать много данных, и мы хотим сохранить его в базе данных. Мы подумали о создании получателя: php, который посещает запросы и хранит его в APC, вместо того, чтобы сохранять его в базе данных, потому что мы ожидаем, что большой объем трафика и сделаем вставку для каждого запроса, сбили бы нашу базу данных. А с другой стороны, у нас есть еще один php, который читает большие блоки данных из APC и сохраняет его с уникальной вставкой в ​​базу данных. Спасибо за ответ! – mark

+0

Нет проблем, удачи. Возможно, стоит рассмотреть некоторые тесты нагрузки и другую должную осмотрительность в вашей базе данных, чтобы доказать, что вам нужно построить такое решение, как это. Я просто беспокоюсь о том, что ваше решение более сложное, что, возможно, должно быть, это даст вам больше головных болей в будущем. Накладные расходы базы данных довольно малы, и я нахожу, что это почти всегда код и способ написания, который медленнее, чем сама база данных. 30-минутный тест нагрузки может сэкономить ваши дни dev и pain, и вы всегда можете добавить свое решение APC, но удачи в любом случае :) – dKen