Anynchronous стратегия ведения журнала для Python и PHP

#php #python #logging #asynchronous #queue

#php #python #ведение журнала #асинхронный #очередь

Вопрос:

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

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

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

Существуют ли какие-либо лучшие подходы для решения этой проблемы?

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

Ответ №1:

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

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

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

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

Комментарии:

1. Как насчет ведения журнала через независимый HTTP-сервер?

2. @jaz — я бы ожидал, что добавление в файл журнала будет быстрее, чем отправка HTTP-запроса.

Ответ №2:

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

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

Комментарии:

1. 1 — Я забыл о неблокирующих сокетах, и, предположительно, это также сработало бы (по крайней мере, в PHP, Py на самом деле не моя специальность) для неблокирующих файловых потоков.