Как лучше останавливать скрипт?

123
08 ноября 2019, 08:20

есть скрипт, который необходимо останавливать по клику кнопки отмены.

сейчас для этого я держу в базе запись "cancel 1/0" и во время работы скрипта в цикле дергаю эту запись и проверяю значение cancel.

при старте скрипта устанавливаю cancel 1.

юзер кликает кнопку, cancel меняется с 1 на 0.

если 0, то делаю return и скрипт останавливается.

целесообразен ли этот метод? или лучше присмотреться к каким ниубдь другим вариантам? например файлы-флаги.

Answer 1

Ваш вариант вполне рабочий, но для каждого экземпляра запущенного скрипта будет нужна отдельная запись в базе. Вообще такая запись есть уже в самой ос -- это pid запущенного процесса. Зная pid, в процесс можно послать сигнал, который можно обработать и завершить работу.

Вот например такой скрипт

<?php
pcntl_async_signals(true); // без этого обработчик не заработает
echo getmypid(), "\n";
$term = false;
pcntl_signal(SIGTERM, function() use(&$term) {
    $term = true;
});
while (!$term) {
    echo date("H:i:s\n");
    sleep(5);
}
echo "Bye!\n";

Если его запустить php main.php, то он будет висеть в бесконечном цикле. Если вызвать kill pid, то сработает обработчик и процесс завершится.

В любом случае принцип такой: запущенный скрипт как-то идентифицируется, ему передаётся сообщение о необходимости завершить работу.

Answer 2

сделал файлы-флаги, в которых записан статус работы скрипта

READ ALSO
Не выводится заголовок категории laravel

Не выводится заголовок категории laravel

Выдает ошибку при переходе на роут /catalog/{id}Пытался сделать вывод заголовка соответствующей категории, но видимо что то сделал не так, подскажите...

145
Надо ли активно употреблять memory_order_seq_cst?

Надо ли активно употреблять memory_order_seq_cst?

Модель последовательной согласованности используется по умолчанию в атомарных операцияхОднако, она фактически организовывает работу с атомарными...

157
C, C++ / Обнуление в структуре, указатель+адрес

C, C++ / Обнуление в структуре, указатель+адрес

В с++ в структуре элементам присваивается ноль, а когда я пытаюсь сделать это в си, мне выдает ошибку, как можно исправить/заменить?

159
Как сдвинуть все элементы массива влево на 2?

Как сдвинуть все элементы массива влево на 2?

У меня такая проблема: мне нужно сдвинуть все элементы массива влево на 2То есть если начальный массив {1, 2, 3, 4, 5}, то должно получиться {3, 4, 5, 1, 2}

172