Зацикливание и автозапуск PHP скрипта при завершении его работы
Многие задаются вопросом - как сделать так, что бы скрипт после завершения работы выполнялся снова и так по кругу и до бесконечности. Причём без необходимости держать открытой вкладку браузера - запустил и он там на сервере тихо себе вертится в loop'е, так сказать, задача - сделать "залупленный" скрипт. :sm2: Давайте разбираться.

Итак, у нас есть обычный говёный хостинг за 100 рублей без доступа к всяким новомодным SSH, Bash и прочей ВПСной приблуде. Иначе мы бы могли не ебаться в телевизор и сделать всё на демонах, ибо статей под это дохрена (полутык).

Мы понимаем, что наш любимый обычный цикличный while сдохнет через 30 секунд, поэтому нужно что-то намудрить.

На ум приходит способ 1:
Заставить скрипт выполняться 59 секунд и дёргать его каждую минуту кроном. За эти 59 секунд в while-цикле будет делаться то, что нам нужно. Пример:

<?php
ini_set('max_execution_time', '59');
set_time_limit(59);
ignore_user_abort(true);
$zbs = 'crabs';
while ($zbs == 'crabs') {
//что-то делаем
}

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

<?php
//тут что-то делаем
exec("wget --delete-after http://".$_SERVER['HTTP_HOST'].$_SERVER['REQUEST_URI']." > /dev/null 2>&1 &"); exit;

Казалось бы, идеально, но хрен, скрипт перестаёт крутить сам себя через минуты 3. Без параметра --delete-after всё отлично работает, скрипт запускает себя конкретно и чётко пока не отключите сайт, чтобы он не смог себя запустить в очередной раз. Но есть одно "но", а именно куча говёных копий исполняемого файла с точками и цифрами в конце, ну и весом в 0 байт. Ибо вгет просто скачивает, например, тот же index.php и у вас в папке будет валяться миллион копий по типу: index.php.2929, index.php.2930 - вы их заебётесь удалять, однако метод рабочий. :sm2: Можно конечно в конце нашего скрипта написать код, который удаляет ссаные копии по маске - хорошая идея. Вот конечный код:

<?php
//тут что-то делаем
$path = 'index.php.*';
foreach (glob($path) as $file){
    @unlink($file);
}
exec("wget http://".$_SERVER['HTTP_HOST'].$_SERVER['REQUEST_URI']." > /dev/null 2>&1 &"); exit;

Итак, всё работает, но опишем ещё способ 3:
Это сокеты. Полный пример тут. Так же полно екзампелов в интернетах. Но мне этот метод не подошёл, так как совсем нихрена никоим образом не хотел работать.

И способ 4:
Суть - ставим на крон задание на каждые 10 сек. Да, так можно, через wget; sleep 10; wget; sleep 10; -  тоесть вгет запрос, точка с запятой, опять вгет запрос и так по кругу. При начале выполнения скрипта создаём файл crabs.lock, в конце выполнения удаляем. Так же при запуске скрипта проверяем, существует ли crabs.lock и если есть, значит скрипт ещё выполняется в другом экземпляре и делаем сразу die;. Соответственно, что если лока нет, то создаём лок, выполняем скрипт и удаляем лок. Конечный код:

<?php
if (file_exists('crabs.lock')) die();
file_put_contents('crabs.lock', 'LOCKED');
//тут что-то делаем
unlink('crabs.lock');
?>

Код крона (в одно задание, все звёздочки, чтобы выполнялся раз в минуту, всё в одну строку, просто для удобства чтения перенёс построчно):
/usr/bin/wget -O /dev/null "https://crabs.money/index.php"; sleep 10; 
/usr/bin/wget -O /dev/null "https://crabs.money/index.php"; sleep 10;
/usr/bin/wget -O /dev/null "https://crabs.money/index.php"; sleep 10;
/usr/bin/wget -O /dev/null "https://crabs.money/index.php"; sleep 10;
/usr/bin/wget -O /dev/null "https://crabs.money/index.php"; sleep 10;
/usr/bin/wget -O /dev/null "https://crabs.money/index.php";

Плюсом создаём файл чекинга старого лока, чтобы он его удалил, если где-то скрипт завис и не удалил за собой лок. И этот файл на крон ежеминутно. Код crabs_checkdate.php:
<?php
if (!file_exists('crabs.lock')) die();
$filedate = filectime('crabs.lock')+30;
if ($filedate<time()) { unlink('crabs.lock'); exit; }

Итог: способ 1 - костыль, способ 2 - может вылететь сам по себе через 5 минут либо час (хуй угадаешь когда) и ничего не будет крутиться, способ 3 - нерабочее говно, способ 4 - пиздатая тема с лок-файлом.

Не забываем про:
Канал в Телеграм: @crabs_channel
Канал магазина: @crabs_money_shop
Чат в Телеграм: @crabsmoney
Группа для реклам: @crabs_ads


Категория: Прочее Кодинг, софт
Рейтинг поста: 1
Дата добавления: 16 июля 2022 в 11:43
Комментариев: 0
Автор: MrCrabs
Рейтинг автора: 198.41
Просмотров всего: 560
Просмотров за неделю: 2
Комментариев нет
Авторизуйтесь для добавления комментария