В настоящее время я работаю над большим проектом, который требует реализации событий, отправленных сервером. Я решил использовать для этого транспорт источника событий и начал с простого чата. В настоящее время клиентская сторона слушает только новое событие сообщения чата, но в будущем в проекте будет намного больше событий. Во-первых, меня очень беспокоит сценарий на стороне сервера и цикл в нем, а во-вторых, я не уверен, что использование базы данных mySQL в качестве хранилища (в данном случае для сообщений чата) на самом деле хорошая практика. Текущий цикл выдает новые сообщения по мере их появления в базе данных:
$statement = $connect->prepare("SELECT id, event, user, message FROM chat WHERE id > :last_event_id");
while(TRUE) {
try {
$statement->execute(array(':last_event_id' => $lastEventId));
$result = $statement->fetchAll();
foreach($result as $row) {
echo "id: " . $row['id'] . "\n";
echo "event: " . $row['event'] . "\n";
echo "data: |" . $row['user'] . "| >>> \n";
echo "data: " . $row['message'] . "\n\n";
$lastEventId++;
}
} catch(PDOException $PDOEX) {
echo $PDOEX->getMessage();
}
ob_flush();
flush();
usleep(10000);
}
Из того, что я читал, такой цикл неизбежен, и моя задача - оптимизировать его производительность. В настоящее время я использую подготовленный оператор вне while()
и разумный (?) usleep()
.
Итак, вопросы к тем, у кого есть опыт серверных ивентов:
- Целесообразна ли такая методика для использования на умеренно загруженных сайтах (1000-5000 пользователей в сети)?
- Если да, то есть ли способ повысить производительность?
- Может ли в этом случае база данных mySQL стать узким местом?
Ценю любую помощь, так как вопрос довольно сложный, и поиск информации не даст мне никаких советов или способов проверить это.