За последние 24 часа нас посетили 70654 программиста и 1602 робота. Сейчас ищут 1019 программистов ...

Выполнить код на PHP через 5 минут

Тема в разделе "PHP для новичков", создана пользователем MrFallen, 30 июл 2017.

  1. MrFallen

    MrFallen Новичок

    С нами с:
    5 апр 2017
    Сообщения:
    18
    Симпатии:
    0
    Добрый день. Есть код на PHP, который получает от пользователя необходимые данные и отвечает ему моментально. НО! Я хочу сделать так, чтобы пользователь получал ответ не моментально, а через 5 минут.

    Например: П - пользователь, PHP - PHP.
    П: x = 5.
    PHP: Вы получите ответ через 5 минут.
    PHP: 2+x=7.

    Подскажите пожалуйста в какую сторону копать, а лучше покажите на примере. В PHP совсем новичок, мало чего понимаю. Спасибо :)
     
    #1 MrFallen, 30 июл 2017
    Последнее редактирование: 30 июл 2017
  2. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    пихать задачи в базу, а кроном каждую минуту выбирать те, что старше пяти минут и выполнять их
     
    MrFallen нравится это.
  3. MrFallen

    MrFallen Новичок

    С нами с:
    5 апр 2017
    Сообщения:
    18
    Симпатии:
    0
    Может быть есть вариант без использования БД или с использованием БД будет проще?
     
  4. denis01

    denis01 Суперстар
    Команда форума Модератор

    С нами с:
    9 дек 2014
    Сообщения:
    12.227
    Симпатии:
    1.714
    Адрес:
    Молдова, г.Кишинёв
    да, проще. бд + cron обычно на хостинге всё есть
     
  5. MrFallen

    MrFallen Новичок

    С нами с:
    5 апр 2017
    Сообщения:
    18
    Симпатии:
    0
    В общем... Пишу бота для Вконтакте. Перенёс хранение данных из файлов в базу данных, но не могу понять, почему функция if else на одно вхождение данных срабатывает 2 раза, тем самым отсылает 2 сообщения на одно сообщение и оба раза правильные сообщения. Функция проверяет выдавался ли ключ от Steam игры. Для этого она проверяет записи в базе данных, если записей об этом пользователе нет, то бот выдает ключ. Если есть данные что ключ выдавался, то пишет соответствующее сообщение. Сейчас объясню почему правильно.
    upload_2017-7-31_0-10-37.png
    Пользователь пишет команду. Бот выдает ключ и добавляет запись в БД о том, что этому пользователю ключ выдан. Затем if else еще раз срабатывает и проверяет, не выдан ли ключ, но видит что ключ выдан и пишет еще одно сообщение... Даже не знаю что делать.
    upload_2017-7-31_0-13-23.png

    Какие ещё нужны данные чтобы понять в чем проблема? Уже сижу часа 3 над этим.
    --- Добавлено ---
    Есть две таблицы, в каждой таблице по два столбца. gifts (id и gift) и users (id и vk).
     
  6. MrFallen

    MrFallen Новичок

    С нами с:
    5 апр 2017
    Сообщения:
    18
    Симпатии:
    0
    Есть две таблицы, в каждой таблице по два столбца. gifts (id и gift) и users (id vk).

    Вот часть кода.
    PHP:
    1. //Алгоритм
    2. if (strcasecmp(mb_strtolower($userMsg), "помощь") == 0) {
    3.     $request_params = array(
    4.         'message' => $help_lang,
    5.         'user_id' => $user_id,
    6.         'access_token' => $token,
    7.         'v' => '5.0'
    8.     );
    9. } elseif (strcasecmp(mb_strtolower($userMsg), "ключ") == 0) {
    10.     $query = "SELECT vk FROM users WHERE vk={$user_id};";
    11.     $result = $mysqli->query($query);
    12.     /* associative and numeric array */
    13.     $row = $result->fetch_array(MYSQLI_BOTH);
    14.     // Проверка выдавали ли бонусный код
    15.     $find = in_array($user_id, $row);
    16.     if (!$find) {
    17.         $key_code_query = "SELECT gift FROM gifts ORDER BY id ASC LIMIT 1;";
    18.         $key_code_select = $mysqli->query($key_code_query);
    19.         $key_code = $key_code_select->fetch_array(MYSQLI_BOTH);
    20.         $key_code_delete_query = "DELETE FROM gifts ORDER BY id ASC LIMIT 1;";
    21.         $key_code_delete = $mysqli->query($key_code_delete_query);
    22.         $users_query = "INSERT INTO users (vk) VALUES ('$user_id')";
    23.         $users_insert = $mysqli->query($users_query);
    24.         $request_params = array(
    25.             'message' => "✔ Ваш ключ: {$key_code[0]}",
    26.             'user_id' => $user_id,
    27.             'access_token' => $token,
    28.             'v' => '5.0'
    29.         );
    30.     /* close connection */
    31.     mysqli_close($db);
    32.     } else {
    33.         $request_params = array(
    34.             'message' => "❗ Вы уже получили ключ за вступление в группу Вконтакте!",
    35.             'user_id' => $user_id,
    36.             'access_token' => $token,
    37.             'v' => '5.0'
    38.         );
    39.     }
    40. } else {
    41.     $request_params = array(
    42.         'message' => "✳ Напиши \"ключ\" чтобы получить ключ за вступление в группу.",
    43.         'user_id' => $user_id,
    44.         'access_token' => $token,
    45.         'v' => '5.0'
    46.     );
     
  7. MrFallen

    MrFallen Новичок

    С нами с:
    5 апр 2017
    Сообщения:
    18
    Симпатии:
    0
    Помогите пожалуйста.
     
  8. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    не понятно с чем именно у тебя трудности
     
  9. MrFallen

    MrFallen Новичок

    С нами с:
    5 апр 2017
    Сообщения:
    18
    Симпатии:
    0
    Прошелся по коду xdebug. Ошибок больше нет, но Бот всё равно отправляет 2 сообщения вместо одного.
    Вот пример того, как должен работать Бот и как работает сейчас (неправильно). Первое и второе сообщения дают правильные ответы, а третье сообщение даёт не правильный ответ. Может быть проблема самого Callback API Вконтакте?
    Посмотреть вложение 1234

    Исправленный код:
    PHP:
    1. //Алгоритм
    2. if (strcasecmp(mb_strtolower($userMsg), "помощь") == 0) {
    3.     $request_params = array(
    4.         'message' => $help_lang,
    5.         'user_id' => $user_id,
    6.         'access_token' => $token,
    7.         'v' => '5.0'
    8.     );
    9. } elseif (strcasecmp(mb_strtolower($userMsg), "ключ") == 0) {  
    10.     $query = "SELECT vk FROM users WHERE vk={$user_id};";
    11.     $result = $mysqli->query($query);
    12.     /* associative and numeric array */
    13.     $row = $result->fetch_array(MYSQLI_BOTH);
    14.     // Проверка выдавали ли бонусный код  
    15.     if (!is_array($row)) {
    16.         $key_code_query = "SELECT gift FROM gifts ORDER BY id ASC LIMIT 1;";
    17.         $key_code_select = $mysqli->query($key_code_query);
    18.         $key_code = $key_code_select->fetch_array(MYSQLI_BOTH);
    19.         $key_code_delete_query = "DELETE FROM gifts ORDER BY id ASC LIMIT 1;";
    20.         $key_code_delete = $mysqli->query($key_code_delete_query);
    21.         $users_query = "INSERT INTO users (vk) VALUES ('$user_id')";
    22.         $users_insert = $mysqli->query($users_query);
    23.         $request_params = array(
    24.             'message' => "✔ Ваш ключ: {$key_code[0]}",
    25.             'user_id' => $user_id,
    26.             'access_token' => $token,
    27.             'v' => '5.0'
    28.         );
    29.     } else {
    30.         $request_params = array(
    31.             'message' => "❗ Вы уже получили ключ за вступление в группу Вконтакте!",
    32.             'user_id' => $user_id,
    33.             'access_token' => $token,
    34.             'v' => '5.0'
    35.         );
    36.     }
    37. } else {
    38.     $request_params = array(
    39.         'message' => "✳ Напиши \"ключ\" чтобы получить ключ за вступление в группу.",
    40.         'user_id' => $user_id,
    41.         'access_token' => $token,
    42.         'v' => '5.0'
    43.     );
    44. }
     
  10. MrFallen

    MrFallen Новичок

    С нами с:
    5 апр 2017
    Сообщения:
    18
    Симпатии:
    0
    В общем, не знаю что магия тут происходит, но теперь всё работает как и должно...
     
  11. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    так бывает
    поздравляю с победой
    идея с двойным дёрганьем колбэка со стороны вк вполне имеет право на жизнь