Как выполнять задачу каждые 10 секунд в PHP?

Доброго времени суток, друзья. Есть в БД товары с ценами, мне необходимо каждые 10 секунд сверять эти данные с актуальными. Как этот процесс правильно и лучше осуществить в PHP ? Cron ограничивает в 1 минуту, а в распоряжении у меня только Хостинг.

Спасибо.
  • Вопрос задан
  • 398 просмотров
Решения вопроса 1
sergiks
@sergiks Куратор тега PHP
♬♬
Можно установить модуль Swoole PHP, и тогда все прелести таймеров, корутин и асинхронности – к вашим услугам.

Запускается один раз php app.php и процессы висят, работают.

Таймер на 10 секунд:
<?php

function run($timerid, $params) {
    var_dump($timerid);
    var_dump($params);
}

// Каждые 10 секунд выполнять функцию run
Swoole\Timer::tick(10000, "run", ["param1", "param2"]);


MySQL:
// Enable the hook for MySQL: PDO/MySQLi
Co::set(['hook_flags' => SWOOLE_HOOK_TCP]);

// Setup a coroutine context
Co\run(function() {
    // Execute a query inside a coroutine
    go(function () {
        // Already setup the $pdo connection before...
        $statement = $pdo->prepare("SELECT * FROM users LIMIT :limit, :offset");
        $statement->execute(['limit' => $limit, 'offset' => $offset]); 
        $data = $statement->fetchAll();

        // Process $data result...
    });
});


p.s. Swoole ещё умеет быть WebSocket сервером. Сможете потом сделать в реальном времени уведомления об изменении цены, живые графики, чаты )
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 3
ThunderCat
@ThunderCat Куратор тега PHP
{PHP, MySql, HTML, JS, CSS} developer
Кажется вы ставите телегу впереди лошади, впрочем как и многие новички, пытающиеся решить задачу с оповещениями/изменениями через крон/интервал.

присылать уведомление, если цена изменилась более чем на 2%
Во первых откуда берутся изменения? Если у вас они происходят программно - проще во время обновления в бд проверить расхождение с предыдущей ценой, и в случае разницы в эн процентов оповещать всех подписанных на событие клиентов по сокету.
Во первых обновления будут приходить сразу, а не каждые 10 секунд,
во вторых не придется выбирать ВСЕ товары и сверять с каким-то хранимым массивом (его еще и хранить где-то надо чтобы разницу считать),
и в третьих нагрузка при этом на порядки ниже, так как у вас на руках сразу все изменения, и ничего дополнительно выбирать не надо.
Ответ написан
самый простой способ - cron задача каждые 10 минут на выполнение скрипта
Ответ написан
t-alexashka
@t-alexashka
Сразу пишу legacy код
<?php

function job() {
	echo 'JOB...' . PHP_EOL;
}

while(true) {
	job();
	sleep(10);
}


и для удобства контроля поставьте supervisor, чтобы сделить за падениями демона или перезапуском.
Ответ написан
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы
19 апр. 2024, в 20:43
20000 руб./за проект
19 апр. 2024, в 20:11
500 руб./за проект