Стратегия Anynchronous Logging для Python и PHP - PullRequest
3 голосов
/ 21 октября 2011

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

У нас также есть php-интерфейс, который взаимодействует с данными mysql, и нам также нужно регистрировать действия пользователя, чтобы мы могли анализировать их поведение и вычислять некоторые функции оценки.Таким образом, мы подумали о том, чтобы иметь таблицу таблиц mysql для каждого случая (одну для журнала «скрипты Python» и одну для журнала «действия пользователя»).

В идеале, мы будем писать в эти таблицы журнала асинхронно, для производительностии причины низкой задержки.Есть ли способ сделать это в Python (мы используем django ORM) и в PHP (мы используем Yii Framework )?

Есть ли лучшие подходыдля решения этой проблемы?

Обновление : для действий пользователя (веб-интерфейс) мы сейчас рассматриваем возможность загрузки журнала Apache в mysql с соответствующей информацией о сеансе автоматически через простую конфигурацию Apache

Ответы [ 2 ]

2 голосов
/ 21 октября 2011

Вы можете открыть сырой Unix или сетевой сокет для службы регистрации, которая кэширует сообщения и записывает их на диск или в базу данных асинхронно.Если ваши процессы PHP и Python выполняются долго и генерируют много сообщений за выполнение, сохранение открытого сокета было бы более эффективным, чем синхронное выполнение отдельных запросов HTTP / базы данных.

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

2 голосов
/ 21 октября 2011

(AFAIK) есть только два способа сделать что-нибудь синхронно в PHP:

  • Форк процесс (требуется pcntl_fork)
  • exec() обработайте и отпустите его (допуская * nix), добавив > /dev/null & в конец командной строки.

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

Python поддерживает многопоточность , что значительно облегчает жизнь.

...