Задать вопрос

Как разослать всем уведомление, не циклом?

Доброго времени суток!! У меня есть сайт на котором уже зарегистрировано более 100 человек, я сделала рассылку уведомлений, но циклом while, в этом цикле присутствует много запросов и долго отправляются запросы. Как можно сделать так, чтобы это было намного быстрее и менее затратно по ресурсам хостинга?
Вот код который я использую на данный момент:
$result = mysql_query('SELECT `id` FROM `users` WHERE `id` != 2 ORDER BY `id` ASC');
while ( $row = mysql_fetch_assoc($result) ) {
    $time = time();
    mysql_query('INSERT INTO `mail` (`user`, `to`, `text`, `time`) VALUES (2, '.$row['id'].', "'.$text.'", '.$time.')');
    $contacts = mysql_fetch_assoc(mysql_query('SELECT * FROM `contacts` WHERE `user` = 2 AND `ho` = '.$row['id'].' AND `delete` = 0 OR `user` = '.$row['id'].' AND `ho` = 2 AND `delete` = 0'));
    if ( !$contacts ) {
        mysql_query('INSERT INTO `contacts` (`user`, `ho`, `time`) VALUES (2, '.$row['id'].', '.$time.'), ('.$row['id'].', 2, '.$time.')');
    } else {
        mysql_query('UPDATE `contacts` SET `time` = '.$time.', `delete` = 0 WHERE `user` = '.$row['id'].' AND `ho` = 2');
        mysql_query('UPDATE `contacts` SET `time` = '.$time.', `delete` = 0 WHERE `user` = 2 AND `ho` = '.$row['id']);
    }
}
  • Вопрос задан
  • 235 просмотров
Подписаться 2 Простой 3 комментария
Решения вопроса 1
Rsa97
@Rsa97
Для правильного вопроса надо знать половину ответа
Делаете составной уникальный ключ (`user`, `ho`) , после чего всё сводится к двум запросам
INSERT INTO `mail` (`user`, `to`, `text`, `time`)
  SELECT 2, `id`, :text, :time
    FROM `users`
    WHERE `id`  != 2;

INSERT INTO `contacts` (`user`, `ho`, `delete`, `time`)
  SELECT *
    FROM (
      SELECT `id`, 2, 0, :time
        FROM `users`
        WHERE `id` != 2
      UNION ALL SELECT 2, `id`, 0, :time
        FROM `users`
        WHERE `id` != 2
    ) AS `t`
  ON DUPLICATE KEY UPDATE `delete` = 0, `time` = VALUES(`time`);

А вообще, какой-то жуткий легаси у вас. Библиотека mysql_ уже давно почила в бозе.
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
Sanes
@Sanes
Запустить в фоновом режиме. Например через Crontab. Сто сообщений хостинг даже не почувствует.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы