В настоящее время я работаю над большим проектом, который требует реализации событий, отправленных сервером. Я решил использовать для него транспорт событий-событий и начал с простого чата. В настоящее время клиентская сторона слушает только новое событие сообщения чата, но в будущем проект будет иметь гораздо больше событий. Во-первых, я действительно обеспокоен сценарием на сервере и его циклом, и во-вторых, я не уверен, что использование базы данных 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 пользователей он-лайн)?
- Если да, есть ли способ повысить производительность?
- Может ли база данных быть узким местом в этом случае?
Оцените любую помощь, так как вопрос довольно сложный, и информация по поиску не даст мне никаких советов или способов проверить его.
Спасибо за ответ. Как предложил ** Дэйв **, в настоящее время я пытаюсь сделать memcache для своих целей, и он служит в качестве временного хранилища для этого входящего сообщения чата. «Время опроса» находится в микросекундах, но это всего лишь задержка, поэтому цикл не будет совершать слишком много итераций. И event-source открывает новое соединение каждые 30 секунд - когда php-script достигает max_execution_time, я полагаю. Я думал, что функция event-source - устанавливает соединение keep-alive и сбрасывает все, что сервер перекликается с этим, или я ошибаюсь? Сеть показывает запрос каждые 30 секунд. – Nevertheless
@ grimv01k См. Мое обновление к моему ответу. –
Ваш ответ был очень ... просвещен, так сказать, и действительно дал мне представление. В настоящее время я пытаюсь настроить односвязный сокет, который прослушивает несколько столбцов и таблицу опроса ** mySQL ** с таблицей типов «MEMORY», и все, что должно быть доставлено клиенту через «event-source». Это в настоящее время ответ на меня. Спасибо! :) – Nevertheless