Выполнение хранимой процедуры в фоновом режиме? - PullRequest
0 голосов
/ 18 мая 2019

как запустить хранимую процедуру mysql за кулисами, не создавая загрузочный веб-сайт, чтобы дождаться окончания процедуры?

DELIMITER $$

USE `simbakda_sensus`$$

DROP PROCEDURE IF EXISTS `info`$$

CREATE DEFINER=`potutu`@`%` PROCEDURE `info`(unit VARCHAR(20))
BEGIN   
    DELETE FROM info WHERE kd_unit=unit;
    INSERT INTO info
    SELECT unit,'a' AS kib ,SUM(a) AS a_sen,SUM(b) AS a_tot,(SUM(b)-SUM(a)) AS a_non FROM (
    SELECT unit,COUNT(*) AS a,'0' AS b FROM trkib_a WHERE kd_unit=unit AND STATUS='1'
    UNION ALL
    SELECT unit,'0' AS a, COUNT(*) AS b FROM trkib_a WHERE kd_unit=unit
    )a
    UNION ALL
    SELECT unit,'b' AS kib ,SUM(a) AS a_sen,SUM(b) AS a_tot,(SUM(b)-SUM(a)) AS a_non FROM (
    SELECT unit,COUNT(*) AS a,'0' AS b FROM trkib_b WHERE kd_unit=unit AND STATUS='1'
    UNION ALL
    SELECT unit,'0' AS a, COUNT(*) AS b FROM trkib_b WHERE kd_unit=unit
    )b
    UNION ALL
    SELECT unit,'c' AS kib ,SUM(a) AS a_sen,SUM(b) AS a_tot,(SUM(b)-SUM(a)) AS a_non FROM (
    SELECT unit,COUNT(*) AS a,'0' AS b FROM trkib_c WHERE kd_unit=unit AND STATUS='1'
    UNION ALL
    SELECT unit,'0' AS a, COUNT(*) AS b FROM trkib_c WHERE kd_unit=unit
    )c
    UNION ALL
    SELECT unit,'d' AS kib ,SUM(a) AS a_sen,SUM(b) AS a_tot,(SUM(b)-SUM(a)) AS a_non FROM (
    SELECT unit,COUNT(*) AS a,'0' AS b FROM trkib_d WHERE kd_unit=unit AND STATUS='1'
    UNION ALL
    SELECT unit,'0' AS a, COUNT(*) AS b FROM trkib_d WHERE kd_unit=unit
    )d
    UNION ALL
    SELECT unit,'e' AS kib ,SUM(a) AS a_sen,SUM(b) AS a_tot,(SUM(b)-SUM(a)) AS a_non FROM (
    SELECT unit,COUNT(*) AS a,'0' AS b FROM trkib_e WHERE kd_unit=unit AND STATUS='1'
    UNION ALL
    SELECT unit,'0' AS a, COUNT(*) AS b FROM trkib_e WHERE kd_unit=unit
    )e
    UNION ALL
    SELECT unit,'f' AS kib ,SUM(a) AS a_sen,SUM(b) AS a_tot,(SUM(b)-SUM(a)) AS a_non FROM (
    SELECT unit,COUNT(*) AS a,'0' AS b FROM trkib_f WHERE kd_unit=unit AND STATUS='1'
    UNION ALL
    SELECT unit,'0' AS a, COUNT(*) AS b FROM trkib_f WHERE kd_unit=unit
    )f;
END$$

DELIMITER ;

1 Ответ

1 голос
/ 18 мая 2019

У вас есть несколько хороших вариантов.

Если вам нужно запустить это по регулярному расписанию (например, каждый час или каждое воскресенье в 03:00 или что-то еще), используйте MySQL Event .(Обратите внимание, что некоторые из этих служб общего хостинга по цене 5 долларов США в месяц не разрешают События на своих серверах MySQL.)

Включите планировщик событий:

SET GLOBAL event_scheduler = ON;

Затем создайте объект события.Он будет жить в вашей базе данных MySQL и работать по расписанию, которое вы ему дали.

CREATE EVENT myevent_01
ON SCHEDULE EVERY 1 HOUR
STARTS CURRENT_TIMESTAMP
DO CALL simbakda_sensus.info;

Другой вариант - одноразовое событие.Та же сделка, но она запускается один раз и исчезает.Вы должны воссоздавать событие каждый раз, когда хотите запустить процедуру.Это чисто «фоновое» выполнение вашей процедуры.

CREATE EVENT run_info_now
ON SCHEDULE AT CURRENT_TIMESTAMP
DO CALL simbakda_sensus.info;

Третий способ:

Создайте небольшую страницу php, которая запускает вашу процедуру.Затем поместите iframe на свою главную веб-страницу и вызовите небольшую страницу.Вы можете сделать небольшую страницу отображения "Информация готова!"или другое сообщение, когда ваш sp завершает работу.

Четвертый способ.

Некоторые серверы linux / FreeBSD / Unix позволяют пользователям настраивать регулярно запланированные события, называемые заданиями cron.Большая тема: читайте об этом здесь. Как создать задание cron с помощью PHP?

Pro tip : создать таблицу журнала.Сделайте так, чтобы каждая процедура обслуживания данных вставляла строку в таблицу при ее запуске, показывая текущее время и другую информацию о процедуре.Я обещаю вам, если ваша система будет активно использоваться, вы будете время от времени просматривать этот журнал, чтобы убедиться, что все работает нормально.

...