#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 на самом деле не моя специальность) для неблокирующих файловых потоков.