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

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

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

Спасибо.
  • Вопрос задан
  • 482 просмотра
Подписаться 1 Простой 4 комментария
Решения вопроса 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, чтобы сделить за падениями демона или перезапуском.
Ответ написан
Ваш ответ на вопрос

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

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