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

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

Доброго времени суток!! У меня есть сайт на котором уже зарегистрировано более 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']);
    }
}
  • Вопрос задан
  • 244 просмотра
Подписаться 2 Простой 3 комментария
Помогут разобраться в теме Все курсы
  • Skillfactory
    Профессия Fullstack веб-разработчик на JavaScript и PHP
    20 месяцев
    Далее
  • Хекслет
    PHP-разработчик
    10 месяцев
    Далее
  • Нетология
    Веб-разработчик с нуля: профессия с выбором специализации
    14 месяцев
    Далее
Решения вопроса 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. Сто сообщений хостинг даже не почувствует.
Ответ написан
Ваш ответ на вопрос

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

Похожие вопросы
FoodSoul Калининград
от 180 000 до 250 000 ₽
IT-Spirit Москва
от 230 000 до 320 000 ₽
от 200 000 до 290 000 ₽